728x90
반응형
✅ 연관관계 매핑의 필요성
- 모델링의 두 방식의 차이점을 비교하며 연관관계의 필요성을 알아보자.
✅ 테이블 중심 모델링
![Untitled]
- 테이블 연관관계에 맞추어 객체를 모델링 해보자
🌱 엔티티 매핑
참조 대신에 외래키를 그대로 사용하여 다음과 같이
Member
와Team
을 작성할 수 있다.@Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private Long teamId; ... } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; ... }
🌱 엔티티 다루기
위와 같이 작성하게 되면, 실제로 엔티티를 다룰 때 아래와 같이 다루게 된다.
// 팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); //회원 저장 Member member = new Member(); member.setName("member1"); member.setTeamId(team.getId()); em.persist(member); //조회 Member findMember = em.find(Member.class, member.getId()); //연관관계가 없음 Team findTeam = em.find(Team.class, team.getId());
저장한
Member
와Team
에 대해 연관관계가 존재하지 않는다.그러므로
findMember
의team
을 찾을 방법이 없다.그저 이전에 생성한
team
객체의team.getId()
를 통해 식별자로 다시 조회한다.객체지향적인 방법이 아니다. 객체간의 관계를 코드로 풀어낼 수 없기 때문이다.
- 객체가 행동을 하지 않고,
getter
를 사용한 식별자로 엔티티를 조회한다.
- 객체가 행동을 하지 않고,
🌱 테이블 중심 모델링의 한계
- 테이블의 컬럼을 중심으로 객체를 모델링하게 되면, 협력 관계를 만들 수 없다.
- 테이블 : 외래 키로 조인을 사용하여 연관된 테이블을 찾는다.
- 객체 : 참조를 이용하여 연관된 객체를 찾는다.
- 이런 간극을 극복해낼 방법 → 연관 관계
✅ 객체 지향 모델링
- 객체의 연관관계를 바탕으로 모델링해보자.
- 테이블 중심 모델링과 다른 점은,
teamId
→Team team
🌱 엔티티 매핑
기존에 썼던 teamId를 주석 처리하고,
Team
컬럼을 삽입하자.@Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; // @Column(name = "TEAM_ID") // private Long teamId; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ... }
🌱 엔티티 다루기
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
팀을 생성하고 영속성 컨텍스트에 저장한다.
그리고 회원을 저장할 때,
setter
를 이용하여team
을 설정한다.- 이 때, 식별자를 저장하지 않고 객체 자체를 통해 set하는 모습이 차이점이다.
저장한 엔티티를 조회하자
//조회 Member findMember = em.find(Member.class, member.getId()); //참조를 사용해서 연관관계 조회 Team findTeam = findMember.getTeam();
여기서 확연한 차이를 볼 수 있다.
기존에는
findMember
에서 조회하지 않고 다시 영속성 컨텍스트 내부를 찾아보아야 했다.em.find(Team.class, …)
하지만 객체간의 연관관계를 구성해놨기에, 조회한
findMember
에서 손 쉽게team
을 꺼낼 수 있다.이렇게 객체의 참조적 연관성을 설정해주는 것을 단방향 연관관계라 한다.
Ref
김영한 강사님, JPA 프로그래밍 - 기본편
감사합니다.
728x90
반응형
'Dev > Spring' 카테고리의 다른 글
연관관계 매핑(양방향) (0) | 2023.11.21 |
---|---|
변경 감지(Dirty Checking) (0) | 2023.11.20 |
JPA를 왜 쓸까? (0) | 2023.11.20 |
영속성 컨텍스트란 (0) | 2023.11.20 |
준영속과 변경감지 (0) | 2023.10.25 |