KSCOLD LogoKSCOLD
Blog
Feed
Product
Admin Night
Vault
Guestbook
Info

Vault 목록

양방향

연결된 노트와 함께 읽기

양방향

2026년 5월 17일
  • 양방향(Bidirectional)은 객체(Object) 두 개가 서로 상대방을 참조하는 관계이다.

  • 정확히는 단방향 참조 두 개를 하나의 양방향 관계처럼 관리하는 것이다.

  • 데이터베이스(DataBase)에서는 외래 키(Foreign Key) 하나로 양방향 JOIN이 이미 가능하므로, 양방향 개념은 순수 객체 레벨의 이야기이다.

  • 양방향일 때 반드시 연관관계의 주인을 지정해야 하며, mappedBy 속성으로 주인 필드를 명시한다.

  • 주인이 아닌 쪽은 외래 키(Foreign Key) 변경 불가 — 읽기 전용이다.

연관관계의 주인

  • 외래 키(Foreign Key)를 가진 테이블(Table)과 매핑된 엔티티(Entity)가 주인이다.
  • 일대다(OnetoMany) / 다대일(ManyToOne) 관계에서 항상 N(다) 쪽이 외래 키를 가지므로 주인이 된다.
Member(N) ←FK→ Team(1)
주인: Member (FK를 가진 쪽)
mappedBy: Team 쪽에 mappedBy = "team" 설정

다대일 양방향 예시

Java

주의사항

  • 양방향 편의 메서드: 주인 쪽 setter에서 반대 쪽도 함께 세팅해야 메모리 상 객체가 일관성을 유지한다.
  • 무한루프 위험: toString(), JSON 직렬화 등에서 양방향 참조 순환이 발생할 수 있다.
  • 남용 금지: 실제로 역방향 탐색이 필요할 때만 양방향 설정. 아니면 단방향이 더 안전하다.

관련

  • 단방향
  • 연관 관계(Relationships)
  • 외래 키(Foreign Key)
  • 다대일(ManyToOne)
  • 일대다(OnetoMany)
  • 다대다(ManyToMany)
  • JPA(Java Persistence API)

Synapse Map Insight

@Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") // 연관관계 주인 (FK 관리) private Team team; public void setTeam(Team team) { this.team = team; // 무한루프 방지 체크 if (!team.getMembers().contains(this)) { team.getMembers().add(this); } } } @Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") // 주인 아님, 읽기 전용 private List<Member> members = new ArrayList<>(); }