본문 바로가기

웹 프로그래밍/JPA

연관관계 매핑 기초

연관관계가 필요한 이유

-객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계를 만들수 없음

-테이블은 외래키로 JOIN을 사용해서 연관된 테이블을 찾는데 객체는 참조를 사용해서 연관관계를 찾음

-단방향 연관관계 지향(가급적 좋음)

-객체 지향 모델링(연관관계 매핑(@JoinColumn))

 

양방향 연관관계(반대 방향으로 객체 그래프 탐색)

-테이블은 외래키로 다 조인할수 있음

-객체는 둘다 클래스 속성으로 가지고 있어야함

 

 

연관관계의 주인과 mappedBy

-객체와 테이블의 연관관계 차이

-객체는 단반향이 두개

-테이블은 양뱡향 한개(외래키 조인)

-둘중 하나로 외래 키를 관리해야함(외래키는 멤버객체를보고 바꿔야하나 팀 객체를 보고 바꿔야하나)

 

연관관계의 주인(Owner)

-객체의 두관계중 하나를 연관관계의 주인으로 지정

-연관관계 주인만이 외래 키를 관리(등록,수정)

-주인이 아닌 아닌쪽은 읽기만 가능

-주인은 mappedBy 속성 사용 X

-주인이 아니면 mappedBy 속성으로 주인 지정

 

누구를 주인으로?

-외래 키가 있는곳을 주인으로 정할것: 관례(그래야 헷갈리지 않음), 다대일(N:1)이면 다(N)에 포커스

-비지니스적으로 중요한것과는 별개고 테이블로 따지는것임(e.g. 바퀴(N)와 자동차(1)면 바퀴가 주인)

 

-양방향 매핑시 가장 많이 하는 실수: 연관관계 주인객체에 값을 입력하지 않고 읽기전용 객체(mappedBy)에 넣음

-객체지향적으로 그냥 양쪽에 다 넣는것이 좋음

-연관관계 편의 메서드를 만드는게 좋음(세터같은 메서드에서 해결): 주의, 기준하나를 선택

-양방향 매핑시에 무한루프 조심(컨트롤러에서 절대 엔티티 반환하지 말것)

    -toString(),lombok 등

 

정리

-단방향 매핑만으로도 이미 연관관계 매핑은 완료(설계시 양방향 지양)

-양방향 매핑은 반대방향으로 조회기능만이 추가된것뿐

-JPQL에서 반대방향으로 탐색할 일이 많긴함

-단방향 매핑을 잘하고 양방향은 필요할때 추가하는 식(어차피 테이블에 영향을 주지않음)

'웹 프로그래밍 > JPA' 카테고리의 다른 글

프록시  (1) 2023.03.04
고급 매핑  (0) 2023.03.04
엔티티 매핑  (0) 2023.03.02
영속성 관리  (0) 2023.02.28
JPA(Java Persisitence API)  (0) 2023.02.28