오류 및 문제점
1. Service 사용
- 문제점: Controller에서 로직을 작성하면 코드가 너무 길어진다. (Controller는 요청을 받아 결과 넘겨주는 역할)
- 해결방안: Service를 만들어 로직 구현 완료한 후 Controller로 넘긴다.
2. Could not commit JPA transaction
- 문제점: save 메서드를 수행하는데 null값이 들어갈 수 없다는 에러가 발생한다.
- 해결방안: null이 가능한 칼럼에 추가되었던 @NotNull 어노테이션을 삭제한다. 또한 builder로 객체 생성시 기본값이 있는 칼럼에 대해 @Builder.Default를 추가한다.
@Builder.Default
private String orderStatus = "출고대기";
private Timestamp exportDate;
private String invoiceNo;
3. @OneToMany vs @ManyToOne
- 문제점: 주문 내역과 주문 상품 테이블을 매핑할 때 어떤 연관관계가 좋을지 비교가 필요하다.
- 해결방안: 결론적으로 @ManyToOne이 더 좋다.
- @ManyToOne: 각 객체에 setter를 이용해 one을 넣은 후 saveAll로 한 번에 insert 수행
- @OneToMany: many를 insert한 후 one을 설정하기 위해 각 데이터에 대해 update 수행
- update 과정이 추가되기 때문에 DB 연산 증가
@NotNull
@ManyToOne
@JoinColumn(name="export_no")
private Exports exports;
4. @Autowired vs @RequiredArgsConstructor
- 문제점: 순환 참조, 의존성 주입이 많이 필요하다면 길어지는 코드, 가변성 등의 문제로 @Autowired 사용이 지양된다.
- 해결방안: 필드를 final 형태로 선언한 후 @RequiredArgsConstructor 어노테이션을 통해 의존성을 주입한다.
@Service
@RequiredArgsConstructor
public class ProductService {
private final ProductRepository productRepository;
}
진행 상황
1. 세부 상품군 등록 테스트 코드 작성
@Test
void registerDetailProductGroup() {
ProductGroup productGroup = productGroupService.findByGroupName("화장품");
DetailProductGroup detailProductGroup = DetailProductGroup
.builder()
.groupName("크림")
.productGroup(productGroup)
.build();
DetailProductGroup savedDetailProductGroup = detailProductGroupService.register(detailProductGroup);
Assertions.assertThat(savedDetailProductGroup.getDetailProductGroupNo()).isNotNull();
Assertions.assertThat(savedDetailProductGroup.getGroupName()).isEqualTo(detailProductGroup.getGroupName());
}
2. 상품 등록 테스트 코드 작성
@Test
void register() {
ArrayList<Product> products = new ArrayList<>();
Seller seller = sellerService.findByBusinessNo("135-81-05033");
String[] productNo = { };
String[] productName = { };
Integer[] safetyStock = { };
DetailProductGroup[] group = { };
Integer[] consumerPrice = { };
Integer[] importPrice = { };
for (int i = 0; i < productNo.length; i++) {
Product product = Product.builder().consumerPrice(consumerPrice[i]).currentStock(0)
.detailProductGroup(group[i]).importPrice(importPrice[i]).isActive(true).productName(productName[i])
.productNo(productNo[i]).safetyStock(safetyStock[i]).seller(seller).build();
products.add(product);
}
List<Product> savedProducts = productService.registerAll(products);
Assertions.assertThat(savedProducts.size()).isEqualTo(products.size());
}
3. 출고 등록 테스트 코드 작성
@Test
void registerExport() {
List<ExportProduct> products = new ArrayList<>();
Timestamp orderDate = new Timestamp(new Date().getTime());
Exports exports = Exports.builder().address("서울특별시 마포구 연남로 52").orderDate(orderDate).ordererName("홍길동")
.salesChannel("11번가").build();
Product tmp1 = productService.findByProductNo("8806338760904");
ExportProduct product1 = ExportProduct.builder().amount(5).product(tmp1).sellingPrice(9900).build();
products.add(product);
List<ExportProduct> savedProducts = exportsService.register(exports, products);
Assertions.assertThat(savedProducts.size()).isEqualTo(products.size());
}
참고 자료