[JPA] 단방향 연관관계 :: 잡다한 프로그래밍
반응형

객체 지향적 설계의 시작인 단방향 연관관계에 대해서 학습해보자

배경: Member와 Team의 관계

회원(Member)은 하나의 팀(Team)에만 소속될 수 있습니다.

즉, 다대일(N:1) 관계이며, DB에서는 다음과 같은 테이블 구조를 가집니다.

관계형 DB에서는 TEAM_ID 외래 키를 통해 팀과 연결됩니다. 그런데 이 구조를 JPA로 그대로 옮기면 아래처럼 됩니다.

 

비객체지향적 JPA 매핑

Member 엔티티

 @Entity
 public class Member {
     @Id @GeneratedValue
     @Column("MEMBER_ID")
     private Long id;
     
     @Column(name = "USERNAME")
     private String name;
     
     @Column(name = "TEAM_ID")
     private Long teamId;

 }

 

TEAM 엔티티

@Entity
 public class Team {
     @Id @GeneratedValue
     @Column("MEMBER_ID")
     private Long id;
     
     private String name;
 }

 

문제점

Team team = new Team();
team.setName("A");
em.persist(team);

Member m = new Member();
member.setUsername("member1");
member.setTeamId(team.getId()); // 객체 지향적이지 못함 setTeam이여야 객체 지향적이지 않을까?

 

 

실제 저장 결과

MEMBER_ID TEAM_ID USERNAME
1 1 member1

 

TEAM_ID NAME
1 A
  • 저장은 되지만, setTeamId()는 객체지향스럽지 않습니다.
  • Member는 Team 객체와 연관이 없음
  • 조회 시도도 번거로움:
Member m = em.find(Member.class, memberId);
Team team = em.find(Team.class, m.getTeamId()); // 직접 Team ID로 또 조회해야 함
객체지향 세계에서는 "객체가 객체를 참조"해야 자연스럽습니다.
반면, 위 방식은 단지 외래 키 숫자만 저장하고 있어 테이블 중심 사고에 머물러 있습니다.

 

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

해결: 단방향 연관관계 매핑

Member 객체가 Team 객체를 직접 참조하게 만듭니다. 즉, 연관 관계를 객체 간 참조로 표현합니다.

 

- N이되는 쪽에 @ManyToOne 어노테이션을 사용한다

- DB JOIN 컬럼에 @JoinColumn 어노테이션을 사용한다.

 @Entity
 public class Member {
 	@Id @GeneratedValue
     @Column("MEMBER_ID")
     private Long id;
     
     @Column(name = "USERNAME")
     private String name;
     
     //@Column(name = "TEAM_ID")
     //private Long teamId;
     
     @ManyToOne
     @JoinColumn(name = "TEAM_ID")
     private Team team;
 }

 

수정된 코드

Team team = new Team();
team.setName("A");
em.persist(team);

Member m = new Member();
member.setUsername("member1");
member.setTeam(team);

조회할 때도 깔끔하게 객체를 통해 참조 가능합니다:

 

정리: 왜 단방향 연관관계가 중요한가?

설계 패턴 테이블 중심 객체지향 중심
코드 복잡도 조회 시 매번 ID → DB 재조회 필요 객체 내부 필드에서 바로 접근 가능
유지보수 ID와 객체 동기화 이슈 발생 가능 일관성 있는 모델링
장점 단순, 초기 진입 쉬움 JPA와 객체지향 철학에 부합
반응형

+ Recent posts