최범균님의 유튜브 강의를 들으면서 마지막에 나오는 정리 부분을 텍스트로 정리해 보았다.
강의 내용 참고나 키워드를 보면서 공부를 진행하면 좋을 것 같다.
https://www.youtube.com/playlist?list=PLwouWTPuIjUi9Sih9mEci4Rqhz1VqiQXX
기본 구조
- EntityManagerFactory 초기화
- DB 작업이 필요할 때마다
- EntityManager 생성
- EntityManager로 DB조작
- EntityTransaction으로 트랜잭션 관리
- 스프링과 연동할 때는 대부분 스프링이 대신 처리하므로 매핑 설정 중심으로 작엄
영속 컨택스트
- 엔티티를 메모리에 보관
- 변경을 추적해서 트랜잭션 커밋 시점에 DB에 반영
JPA CRUD
- EntityManager 를 사용해서 엔티티 단위로 CRUD처리
- 변경은 트랜잭션 범위 안에서 실행
- persist()
- 수정
- remove()
엔티티 매핑
- 기본 어노테이션
- @Entity
- @Table
- @Id
- @Column
- @Enumerated
- @Temporal
- @Basic
@Embeddable
- @Embeddable 을 사용하면 모델을 더 잘 표현할 수 있음
- 개별 속성을 모아서 이해 -> 타입으로 더 쉽게 이해
- (addr1, addr2, zipcode) 를 모아서 주소 파악 -> address 하나만 보고 주소 파악
- 개별 속성을 모아서 이해 -> 타입으로 더 쉽게 이해
- 방법 1 : @SecondaryTable + 테이블명
- 다른 테이블에 저장된 데이터를 @Embeddable로 매핑 가능
- 다른 테이블에 저장된 데이터가 개념적으로 밸류(값)일 때 사용
- 1-1 관계인 두 테이블을 매핑할 때 종종 출현
- 방법 2 : @SecondaryTable + @AttributeOverride
값 콜렉션 Set
- 콜렉션 테이블을 이용한 값 Set 매핑
- @ElementCollection과 @CollectionTable이면 끝
- @ElementCollection(fetch = FetchType.LAZY) : LAZY가 기본값
- @ElementCollection(fetch = FetchType.EAGER)
- 주의사항
- 성능 문제 -> CQRS (Command Query Responsibility Seg)
- 변경기능을 위한 모델과 조회 기능을 윙한 모델을 분리
- 변경 기능 - JPA 활용
- 조회 기능 - Mybatis/JdbcTemplate/JPA 중 알맞은 기술 사용
- 모든 기능을 JPA로 구현할 필요 없음
- JPA로 다 하겠다는 생각 하지 말기
- 명령 모델(상태 변경)과 조회 모델을 구분하면 좋음
영속 컨텍스트
- JPA는 영속 엔티티(객체)를 영속 켄텏트에 담아 변경 추적
- 트랜잭션 커밋 시점에 변경 반영
- 대량 변경은 굳이 JPA로 할 필요 없음
- (배치류에는)직접 쿼리가 나음
- 분리된 상태는 변경을 추적하지 않음
엔티티 연관 매핑
- 1-1 연관 단방향, N-1 단방향, 1-N 단방향, 양방향, M-N 연관
- 양방향, M-N 은 거의 사용 안함
- 이유1. 벨류(Embeddable타입)로 매핑
- 이유2. 조회는 쿼리 직접 사용할 때가 많음
엔티티 연관 고려사항
- 연관 대신에 ID값으로 참조 고려
- 객체 탐색이 쉽다고 연관 쓰기 없기
- 조회는 전용 쿼리나 구현 사용 고려 (CQRS)
- 엔티티가 아닌 벨류인지 확인
- 1-1, 1-N 관계에서 특히
- 1-N보다는 N-1 (어쩔 수 없이 사용해야 한다면)
- 양방향은 쓰지말자
반응형
'백엔드 > Spring' 카테고리의 다른 글
[JPA] Optional (0) | 2022.09.14 |
---|---|
[JPA] @Embedded, @Embeddable (0) | 2022.09.14 |
[java] BigDecimal 사칙연산(더하기, 빼기, 나누기, 곱하기), 비교(compareTo) (0) | 2022.05.16 |
[java] BigDecimal error : Non-terminating decimal expansion; no exact representable decimal result. (0) | 2022.05.15 |
Connection Factory (0) | 2022.05.13 |