8/7 진행사항
✅ 알고리즘 2문제
✅ 인메모리 강의 1-4
✅ 챕터1 과제 - 기본 api 구성하기
오늘은 강의보다 과제에 더 시간을 많이 쓴 날이다.
강의 집중이 잘 안 되어 과제로 눈 돌렸더니 과제에서 빠져나올 수 없었다....🤯
양방향 연관관계 매핑
상품과 주문의 관계는 다대다 관계다.
(한 개의 상품이 여러개의 주문에 들어갈 수 있고, 한 개의 주문도 여러개의 상품에 포함될 수 있다.)
이때 중간테이블인 주문상품 테이블을 만들면
상품:주문상품 = 1:N
주문:주문상품 = 1:N
관계로 정리된다.
주문상품 엔티티
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PRIVATE)
@Getter
@Entity
@Table(name = "order_products")
public class OrderProduct {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
private Long product_id;
public static OrderProduct createOrderProduct(Long product_id, Order order) {
return OrderProduct.builder()
.product_id(product_id)
.order(order)
.build();
}
}
@ManyToOne : 1:N관계에서 N에 해당함
@ManyToOne의 기본값 : FetchType.EAGER
지연 로딩 사용 시기 : 연관된 데이터가 항상 필요한 것은 아닐 때, 초기 로딩 성능 최적화하고 싶을 때
@JoinColumn(name = "order_id") : 지정된 name으로 왜래키 매핑. Order 테이블의 키인 order_id를 name으로 작성한다.
주문 엔티티
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PRIVATE)
@Getter
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long order_id;
private String name;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderProduct> product_ids = new ArrayList<>();
public static Order createOrder(String name){
return Order.builder()
.name(name)
.product_ids(new ArrayList<>())
.build();
}
public void addProduct(OrderProduct orderProduct) {
product_ids.add(orderProduct);
}
}
@OneToMany : 1:N 관계에서 1에 해당함
mappedBy = "order" : 관계의 주인 필드를 지정하여 양방향 관계를 설정한다.
관계의 주인: 외래 키를 관리하며, @JoinColumn을 통해 외래 키를 매핑.
관계의 종속: 외래 키를 관리하지 않으며, mappedBy를 사용하여 주인을 지정.
CascadeType.ALL
cascade 옵션은 부모 엔티티의 상태 변화를 자식 엔티티에 전파하는 데 사용된다.
CascadeType.ALL을 설정하면 모든 상태 변화가 자식 엔티티에 전파된다.
주요 CascadeType 옵션
- PERSIST: 부모 엔티티가 저장될 때 자식 엔티티도 저장
- MERGE: 부모 엔티티가 병합될 때 자식 엔티티도 병합
- REMOVE: 부모 엔티티가 삭제될 때 자식 엔티티도 삭제
- REFRESH: 부모 엔티티가 새로고침될 때 자식 엔티티도 새로고침
- DETACH: 부모 엔티티가 분리될 때 자식 엔티티도 분리
- ALL: 위의 모든 동작 포함
CascadeType.ALL로 인해 Order를 저장할 때 OrderProduct도 함께 저장된다.
orphanRemoval : 부모엔티티와의 관계가 제거 되었을 때 자식 엔티티를 자동 삭제하는 기능
Error Decoder 사용하기
FeignClient를 사용해서 상품 서비스 클라이언트를 연결 할 때 오류처리를 커스텀하는 방법에 대해 찾아보았다.
FeignErrorDecoder 생성
public class FeignErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String s, Response response) {
HttpStatus status = HttpStatus.valueOf(response.status());
if (status == HttpStatus.NOT_FOUND) {
return new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 상품을 찾을 수 없습니다.");
}
return new Exception(response.reason());
}
}
ErrorDecode Bean 등록
@Configuration
public class FeignConfiguration {
@Bean
public FeignErrorDecoder feignErrorDecoder() {
return new FeignErrorDecoder();
}
}
해당 클래스 configuration 속성값으로 추가
@FeignClient(name = "product-service", configuration = FeignConfiguration.class)
public interface ProductClient {
...
}
오늘의 tmi)
양방향 헷갈령..ㅠ🫠
얼른 자고싶다...
시간 분배를 잘 하자
내일은 더 몰입하기...!
'TIL' 카테고리의 다른 글
[TIL] Spring Boot 로컬과 서버 환경 분리 | 정적 팩토리 메서드 (0) | 2024.08.10 |
---|---|
[TIL] Spring Boot 프로젝트에 캐싱 적용하기 (0) | 2024.08.09 |
[TIL] Zipkin이란? | Redis란? (0) | 2024.08.06 |
[TIL] QueryDsl 사용방법 (0) | 2024.08.06 |
[TIL] 인증과 인가 | 컨피그 서버 (Spring Cloud Config) (0) | 2024.08.02 |