Spring Boot JPA
Spring DATA JPA를 사용한다.Spring DATA JPA ----> JPA ---> Entity Manager가 포함되어있어서 Entity Manager 객체를 만들어서 사용하지 않아도 된다.
엔티티 매니저도 객체이다. Heap메모리에 올라가 있다.
persist하거나 JQPL,Find(),을 사용하면 1차캐시에 저장된다.
요청을 할때 DB에서 읽어온 데이터는 1차캐시에 저장되어 있다. 같은 요청을 하면 1차 캐시에 데이터가 있는 데이터를 반환한다. 그래서 상황에 따라 LAZY로딩이 더 빠를수도 있다.
엔티티 작업은 트랜잭선 안에서 일어나야 한다.
스프링 부트에서는 @Transactional을 통해 트랜잭션을 관리한다.
엔티티는 SQL을 최대한 늦게 실행하려고 한다. 트랜잭션이 끝날때 실행한다.
실행 순서
1. 영속성을 부여하면 그 순간에 엔티티에 대한 스냅샷이 저장된다.2. 그 상태에서 엔티티에 대한 데이터를 수정한다.
3. 트랜잭션이 종료될 때 스냅샷의 상태와 객체의 상태를 값이 변경된게 있으면 update가 실행된다. 값이 같으면 update가 실행되지 않는다.
4. remove를 실행하면 사라질 객체이기 때문에 중간에 update문이 있어도 생략된다.
엔티티 매핑
1:1 관계는 하나로 합쳐도 되는 관계이다.(성능이나 관리떄문에 나누는 경우도 있다)어디에 FK가 있든지 상관없다 하지만 FK를 가지고 있는 테이블에서 나중에 N관계를 가질 수 있다.
N : N
데이터베이스 에서는 N:N관계는 없다. 데이터베이스에서는 중간에 관계테이블이 있어야 한다.
FK가 있는 엔티티가 주인인다.
@JoinColumn을 적어야 한다. @JoinColumn이 들어가면 단방향 관계이다.
FK에 참조 당하고 있는 엔티티에서 MappedBy옵션은 FK가 있는 엔티티의 정의된것을 이용해서 찾겠다는 뜻이다.
N;1관계에서
@JoinColumn만 사용하는 것은 단방향
MappedBy옵션까지 사용하면 양방향 참조다.
N:N관계에서
@JoinTable를 사용한다.
cascade옵션은 참조하고 있는 엔티티도 같이 영속성을 부여하는 것이다.
단방향
한쪽에서만 참조한다.
양방향
서로가 서로를 참조한다.
fetch조인은 한번에 쿼리를 실행하지만 중복된 데이터가 나올수 있어서 중복된 데이터를 없애는 distinct 를 사용한다.
내부적인 구현보다는 논리적인 구조에 대해 이해하자.
다른사람의 소스코드에서 메소드안의 코딩 보다는 클래스,인터페이스의 대한 관계(설계)를 보자
0 개의 댓글:
댓글 쓰기