JPA- 1. 연관관계 매핑 기초

roon-replica·2022년 8월 1일
0

JPA

목록 보기
1/5
  • 참고 자료
    JPA 프로그래밍(김영한)

개요

  • 객체는 참조(주소값)을 이용해 관계를 맺고, 테이블은 외래 키를 사용해서 관계를 맺는다고 함

  • 객체의 참조와 테이블의 외래 키를 매핑하는 것

  • ORM은 객체와 RDB 둘 다 중요하다고 함..

  • 연관관계 매핑 관련 핵심 개념

    • 방향성
      단방향 / 양방향

    • 다중성
      ex) 회원:팀

    • 주인
      객체가 테이블처럼 양방향 연관관계가 되면, 연관관계의 주인을 정해야 한다고 함.

객체 vs 테이블 연관관계

  • 회원과 팀 예시

    1. 객체
      member.team으로 team을 알 수 있지만 team은 member를 알 수 없음.
      즉, 단방향임

    2. 테이블
      외래 키로 조인하는 방식이라 member join team이나 team join member, 어떤 방향으로든 관계를 맺을 수 있음.

  • 이처럼 객체의 연관관계는 단방향임.
    객체도 테이블처럼 양방향 연관관계로 만들고 싶으면 관계를 맺을 수 없는 방향으로도 참조 가능하도록 만들어줘야 함.
    2개의 단방향 관계를 이용해 양방향 관계로 만드는 것.

객체와 테이블 매핑하기

class Member{
  ...
  
  @ManyToOne	// 다중성 정보
  @JoinColumn(name="TEAM_ID")	// 외래 키 매핑
  private Team team;
  
  // 객체였다면 관계에 방향성이 생기는데 이렇게 테이블에서처럼 외래 키 정보를 이용하면
  // 테이블에서처럼 JOIN 하듯이 방향성 문제는 사라지겠지
  
  ...
}
class Team{
  ...
  // 양방향 매핑 사용하려면 추가해야 되는 설정.
  // 다중성 정보. mappedBy 속성은 양방향 매핑일 때 사용. 
  // mappedBy 속성은 연관관계 주인이 아님을 설정..
  // 반대편 매핑의 필드 이름을 설정해주면 된다고 함..
  @OneToMany(mappedBy = "team")	
  private List<Member> members = new ArrayList<>();
  
  ...
}

연관관계가 있는 엔티티에 대한 CRUD

  • 저장
    회원,팀(다대일 관계)을 저장할 때 JoinColumn에 명시된 외래키를 이용해서 저장 SQL을 생성한다고 함
  • 조회

    • 객체 그래프 탐색..
    • 객체지향쿼리(JPQL)
  • 수정

    • 명시적으로 update 안 해도 트랜잭션을 커밋할 때 플러시가 발생하여 변경 감지가 동작한다고 함..
      그리고 감지된 변경 내용은 DB에 자동으로 반영됨..

양방향 연관관계, 연관관계의 주인

  • 연관관계의 주인(owner)
    양방향 연관관계는 단방향 연관관계 2개.
    2개 중 어떤 관계가 외래 키를 관리하게 할 지 정해줘야 함.
    그래서 연관관계의 주인 개념이 필요함!
    즉, 외래 키 관리자를 선택하는 거라 생각하면 된다고 함!
    그리고 테이블에 외래 키 가 있는 곳을 연관관계 주인으로 정하면 된다고 함..!
    또 외래 키가 있는 테이블은 다대일 관계에서 '다' 쪽이라 보면 될 듯

    JPA는 연관관계 엔티티에 대한 SQL을 처리할 때 외래 키를 이용하고,연관관계의 주인이 외래 키를 관리하니까
    연관관계의 주인만 SQL을 자유롭게 생성할 수 있는 듯.
    주인이 아닌쪽도 읽기는 가능하다고 함!
    연관관계 주인만 DB에 영향을 미칠 수 있다고, 외래 키를 바꿀 수 있다고 생각하면 될 듯!

  • 양방향 연관관계는 양쪽 방향 모두에 값을 입력해주는게 안전하다고 함

    class Member{
     private Team team;
     
     public void setTeam(Team team){
       this.team = team; // 꼭 필요!
       team.getMembers().add(this); // 객체 관점에서 필요 
     }
     ...
    }

의문점

  • 객체 그래프 탐색이라는게 자주 쓰이나?

  • 연관된 엔티티 삭제할 때 외래키 제약조건때문에 문제 발생하는거 맞나?
    스프링 JPA에서는 발생안했던거 같은데.. 확인 필요

  • 연관관계 주인이 아닌 쪽이 읽기는 가능한 이유는?

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글