본문 바로가기
Study/우아한 테크 캠프 Pro

우아한 테크 캠프 PRO, 2주차 JPA

반응형

우아한 테크 캠프 PRO, 2주차 과제 - JPA


코스에서 소개된 내용만 간단하게 포스팅하겠습니다. JPA 자세한 내용은 다른 탭에서!!

JPA 등장 배경

  • 객체를 중심의 패러다임(객체 지향)과 테이블 중심의 패러다임은 차이가 있다.

객체 지향 패러다임

  • 시스템을 구성하는 객체들에게 적절한 책임을 할당하는 것
  • 상속
    • 테이블은 상속 관계가 없다.
  • 연관 관계
    • 객체의 연관관계에는 방향성이 있다.
    • 테이블의 연관관계는 방향성이 없다.
    • 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.

 

  • SQL을 직접 다루게 되면 불편함이 생긴다.
    • 반복적인 작업 ( 새로운 컬럼 추가등의 행위 발생시 관련된 모든 SQL을 수정 )
    • 개발자들이 매핑된 엔티티를 신뢰할 수 없다. (런타임시, mapping되는 타이밍에 오류가 잡히므로)



JPA 사용시 유의사항

  • 일대다 단반향 매핑의 단점
    • 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다.
    • 연관 관계 처리를 위한 UPDATE SQL을 추가로 실행해야 한다.
    • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 권장한다.

 

  • Auditing
    • 정해진 엔티티를 생성하거나 변경한 사람, 생성되거나 변경된 시점을 추적하기 위해 제공되는 기능
    • Spring Data JPA가 구현해놓은 AuditingEntityListener를 통해 동작한다.

 

  • 연관관계 매핑시 주의사항
@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
반응형