본문 바로가기
Develop/JPA

@OneToOne, @OneToMany

by ys2ys2 2025. 7. 21.

 

 

 

@OneToOne

 

- 정의

@OneToOne은 두 엔티티(Entity)가 1:1 관계임을 명시
예시: 한 명의 사람(Person)은 한 개의 여권(Passport)만 가짐

 

- 핵심 개념

양쪽 모두에서 최대 한 개의 객체만 연결됨

데이터베이스에서는 외래키(foreign key) 제약조건을 이용해 구현됨

 

@Entity
public class Person {
    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = "passport_id") // 외래키 지정
    private Passport passport;
}

 

@Entity
public class Passport {
    @Id
    private Long id;

    // 양방향 예시
    @OneToOne(mappedBy = "passport")
    private Person person;
}

 

 

- 특징 및 주의사항

 

관계의 주인(owner)만이 외래키를 관리

기본적으로 지연로딩(LAZY) 대신 즉시로딩(EAGER) 

(fetch = FetchType.LAZY로 변경 가능)

단방향, 양방향 모두 가능.

 

 


 

@OneToMany

 

- 정의

@OneToMany는 한 엔티티가 여러 개의 엔티티와 연결될 때 사용

예시: 한 명의 사용자(User)는 여러 개의 주문(Order)을 가질 수 있음

 

- 핵심 개념

1(주인) : N(다수) 관계를 표현

데이터베이스에서는 일반적으로 반대쪽(N쪽) 테이블에 외래키로 구현

 

@Entity
public class User {
    @Id
    private Long id;

    @OneToMany(mappedBy = "user")
    private List<Order> orders;
}

 

@Entity
public class Order {
    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id") // 외래키 지정
    private User user;
}

 

- 특징 및 주의사항

 

컬렉션(List, Set 등)으로 선언

단방향 사용 시, 중간 테이블(Join Table)이 자동 생성되어 비효율적일 수 있으니, 양방향 매핑 권장.

기본적으로 LAZY 로딩

 

 


 

 

사용 시 장점

1. 객체 모델과 DB 테이블 관계를 자동으로 맞출 수 있음

2. 코드의 가독성과 유지보수성이 올라감

3. 데이터 일관성과 무결성 보장

4. 코드에서 직관적으로 연관 객체를 사용할 수 있음

5. 연관관계 기반으로 다양한 JPA 기능 활용 가능

 

 

출처

https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/onetoone

https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/onetomany