본문 바로가기
Spring/JPA

[JPA] 연관관계 매핑 - 단방향 연관관계 ( 객체지향적으로 설계하는 방법 )

by 김긍수 2021. 3. 6.

데이터 중심 설계의 문제점

위 엔티티 설계대로 Domain class를 작성하면 Order클래스에 private Long memberId; 로 작성하게 된다.

 

  • 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식이다.
  • 테이블의 외래키를 객체에 그대로 가져왔다.
  • 객체 그래프 탐색이 불가능하다
  • 참조가 없으므로 UML도 잘못되었다.

위에 쓴대로 사용한다면 주문한 회원정보를 찾아야할때 아래 코드로 찾아야한다.

Order order = em.find(Order.class, 101L);
Long memberId = order.getMemberId();
Member member = em.find(Member.class, memberId);

 이건 조금 객체지향적이지 않은 방법이고 객체를 관계형DB에 맞춘거라고 할 수 있다.

우리는 Order.class를 작성할 때 private Member member; 로 작성하여 객체로 참조될때 참조된 걸 찾을 수 있게 해야한다. 주문한 회원정보를 찾아야할 때, 아래처럼 사용하는 것이 좋다. 

Order order = em.find(Order.class, 101L);
Member member = order.getMember();
member.getId(); //

 


연관관계 매핑

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

 

객체의 참조와 테이블의 외래 키를 매핑

 

연관관계가 필요한 이유

예제시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다. (n:1)

 

객체를 테이블에 맞추어 모델링

연관관계가 없는 객체

 

> 객체에는 연관관계가 없다. DB에 맞춘다면 키를 그대로 받아오게 된다.

 

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

(이 글 맨 위 문제점을 참고)

  • 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다.
  • 객체는 참조를 사용해서 연관된 객체를 찾는다.
  • 테이블과 객체 사이에는 이러한 큰 간격이 있다!!!!

 

1. 단방향 연관관계

객체지향스러운 모델링은 어떤 것일까?

객체지향스러운 모델링은 Team의 ID가 아니라 참조 그대로 가져오는 것이다.

이걸 도메인 클래스에서 어노테이션을 작성하는 경우에 다대다,일대일 등 관계가 아주 중요하다.

DB관점에서 Member가 n이고 Team이 1이다.

그러므로 어노테이션을 작성해줄 때, 멤버 입장에서 ManyToOne이라고 작성해야한다.

//Member.class

@ManyToOne
private Team team

그 후, DB안에 MEMBER테이블의 TEAM_ID와 위를 맵핑시켜주어야한다.

//Member.class

@ManyToOne
@JoinColumn(name = "TEAM_ID") //조인
private Team team

어노테이션으로 관계가 뭔지(= @ManyToOne), 이 관계를 조인하는 컬럼(= @JoinColumn)이 뭔지를 적어주는 것이다.

 

객체지향모델링 (ORM매핑)

Team과 TEAM_ID 를 연관관계 매핑.

 

//저장
Team team = new Team("");
team.setName("마마무");
em.persist(team);

Member member = new Member();
member.setUserName("김솔라");
member.setTeam(team); // JPA가 알아서 team의 기본키를 꺼내고, 그것을 외래키로 사용한다.

댓글