반응형
우아한 테크 캠프 PRO, 2주차 과제 - JPA
코스에서 소개된 내용만 간단하게 포스팅하겠습니다. JPA 자세한 내용은 다른 탭에서!!
JPA 등장 배경
- 객체를 중심의 패러다임(객체 지향)과 테이블 중심의 패러다임은 차이가 있다.
객체 지향 패러다임
- 시스템을 구성하는 객체들에게 적절한 책임을 할당하는 것
- 상속
- 테이블은 상속 관계가 없다.
- 연관 관계
- 객체의 연관관계에는 방향성이 있다.
- 테이블의 연관관계는 방향성이 없다.
- 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
- SQL을 직접 다루게 되면 불편함이 생긴다.
- 반복적인 작업 ( 새로운 컬럼 추가등의 행위 발생시 관련된 모든 SQL을 수정 )
- 개발자들이 매핑된 엔티티를 신뢰할 수 없다. (런타임시, mapping되는 타이밍에 오류가 잡히므로)
JPA 사용시 유의사항
- 일대다 단반향 매핑의 단점
- 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다.
- 연관 관계 처리를 위한 UPDATE SQL을 추가로 실행해야 한다.
- 일대다 단방향 매핑보다는 다대일 양방향 매핑을 권장한다.
- Auditing
- 정해진 엔티티를 생성하거나 변경한 사람, 생성되거나 변경된 시점을 추적하기 위해 제공되는 기능
- Spring Data JPA가 구현해놓은
AuditingEntityListener
를 통해 동작한다.- @PrePersist, @PreUpdate가 붙은 메서드를 통해 엔티티가 영속화 되기전에 동작한다.
- Spring-data reference - Auditing
- 참고 자료 - Auditing
- 연관관계 매핑시 주의사항
@Test
void save() {
Member member = new Member(1L, "jason"); // (1)
Station sourceStation = stations.save(new Station("잠실역")); // (2)
Station destinationStation = stations.save(new Station("몽촌토성역")); // (3)
Favorite favorite = new Favorite(sourceStation, destinationStation); // (4)
member.addFavorite(favorite);
System.out.println("### before merge");
Member savedMember = members.save(member); // (5)
System.out.println("### after merge");
System.out.println("### before transaction commit");
members.flush(); // transaction commit (6)
System.out.println("### after transaction commit");
}
- 위 코드의 문제점은?
saveMember의 favorite에는 아무것도 저장되지 않는다.
- 영속성 컨텍스트에 member에 추가된 Favoirte이 없으니 member가 영속화될때 저장되지 않는다.
- 엔티티의 식별자가 null이 아닌 경우 persist()가 아닌 merge()가 동작하며 이때 전달 인자인 entity가 아닌 새로운 인스턴스가 반환된다.
- 해결책
- 식별자가 존재하는 엔티티(member)인 경우 먼저 영속(managed) 상태로 만든 후 비즈니스 로직을 수행한다.
- favorite를 영속(managed) 상태로 만든다.
- CascadeType.MERGE를 사용한다.
미션 진행 회고
- JPA 공부를 좀 더 해야겠다! (인프런 강의 다 듣자!)
피드백
- OneToMany 기본 fetch는 LAZY
- ManyToOne 기본 fetch는 EAGAR
728x90
반응형
'Study > 우아한 테크 캠프 Pro' 카테고리의 다른 글
우아한 테크 캠프 PRO, 6주차 서비스 진단하기 (0) | 2021.08.07 |
---|---|
우아한 테크 캠프 PRO, 5주차 인수 테스트 기반 TDD (0) | 2021.08.07 |
우아한 테크 캠프 PRO, 4주차 그럴듯한 서비스 만들기 (0) | 2021.08.07 |
우아한 테크 캠프 PRO, 3주차 인수 테스트 주도 개발 (0) | 2021.08.07 |
우아한 테크 캠프 PRO, 1주차 로또 TDD 회고 (0) | 2021.08.07 |