[Practice-5] 일대다/다대일 관계 정의

2025. 12. 16. 19:24·Spring/JPA

결론부터 말하면 방향(누가 누구를 바라보느냐)에 따라 이름이 달라지기 때문이다. 네가 헷갈려하는 부분은 "관계의 전체적인 그림"과 "객체 입장에서의 시선"을 혼동했기 때문일 가능성이 크다. JPA 어노테이션(@ManyToOne, @OneToMany)은 항상 "나(현재 필드를 가진 객체)"를 기준으로 "너(상대방 객체)"가 몇 개인지를 정의한다. 아래 설명을 통해 오해를 풀어보자.


1. 관계를 정의하는 공식

JPA 어노테이션은 항상 @MeToYou (나 To 너) 순서로 읽어야 한다.

  • Left (Me): 이 어노테이션이 붙은 클래스 (또는 인스턴스)
  • Right (You): 이 필드가 가리키는 대상

2. 자식 입장 (CategoryEntity -> parent)

@ManyToOne // (Me = Many, You = One)
@JoinColumn(name = "parent_id")
private CategoryEntity parent;
  • 나(Me): CategoryEntity 인스턴스들 (휴대폰, TV, 컴퓨터...)
  • 너(You): parent 필드가 가리키는 대상 (전자기기)

해석:

"나 같은 자식들(휴대폰, TV...)은 여럿(Many) 존재하지만, 우리가 가리키는 부모(전자기기)는 단 하나(One)다."

그래서 @ManyToOne이다.

❌ 네가 생각한 "일대다(OneToMany)"가 되려면?

"나(휴대폰) 하나가 부모를 여럿(전자기기, 가구, 식품...) 동시에 가질 수 있어야 한다."

하지만 계층 구조에서 휴대폰의 직속 부모는 '전자기기' 하나뿐이다.

3. 부모 입장 (CategoryEntity -> children)

@OneToMany // (Me = One, You = Many)
private List<CategoryEntity> children = new ArrayList<>();
  • 나(Me): CategoryEntity 인스턴스 (전자기기)
  • 너(You): children 리스트에 담긴 대상들 (휴대폰, TV, 컴퓨터...)

해석:

"나(전자기기)는 하나(One)인데, 내가 거느린 자식들(휴대폰, TV...)은 여럿(Many)이다." 그래서 @OneToMany이다.


4. 그림으로 정리 (Database 관점)

데이터베이스 테이블(categories)을 보면 이해가 더 빠르다. FK(Foreign Key)인 parent_id가 어디에 있는지를 보자.

id (PK) name parent_id (FK) 설명
1 전자기기 NULL 부모 (Root)
2 가구 NULL 부모 (Root)
10 휴대폰 1 자식 -> 부모(1)를 바라봄
11 컴퓨터 1 자식 -> 부모(1)를 바라봄
20 탁자 2 자식 -> 부모(2)를 바라봄

분석:

  1. 자식(Row 10, 11) 입장: parent_id 컬럼에는 오직 하나의 값(1)만 들어갈 수 있다. 즉, 부모는 하나다. (Many To One)
  2. 부모(Row 1) 입장: ID가 1인 데이터를 참조하는 녀석들은 10번, 11번 등 여러 행이 존재한다. (One To Many)

요약

네가 생각한 "자식 입장에서 부모와의 관계"가 1:N이 되려면, 한 자식이 여러 부모를 가져야 한다. (예: '휴대폰'이 '전자기기'에도 속하고 '가구'에도 속하는 경우).

하지만 일반적인 카테고리 트리 구조에서는:

  • 자식 → 부모: 다수가 하나를 바라봄 (Many-To-One)
  • 부모 → 자식: 하나가 다수를 거느림 (One-To-Many)

이 법칙이 적용되므로 코드는 정확하게 작성된 것이 맞다.

'Spring > JPA' 카테고리의 다른 글

[Optimization-1] 기초(1) - 현대 백엔드 개발의 표준, JPA의 본질  (0) 2025.12.26
[Practice-6] 단뱡향/양방향 선택 기준 (⭐⭐⭐)  (0) 2025.12.25
[Practice-4] Spring Data: 무한 깊이 조회 패턴 (댓글/대댓글, 카테고리)  (0) 2025.12.16
[Practice-3] Spring Data: Enum 고도화  (0) 2025.12.16
[Practice-2] 연관관계 편의 메서드  (1) 2025.08.31
'Spring/JPA' 카테고리의 다른 글
  • [Optimization-1] 기초(1) - 현대 백엔드 개발의 표준, JPA의 본질
  • [Practice-6] 단뱡향/양방향 선택 기준 (⭐⭐⭐)
  • [Practice-4] Spring Data: 무한 깊이 조회 패턴 (댓글/대댓글, 카테고리)
  • [Practice-3] Spring Data: Enum 고도화
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30) N
        • Core (18) N
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[Practice-5] 일대다/다대일 관계 정의
상단으로

티스토리툴바