반응형
객체 지향적 설계의 시작인 단방향 연관관계에 대해서 학습해보자
배경: 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와 객체지향 철학에 부합 |
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] 양방향 연관관계와 연관관계의 주인[2] (0) | 2025.06.25 |
---|---|
[JPA] 양방향 연관관계와 연관관계의 주인[1] (0) | 2025.06.24 |
[JPA] 기본키 매핑 (0) | 2025.06.19 |
[JPA] 필드와 컬럼 매핑 (1) | 2025.06.19 |
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2025.06.19 |