데이터 중심 설계의 문제점
위 엔티티 설계대로 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의 기본키를 꺼내고, 그것을 외래키로 사용한다.
'Spring > JPA' 카테고리의 다른 글
[JPA] 다양한 연관 관계 매핑 (0) | 2021.03.07 |
---|---|
[JPA] *중요* 양방향 연관관계와 연관관계의 주인 (0) | 2021.03.07 |
[JPA] 아주 간단한 쇼핑몰 만들기 (0) | 2021.03.06 |
[JPA] 엔티티 매핑 (0) | 2021.03.06 |
[JPA] 영속성 컨텍스트 (0) | 2021.03.06 |
댓글