728x90
들어가기전에...용어 설명
방향: 단방향, 양방향
다중성: 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
연관관계의 주인: 객체 양방향 연관관계는 관리 주인이 필요
이 글에서는 간단히 회원-팀 예제를 통해 연관관계의 기초를 이해해보자.
예제 시나리오는 다음과 같다.
1. 회원과 팀이 있음
2. 회원은 하나의 팀에만 소속.
3. 회원과 팀은 다대일 관계.
일단 연관관계가 없는 객체를 먼저 알아보자.
테이블에 맞춰 객체를 아래와 같이 모델링 하였다.
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String name;
@Column(name="TEAM_ID")
private String teamId;
...
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
}
팀 저장 및 회원 저장 코드
해당 코드는 객체지향적인 코드가 아니다. teamId를 불러오기 때문
연관관계가 없어서 그러니 일단 넘어가자.
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());
위 예제로 알 수 있는 것은 객체를 테이블에 맞추어 데이터 중심으로 모델링을 하면 협력 관계를 만들 수 없다는 점이다.
테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는 반면 객체는 참조를 사용해서 연관된 객체를 찾는다.
둘 사이에는 이런 큰 차이점이 존재한다.
그러면 이제 객체 연관관계를 사용하여 예제를 다시 살펴보자.
객체 지향 모델링은 다음과 같다.
한 팀에 여러 명의 회원이 소속 가능하므로 회원과 팀은 다대일 관계다.
그러면 저장 코드를 다음과 같이 객체지향적으로 변경이 가능하다.
이걸 단방향 연관관계 설정이라고 한다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
조회 역시 마찬가지다.
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam(); //참조를 사용하여 연관관계 조회
만약 회원의 팀을 다른 팀으로 바꾸고 싶다면 새로운 팀을 조회해 다음과 같이 변경할 수 있다.
Team newTeam = em.find(Team.class, 100L); //pk가 100인 팀이 있다고 가정하자
findMember.setTeam(newTeam); //이렇게 하면 회원의 팀을 바꿔줄 수 있다.
다음 글에서는 어렵..기로 악명이 높은 양방향 연관관계와 연관관계의 주인에 대해 알아보자.
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | 예제로 알아보는 연관관계 매핑 (예제-2) (0) | 2023.04.30 |
---|---|
JPA | 양방향 연관관계와 연관관계의 주인, mappedBy가 뭔데? (0) | 2023.04.29 |
JPA | 요구사항 분석과 기본 매핑 (예제-1) (0) | 2023.04.29 |
JPA | 필드와 컬럼 매핑, 기본 키 매핑 (0) | 2023.04.29 |
JPA | 엔티티 매핑 : @Entity, @Table, 데이터베이스 스키마 자동 생성 (0) | 2023.04.27 |