본문 바로가기
Study

[Spring Boot] DB관련 어노테이션 (2) - 연관 관계

by jisayDeveloper 2023. 10. 26.
728x90
반응형
SMALL

지난 포스팅에 이어서 이번엔 연관 관계 어노테이션을 알아보겠습니다.

https://jisaydeveloper.tistory.com/38

 

[Spring Boot] DB관련 어노테이션 (1) - 엔티티

스프링 부트에서 데이터 베이스와 상호 작용하기 위한 다양한 어노테이션들이 제공됩니다. 이번 포스팅에서 어떤 어노테이션이 있고 어떻게 사용하는지 알아보겠습니다. 엔티티 관련 어노테이

jisaydeveloper.tistory.com

 

연관 관계 어노테이션

  • @OneToOne : 일대일 관계를 정의합니다.
    주로 한 엔티티가 다른 하나의 엔티티만 관계를 가질 때 사용합니다.
@Entity
public class User {

    @OneToOne
    private UserProfile userProfile;
   
}

 

  • @OneToMany 와 @ManyToOne : 일대다, 다대일 관계를 정의합니다.
    주로 부모 엔티티가 자식 엔티티를 여러 개 가질 때 사용합니다.

    ※ fetchType : JPA가 하나의 엔티티를 조회할 때 연관 관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정
    ※ cascadeType : 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티를 어떻게 전이할 건지를 나타내는 설정
속성 기능
fetch = FetchType.EAGER 연관된 엔티티는 즉시 가져옵니다. 즉, 부모 엔티티가 검색될 때 연관된 엔티티도 함께 가져옵니다.
fetch = FetchType.LAZY 연관된 엔티티는 필요할 때 가져옵니다. 즉, 연관된 엔티티가 처음으로 접근될 때 가져옵니다.
CascadeType.ALL 모든 Cascade(저장, 삭제, 갱신)를 적용합니다.
CascadeType.PERSIST 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지합니다.
CascadeType.MERGE 엔티티 상태를 병합할 때, 연관된 엔티티도 모두 병합합니다.
CascadeType.REMOVE 엔티티를 제거할 때, 연관된 엔티티도 모두 제거합니다.
CascadeType.DETACH 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 하지 않습니다.
CascadeType.REFRESH 상위 엔티티를 새로고침할 때, 연관된 엔티티도 모두 새로고침
mappedBy 연관된 엔티티에서 양방향 관계를 설정합니다.
해당 속성을 사용하여 어떤 필드가 역방향 연관을 가리키는지 지정합니다.
@Entity
public class Order {

    @Id
    private Long orderNum;
    
    @Column
    private String userName;

    @ManyToOne(fetch = FetchType.LAZY)
    private List<Orderitem> orderItem;
    
    @OneToMany(cascade = CascadeType.ALL)
    private List<items> items;
   
}

 

  • @Transactional : 클래스나 메서드에 트랜잭션을 정의하고, 트랜잭션의 범위 내에서 연관된 엔티티 작업을 합니다.
    부모 엔티티와 자식 엔티티 간의 관계에서 연관된 엔티티 작업이 트랜잭션으로 관리됩니다.
@Service
@RequiredArgsConstructor
public class OrderService {
    
    private fianl OrderRepository orderRepository;

    @Transactional
    public void createOrderWithItems() {
        Order order = new Order();
        orderRepository.save(order);

        OrderItem item1 = new OrderItem();
        OrderItem item2 = new OrderItem();
        order.addOrderItem(item1);
        order.addOrderItem(item2);
    }
}

 

  • @ManyToMany : 다대다 관계를 설정합니다.
    주로 두 엔티티가 서로를 여러 번 가질 때 사용합니다.
@Entity
public class Student {
    @ManyToMany
    private Set<Subject> subjects;
}

@Entity
public class Subject {
    @ManyToMany(mappedBy = "subjects")
    private Set<Student> students;
}

 

  • @JoinColumn : 연관 관계에서 외래 키(foreign key)를 지정합니다.
    주로 양방향 괸계에서 사용하며 어느 엔티티가 외래 키를 사용할지 정의합니다.
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "department")
    private List<Employee> employees;

}

 

  • @JoinTable : 다대다 관계의 연결  테이블을 지정합니다.
    특히 @ManyToMany 어노테이션과 함께 사용되어 연결 테이블의 이름 및 외래 키를 정의합니다.
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course", // 연결 테이블의 이름
        joinColumns = @JoinColumn(name = "student_id"), // 학생 엔티티의 외래 키
        inverseJoinColumns = @JoinColumn(name = "course_id") // 강의 엔티티의 외래 키
    )
    private List<Course> courses;

}

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(mappedBy = "courses") // 양방향 관계 설정
    private List<Student> students;

}

 

728x90
반응형
LIST