Spring/데이터 액세스 계층

[Spring] JPA 애너테이션, 관계 매핑

한비Skyla 2024. 7. 2. 16:24

<JPA 애너테이션>

앤티티 클래스에서 

@Getter, @Setter, @NoArgsConstructor, @Entity 를 붙여줌. 

@Entity : 이 객체가 entity 객체라는 것을 알려줘야 함.

                기본생성자가 없으면 오류가 발생하므로 @NoArgsConstructor 를 넣어 주어야 함. 

 

@GerneratedValue : 자동으로 기본키가 생성되는 전략임. 기본 설정은 데이터베이스 테일블에 맡김. 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long coffeeId;

- GenerationType 

1. Identity: 기본키생성을 데이터베이스에 위임한다. AUTO_INCREMENT 보통 JPA, MYsql 사용시 설정. 

2. Sequence : DB의 시퀀스를 활용하여 id 값을 증가시킨다. 

 

@Column

- length : 문자 길이 제약조건. 

- nullable

- unique

- updatable 

- name : 필드와 매핑할 테이블 컬럼의 이름. 

 

@Enumerated : Enum 타입을 사용할 때. 

- EnumType.ORDINAL : 순서값을 저장.

- EnumType.STRING : 이름을 저장.

@Enumerated(value = EnumType.STRING)
@Column(length = 20, nullable = false)
private CoffeeStatus coffeestatus = CoffeeStatus.COFFEE_FOR_SALE;

 

 

<관계 매핑>

- 매핑을 하는 이유: DB의 테이블과 연결 시키기 위해서. 

- 다대일 매핑부터!

- 다에는 클래스 객체 자체가 있어야 함. @ManyToOne

- @JoinColum(name = "") >> 조인할 테이블의 기본키.

- 필요한 상황에 일대다 매핑.

 

☘️ Coffee 와 order 의 관계에서 

이 둘은 다대다 이기 때문에 중간 조인테이블 OrderCoffee 가 있어야 함. 

시작은 다대일부터 . OrderCoffee >> Coffee 로, OrderCoffee >> Order 로 다대일 매핑을 함. 

- 외래키 기준으로 생각! 외래키를 가지고 있는 테이블에서, 즉 객체를 가지고 있는 테이블에서 조회가 가능한 것임. 

근데 Order 에서 coffee  조회할  있어야 하기 때문에, Order >> OrderCoffee  일대다 매핑이 필요. 

그렇게 하면 Order 에서 OrderCoffee 로, OrderCoffee 에서 Coffee 로 조회가 가능해진다. 

 

서로가 서로를 호출하려면 this 가 필요함.

 

 

 @OneToMany 는 mappedBy 를 써주는데 이때에는 관계를 이어줄 테이블 명을 써 주어야 함. 

@OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST)
private List<OrderCoffee> orderCoffees = new ArrayList<>();

public void addOrderCoffee(OrderCoffee orderCoffee) {
    this.orderCoffees.add(orderCoffee);
    if (orderCoffee.getOrder() != this) {
        orderCoffee.addOrder(this);
    }
}