아래 코드에서 어떤 값을 출력하고 어떤 쿼리를 전송할까?
Member member = new Member();
member.setUsername("gun");
em.persist(member);
System.out.println(member.getUsername());
em.remove(member);
System.out.println(member.getUsername());
em.flush();
System.out.println(member.getUsername());
여기서 출력은 당연히 Member라는 객체에서 가져오기 때문에 gun이 다 찍히게 되고 쿼리는 member를 persist한 순간 insert 쿼리가 하나 저장되고 flush한 순간 dirty checking을 통해 member가 삭제됨을 알고 delete 쿼리가 하나 저장된다.
영속성 컨텍스트는 한 트랜잭션 내에서 동일 엔티티를 조회시 ‘항상 서로 동일함’을 보장한다고 합니다. 이는 트랜잭션 격리 수준 중 하나인 REPEATABLE READ를 의미하는데요. MySQL의 InnoDB 스토리지 엔진은 해당 격리수준을 제공하고 있습니다. 해당 격리수준은 MySQL의 어떤 특징(기능)으로 인해 제공되고 있을 까요?
MVCC 기능 이라 하고 이는 undo 로그로 구현을 한다.
commit 은 데이터 베이스에 변경 사항을 저장, flush 는 변경사항을 즉시 데이터베이스에 반영한다고 하는데, 저장과 반영에 차이가 있는지, commit() 과 flush()의 차이점이 무엇인가요?
flush는 쿼리를 전송하는 역할이다. 즉, 롤백이 가능하다.
commit은 내부적으로 flush를 수행한 뒤 트랜잭션을 끝내는 역할
sequence 전략은 동시성 문제가 없다고 합니다. 이 전략은 데이터베이스에서 유일한 순번을 제공하여 여러개의 요청이 동시에 들어와도 시퀀스는 하나의 값을 증가시킨다고 하는데, 각 요청에 고유한 하나의 값만 증가를 하는 방법이 따로 있나요?
각 요청에 따라 하나의 값만 증가하는 방법이 따로 있는 건 아닌 거 같습니다
EntityRepository.findById()를 사용해서 엔티티를 가져오고 , SQL문으로 직접 데이터베이스에 해당 엔티티를 업데이트를 한 다음 , EntityRepository.findById()를 했을때 영속성 컨텍스트에서 동일성 보장이 지켜지나요?
업데이트를 했기 때문에 동일성 보장은 안되는 것 같습니다.
엔티티의 생명 주기에서 비영속 상태와 준영속 상태는 둘 다 영속 상태가 아니지만 영속성 컨텍스트에 의해 관리된 적이 있는지, 없는지로 구분됩니다. 이 두 가지 상태를 구분해놓은 이유는 무엇인가요? 이렇게 구분했을 때, 어떤 장점 같은 것이 있는 걸까요?
식별자 값이 있는 것 차이인 거 같다.
테이블의 기본키로 UUID를 사용했을 때의 장, 단점을 이야기해주세요.
이점
- 데이터베이스가 여러 개인 경우에도 하나의 UUID는 여러 데이터베이스 중에서도 고유한 값이다.
- 데이터에 대한 정보를 노출하지 않기 때문에 보안상 안전함
단점
- increment pk보다 더 많은 저장 장소를 필요로 한다.(UUID - 128bits)