[프로젝트] 웹 siCloud - day08

_bean_·2023년 7월 28일
0
post-thumbnail

오류 및 문제점

1. Service 사용

  • 문제점: Controller에서 로직을 작성하면 코드가 너무 길어진다. (Controller는 요청을 받아 결과 넘겨주는 역할)
  • 해결방안: Service를 만들어 로직 구현 완료한 후 Controller로 넘긴다.

2. Could not commit JPA transaction

  • 문제점: save 메서드를 수행하는데 null값이 들어갈 수 없다는 에러가 발생한다.
  • 해결방안: null이 가능한 칼럼에 추가되었던 @NotNull 어노테이션을 삭제한다. 또한 builder로 객체 생성시 기본값이 있는 칼럼에 대해 @Builder.Default를 추가한다.
// ExportProduct.java
@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 연산 증가
// ExportProduct.java
@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());
}

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글