본문 바로가기
IT개발/JAVA

자바(Java)에서 1:N 관계와 상속

by 시간기억자 2025. 4. 6.
반응형

자바를 이용한 웹 개발, 특히 Spring Boot와 JPA를 사용할 때 빠지지 않는 개념이 있다.
바로 1:N 관계와 상속이다. 이 개념을 명확히 이해하면 엔티티 설계는 물론, 데이터베이스 관계 설계까지 훨씬 수월하게 진행할 수 있다.


🔍 1:N 관계란 무엇인가?

📌 정의

**1:N 관계(One-to-Many)**는 말 그대로 하나의 객체가 여러 개의 다른 객체를 가질 수 있는 관계이다.
예를 들어, **하나의 회원(Member)**이 여러 개의 **게시글(Post)**을 작성할 수 있다고 생각해보자.

📌 실제 예제

@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
    private List<Post> posts = new ArrayList<>();
}

@Entity
public class Post {
    @Id
    @GeneratedValue
    private Long id;

    private String title;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;
}

설명

  • Member 엔티티는 Post 엔티티와 1:N 관계를 가진다.
  • 하나의 회원이 여러 게시글을 가질 수 있으므로, List<Post> 형태로 선언되어 있다.
  • 반대로 Post는 작성자를 참조하기 때문에 @ManyToOne 관계이다.

⚠️ 1:N 관계와 상속은 다르다

많은 개발자들이 혼동하는 개념이 **1:N 관계와 상속(Inheritance)**이다.
둘은 완전히 다른 개념이다.

개념 설명
1:N 관계 데이터 간의 관계 (객체가 다른 객체 리스트를 가짐)
상속 클래스 간의 확장 관계 (부모-자식 관계)

예를 들어 다음과 같이 상속을 사용하면, 이는 1:N이 아니다.

public class Animal {
    private String name;
}

public class Dog extends Animal {
    private String breed;
}

public class Cat extends Animal {
    private boolean indoor;
}

🎯 실제 비즈니스 예제로 이해하는 1:N 관계

📌 예제 시나리오: 사원(Employee)과 근태 기록(WorkLog)

  • 한 명의 사원이 여러 건의 근태 기록을 가진다.
  • 사원(Employee)은 1, 근태 기록(WorkLog)은 N의 관계다.
@Entity
public class Employee {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<WorkLog> workLogs = new ArrayList<>();
}

@Entity
public class WorkLog {
    @Id
    @GeneratedValue
    private Long id;

    private LocalDate date;
    private String status;  // 예: 출근, 지각, 결근

    @ManyToOne
    @JoinColumn(name = "employee_id")
    private Employee employee;
}

📌 1:N 관계를 사용할 때 주의할 점

주의사항 설명
Lazy vs Eager 연관된 데이터를 언제 로딩할 것인지 설정해야 한다. (fetch = FetchType.LAZY 권장)
양방향 관계 주의 mappedBy를 사용하여 연관관계의 주인을 정확히 설정해야 한다.
순환 참조 방지 양방향 관계에서 JSON 직렬화 시 순환 참조 오류가 발생할 수 있으므로, @JsonManagedReference, @JsonBackReference 등을 활용한다.

🧠 마무리 정리

  • 1:N 관계는 하나의 객체가 여러 객체를 참조하는 데이터 관계이다.
  • 상속은 클래스 간의 구조적 관계로, 객체 간의 수량 관계가 아니다.
  • JPA에서는 @OneToMany, @ManyToOne 어노테이션을 통해 1:N 관계를 명확하게 선언할 수 있다.
  • 1:N 관계와 상속은 목적도 다르고 설계 방향도 다르므로 구분해서 사용하는 것이 중요하다.
반응형

댓글