데이터베이스

@ManyToOne, @OneToMany, @OneToOne, @ManyToMany

개린이9999 2025. 5. 20. 13:13
728x90

@ManyToOne, @OneToMany, @OneToOne, @ManyToMany는 객체 간 관계를 정의하는 어노테이션

데이터베이스의 외래키(FK)와 1:N, N:1 같은 개념을 자바 객체에서도 표현해주는 것

 

예를들어 

회사(COMPANY) 와 직원(EMPLYOEE)의 관계를 생각해보면, 

 

1. @ManyToOne (N:1 관계)
많은 객체가 하나의 객체를 참조함

@Entity
public class Employee {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "company_id")  // FK 컬럼 이름
    private Company company;  // 직원은 하나의 회사에 소속
}


이렇게 하면 DB에는 employee 테이블에 company_id FK가 생김

 

 2. @OneToMany (1:N 관계)
하나의 객체가 여러 개를 참조함

@Entity
public class Company {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "company")  // 상대방 필드명
    private List<Employee> employees = new ArrayList<>();
}


mappedBy는 연관관계 주인이 아님을 명시하는 것. (DB에 FK 안 만들어짐)

둘 다 연결하면?

 

 

@Entity
public class Person {

    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = "card_id")
    private IDCard idCard;
}

@Entity
public class IDCard {

    @Id
    private Long id;

    private String cardNumber;
}


이렇게 하면 양방향 관계가 되고, JPA는 이를 기반으로 쿼리를 생성함.

 3. @OneToOne (1:1 관계)

@Entity
public class Person {

    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = "card_id")
    private IDCard idCard;
}

@Entity
public class IDCard {

    @Id
    private Long id;

    private String cardNumber;
}


사람 한 명은 주민등록증 하나. @OneToOne은 두 객체가 서로 1:1 대응될 때 사용함.

 4. @ManyToMany (N:N 관계)

@Entity
public class Student {

    @Id
    private Long id;

    @ManyToMany
    @JoinTable(
        name = "student_subject",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "subject_id")
    )
    private List<Subject> subjects;
}

@Entity
public class Subject {

    @Id
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "subjects")
    private List<Student> students;
}

 


 이 경우 중간 테이블(student_subject)이 자동으로 생성됨

요약 표
관계 설명 JPA 어노테이션
1:N 회사 - 직원 @OneToMany, @ManyToOne
1:1 사람 - 주민등록증 @OneToOne
N:N 학생 - 과목 @ManyToMany

실제 개발 시 팁
대부분 실무에서는 @ManyToOne을 주로 사용 (N:1 구조가 많음)

@OneToMany는 단독으로 사용하면 성능상 불리할 수 있음 (즉시 로딩, N+1 이슈 등)

양방향보다 단방향 관계로 설계하고, 필요한 경우만 양방향 사용

DTO로 관계 객체는 필요에 따라 제한적으로 넘겨야 함 (무한 루프 방지)

728x90