❯ Spring Data JPA 기술 적용 (Spring Data JDBC -> Spring Data JPA)
1. 엔티티 클래스 Spring Data JPA에 맞게 수정(+ @JoinColumn과 mappedBy 차이)
Spring Data JDBC에서는 단방향 연관관계만 지원하는 반면 Spring Data JPA는 양방향 연관관계를 지원한다.
따라서 다대일 관계에 일대다 매핑을 추가하여 양방향 연관관계를 만들어주면 양쪽 클래스에서 상호 참조가 가능해진다.
다대다 관계의 경우 @ManyToMany로 바로 적용시키는 것이 아니라, 두 엔티티를 연결하는 엔티티를 통해 연관관계를 매핑할 수 있다.
ex. [주문 - 커피] 관계
하나의 커피는 여러개의 주문에 포함될 수 있으며, 하나의 주문은 여러개의 커피를 포함할 수 있으므로 다대다 관계이다.
엔티티 클래스로 나타내면 Order, OrderCoffee, Coffee로 표현할 수 있으며 다대일, 일대다 관계를 통해 나타낸다.
<Order>
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS") // SQL 쿼리문에 ORDER 예약어 있으므로 테이블 명 ORDERS로 지정
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
// 일대다 관계로 OrderCoffee와 연결
@OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST)
private List<OrderCoffee> orderCoffees = new ArrayList<>();
(...)
}
<OrderCoffee>
@NoArgsConstructor
@Getter
@Setter
@Entity
public class OrderCoffee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderCoffeeId;
// 다대일 관계로 Coffee와 연결한다.
@ManyToOne
@JoinColumn(name = "COFFEE_ID")
private Coffee coffee;
@Column(nullable = false)
private int quantity;
// 다대일 관계로 Order와 연결한다.
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
}
<Coffee>
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Coffee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long coffeeId;
@Column(length = 100, nullable = false)
private String korName;
@Column(nullable = false)
private Integer price;
// 일대다 관계로 OrderCoffee와 이어준다.
@OneToMany(mappedBy = "coffee")
private List<OrderCoffee> orderCoffees = new ArrayList<>();
(...)
}
@JoinColumn과 mappedBy
위 사례를 보면 연관관계 매핑에서 @JoinColumn(name = "컬럼명") 과 (mappedBy = "필드명") 두가지 방법이 있는것을 알 수 있다.
이것은 연관관계의 '주인'이 누군지에 따라 결정된다. 연관관계가 있는 두 객체중 외래키를 관리하는 객체를 연관관계의 주인이라고 한다.
Order와 OrderCoffee의 관계를 보면 1 : N의 관계를 가진다. 이 경우 OrderCoffee가 Order의 id를 외래키로 가지게 된다.
즉, OrderCoffee가 외래키를 관리하게되므로 이 연관관계의 주인이 된다.
@JoinColumn은 외래키를 관리하는 객체에서 상대 테이블의 외래키를 표시하는 역할을 한다.
반면 mappedBy는 연관관계의 주인이 아닌쪽의 클래스에서 사용한다.
(연관관계의 주인쪽에서 @JoinColumn으로 선언한 필드명을 기재해준다고 생각하면 쉽다.)
따라서 JoinColumn만 선언하면 단방향 연결이, mappedBy까지 선언하면 양방향 연결이 된다.
2. Repository 인터페이스 구현
Spring Data JDBC 에서는 CrudRepository 를 사용했었다.(PagingAndSortingRepository도 사용가능)
여기에서는 JpaRepository(CrudRepository, PagingAndSortingRepository 상속받음)을 사용해 더 많은 기능을 사용할 수 있다.
3. 기타 기능 변경 및 추가로 인한 코드 수정
데이터베이스를 연결하고 엔티티간의 관계를 설정한 뒤 필요한 기능들(Mapper, Dto, Controller 등)에 대한 수정작업 수행
참고자료
Spring JPA: @JoinColumn과 mappedBy 속성의 의미
어제 오늘 진행된 과제와 실습은 수정과 수정의 연속이었다.
한군데를 수정하면 다른 수정할 곳이 또 발생하고, 어디와 어디가 연결되어있는지 파악해야했다.
객체의 필드와 연관관계에 대한 개념이 아직 명확하지 않아서 많은 오류를 마주했다.
다시 처음부터 여러번 반복연습이 필요할것같다.
'부트캠프 개발일기 > Spring MVC' 카테고리의 다른 글
53일차: @Async 비동기처리와 Spring Event (+ Transaction) (0) | 2023.04.27 |
---|---|
52일차: Transaction(트랜잭션) (0) | 2023.04.26 |
50일차: 엔티티간 연관관계 매핑 (0) | 2023.04.24 |
49일차: JPA(Java Persistence API) (0) | 2023.04.21 |
48일차: Pagination(페이지네이션) API (0) | 2023.04.20 |