소프트 딜리트를 구현하다 보면 테이블의 칼럼을 하나 추가해서 상태값으로 삭제인지, 아닌지를 판별한다. 예를 들어서 Archive라는 테이블이 삭제되면 visibility라는 칼럼의 true / false 상태로 이를 구분한다. 이후 전체조회를 할 때 삭제된 레코드들은 SELECT 하면 안 되므로, visibility=true 조건을 WHERE 조건에 걸어줘야 할 것이다. 도메인이 많아질수록, 소프트 딜리트를 구현한 테이블에 전체 조회 로직이 많을 수록 쿼리는 점점 길어질 것이다. # 해결방법 엔티티 클래스에 @Where 어노테이션을 달아주면, 조회를 할 때 해당 조건을 타고 가져오게 된다. clause 부분에 WHERE 조건을 탈 조건문을 문자열로 넣어주면된다. 나는 Visibility라는 클래스로 변수..
Redis는 인메모리 데이터 key-value 저장소로, 모든 데이터를 메모리에 관리해서 매우 빠른 성능을 자랑하는 NoSQL 데이터베이스다. 나는 "인 메모리"라는 점에서 의문점이 생겼다. 즉, Redis에 저장된 데이터는 Redis 서버가 다운되면 사라지는가? 로컬로 key를 저장하고 재부팅 후 데이터를 조회하면 남아있는 걸 발견했다. 그래서 의문점이 생겨서 교수님께 질의응답을 진행한 내용을 공유하고자 한다. 결론부터 말하자면, "그렇지 않다" Redis 서버가 다운되더라도 데이터는 보존된다. 이는 Redis Persistance와 연관이 있다. 이와 관련한 질의응답 내용은 아래와 같다. 결국 Redis의 시작은 완전한 인 메모리 DB에서 시작됐지만, 사용자의 니즈에 따라 변화된거로 이해하면 될 것 ..
Chapter 18: Concurrency Control (Database System Concepts 7th Edition)을 공부하며 정리한 글입니다. # 동시성 제어란? 동시에 여러 트랜잭션을 처리할 때 데이터의 일관성을 해치지 않도록 관리하는 방법 (여러 쓰레드가 공유 자원에 접근 시 Race Condition이 발생해서 이를 핸들 해줘야 하는 것과 동일) 비슷한 맥락으로 DB 역시 Lock을 거는 방법으로 동시성 문제를 해결한다. # Lock-Based Protocols DB Lock에는 두 가지 종류가 있다. 배타 잠금(Exclusive Lock) - 읽기/쓰기를 위한 잠금, X-Lock이라고 한다. 공유 잠금(Shared Lock) - 읽기를 위한 잠금, S-Lock이라고 한다. 트랜잭션은 ..
Chapter 17: Transactions (Database System Conceptys 7th Edition) 을 공부하고 정리한 글 입니다. # 트랜잭션 이란? Single logical unit of work 데이터베이스 운영상 하나로 묶여야할 로직들을 모은 것 ex. 은행 송금 예시 (A가 B에게 10불을 송금한다.) 1. A의 잔액에서 10불을 차감한다. 2. B의 잔액에 10불을 더한다. "송금"로직에서 이 두 과정은 하나의 논리적인 작업으로 묶여야 하고, 1,2 과정 중 하나만 반영되거나 그래선 안 됨 # 트랜잭션의 특징 - ACID 원칙 앞선 송금 예시처럼 트랜잭션은 다음 네 가지 원칙 지켜야한다. Atomicity 트랜잭션은 한번에 반영되거나 전체 반영되지 않아야 한다. (All or..
문득 MySQL에서 진짜 데이터를 어디에, 어떻게 저장하는지 궁금해서 찾아봤다. MySQL 데이터 저장 위치 조회 SQL로 show variables like 'datadir'; 을 입력하면 value로 MySQL 데이터가 어떤 위치에 저장되고 있는지 보여준다. 그냥 경로를 확인하고 싶어서 로컬 MySQL로 확인했다. 데이터가 저장되는 방식 해당 위치로 이동해보면 스키마와 동일한 폴더가 하나 있고, 폴더 내부에는 .ibd 확장자 파일의 엔티티들이 존재하는걸 확인할 수 있다. 찾아보니 이런 뜻이라고 한다. 결국 MySQL 데이터도 파일 형태로 저장되는 것을 확인할 수 있었다. MySQL Server가 해당 데이터를 관리하면서 Workbench같은 GUI를 통해 사용자 인터페이스를 제공하는 구조다.
데이터베이스 개념은 매우 딥하지만, 백엔드 개발을 막 시작하여 프로젝트에 투입되어야 하는데 DB에 대한 지식이 별로 없을때 도움이 될 수 있도록 작성한 글이다. 데이터베이스(DB)란? "많은 기능을 해주는 고성능의" 엑셀 이다. 데이터베이스는 말 그대로 데이터를 저장하는 공간을 말한다. 여러분들이 쇼핑몰을 운영한다고 가정해보자. 쇼핑몰에 회원이 가입했고, 회원정보 (이름, 나이)를 저장해야하는데 어디다 저장할 것인가? 메모장에 적어놔도 되지만, 보통 이럴땐 데이터베이스에 정보를 저장한다. DBMS (Database Management System) 데이터베이스를 관리해주는 소프트웨어 우리가 흔히 말하는 DB는 이 DBMS를 말하는 것이다. DBMS는 사용자와 DB간의 소통의 창구 역할을 하는 중간 다리 ..
# 서론 JPA와 MySQL 디비를 사용하면서 궁금했던 hibernate_sequence 테이블에 대하여 정리한다. # hibernate_sequence 의 정체 이 테이블의 정체는 칼럼값으로 예측 가능하듯, 디비의 PK를 생성해주는 테이블이다. 엔티티 제작시 @GenerateValue를 그냥 아무 값을 넣지 않으면, 생성 전략이 AUTO 로 설정된다. 이러면 hibernate_sequence 테이블이 생기고, 여기서 값을 하나씩 읽어가면서 PK를 생성한다. MySQL은 디비 내부적으로 auto increment를 지원하므로, 순서 기록용 테이블을 사용할 필요가 없다. @GenerateValue 전략을 IDENTITY로 설정하면 된다. 이렇게 하면 전역적으로 통용되던 PK 순서도 테이블 독립적으로 변경된..