ToDo
Done
Weekly goal
entity 매니저 생성
- 엔티티 매니저 팩토리는 생성 비용이 크므로 애플리케이션 하나당 하나만 생성 되어야 한다
- 엔티티 매니저는 스레드간 공유 x DB 커넥션과 밀접한 관계가 있기 때문이다. 엔티티 매니저가 하는일이 insert나 dml 관련이기 때문
- jpa는 트랜잭션 안에서 데이터 수정이 이뤄져야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생한다
IDENTITY 전략
- 해당 전략은 기본 키 생성을 데이터 베이스에 위임하는 전략이다
- mySql의 auto increment등이 있다
- 이때 DB에 한 번 같다와야지 id값을 알 수 있는데 그렇기 때문에 persist 시 쓰기 지연은 작동하지 않는다
- jdbc3에 추가된 insert되면서 key값을 가져오기에 insert select는 아니다. 한번만 통신한다
AUTO 전략
- auto는 선택한 데이터베이스 방언에 따라 자동으로 선택되는 것이다
- mySql이면 IDENTITY를 사용한다
연관관계의 주인
- 테이블관점에서 보면 외래키는 하나인데 객체연관관계는 2개이다
- 여기서 불일치가 발생하는데 여기서 외래키를 가지고 있는 사람을 연관관계의 주인으로 잡아야한다
- 주인이 아닌 쪽은 mappedBy를 사용한다
- 연관관계의 주인만이 DB 연관관계와 매핑되고 외래키를 관리할 수 있다
- 근데 객체 관점에서 보면 양쪽다 어플리케이션 상에서 참조를 엮어주는 것이 좋다 -> 연관관계 편의 메소드 제공
연관관계 편의메소드 변경
복합키 설정
- 복합키를 사용하려면 id들을 위한 식별자 클래스를 만들어야한다
- IdClass를 이용한다
상속 관계 매핑 (조인 전략)
- 1. 조인 전략은 자식들을 모두 테이블로 변환. 구분 컬럼을 둬서 자식들을 구분한다.
- 장점은 정규화됨. 저장공간을 효율적으로 사용 가능항
- 단점은 조인으로 인해 성능 저하가 있음
- 조회 쿼리 복잡함. 등록 시 insert 2번 나감
상속 관계 매핑 (단일테이블 전략)
- 1. 하나의 테이블에 정보를 다 때려 박고 컬럼 하나로 구분한다
- 장점은 조인이 필요 없으므로 성능이 빠름
- 테이블이 커질 수 있고 이로인해 성능이 느려질 수 있음
- 대부분을 nullable해야함
일대일 비식별 관계
- 비식별 관계에서는 자식만의 id값을 할당해서 사용한다
- 1대1 식별관계에서는 자식테이블이 기본 키 값으로 부모 키 값을 사용할 때가 많은데 이때는 mapsId를 사용한다
레이지 로딩
- inner join이 아닌 left join을 사용한다. 없는 경우도 있으니 그렇다
- 이는 joinColumn에 nallable에 false를 사용하면 innser join을 사용한다
레이지 로딩
- oneToMany는 nullable이어도 left join을 사용한다. 이유는 inner로 했을 경우 팀 자체가 안나올 수 있다
- 컬렉션을 하나이상 즉시 로딩은 join이 많아지기에 성능에 안좋을 수 있음
값 타입
- 값 타입은 순전히 값을 나타내느 것이다
- 100이 200으로 바뀌면 다른 완전히 다른 값이다
- 값 타입은 3가지로 볼 수 있다 (자바 기본 타입, 임베디드 타입, 컬렉션 값 타입)
- 값 타입은 공유해서 쓰지 말자. side effect가 있을 수 있다. 불변객체로 만드는 것이 좋다
- 식별자가 필요하고 지속해서 값을 추적하고 구분하고 변경해야한다면 그것은 값 타입이 아닌 엔티티이다