Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- EnhancedFor
- cursor문
- NestedFor
- 인터페이스
- 제네릭
- GRANT VIEW
- 추상메서드
- 예외처리
- 예외미루기
- 생성자오버로드
- exception
- 대덕인재개발원
- 컬렉션프레임워크
- 메소드오버로딩
- 사용자예외클래스생성
- 오라클
- 집합_SET
- 자바
- oracle
- 객체 비교
- 자동차수리시스템
- 다형성
- Java
- 참조형변수
- 환경설정
- 컬렉션 타입
- 정수형타입
- 한국건설관리시스템
- abstract
- 어윈 사용법
Archives
- Today
- Total
거니의 velog
(20) 상품 API 서버 구성하기 5 본문
(3) 조회 기능의 처리
* 조회 기능은 등록 기능과 반대로 Product와 List<ProductImage>로 구성된 데이터를 하나의 ProductDTO로 변환해야만 한다.
[서비스 조회 기능의 처리]
* ProductService 인터페이스에는 파라미터로 상품의 번호(pno)를 받고, 리턴 타입은 Product의 타입인 get()을 정의한다.
package com.unlimited.mallapi.service;
import org.springframework.transaction.annotation.Transactional;
import com.unlimited.mallapi.dto.PageRequestDTO;
import com.unlimited.mallapi.dto.PageResponseDTO;
import com.unlimited.mallapi.dto.ProductDTO;
/**
*
* @Transactional 어노테이션을 서비스 계층의 인터페이스 레벨에 추가하는 것은 특정 메서드가 아닌 해당 인터페이스에 대해 트랜잭션을
* 적용하려는 의도를 나타냅니다. 이는 일반적으로 특별한 상황에서만 사용되며, 보통은 메서드
* 레벨에서 @Transactional 어노테이션을 사용하는 것이 일반적입니다.
*
* 일반적으로 서비스 인터페이스 레벨에 @Transactional 어노테이션을 추가하는 것은 다음과 같은 상황에서
* 고려될 수 있습니다.
*
* 인터페이스의 모든 메서드가 트랜잭션에 참여하는 경우: 인터페이스 내의 모든 메서드가 트랜잭션 내에서 실행되어야
* 할 경우에 사용될 수 있습니다. 이는 특히 서비스 인터페이스가 여러 메서드를 정의하고 이를 구현하는 클래스에서
* 트랜잭션을 관리하기 어려운 경우에 유용할 수 있습니다.
*
* 모든 메서드가 동일한 트랜잭션 속성을 가져야 하는 경우: 인터페이스 내의 모든 메서드가 동일한 트랜잭션 속성을
* 가져야 하는 경우에 해당됩니다. 이는 특별한 경우에만 적용되어야 하며, 대부분의 경우 메서드 레벨에서 트랜잭션
* 속성을 명시하는 것이 더 유연하고 명시적입니다.
*
* 서비스 레이어는 일반적으로 비즈니스 로직을 처리하고 트랜잭션 경계를 설정하는 역할을 합니다. 메서드
* 레벨에서 @Transactional 어노테이션을 사용하는 것이 더 흔하며, 메서드마다 다른 트랜잭션 속성을
* 지정할 수 있어서 더 유연한 구현이 가능합니다. 인터페이스 레벨에서 @Transactional 어노테이션을
* 사용하는 것은 특별한 경우에만 필요하며, 주의해서 사용해야 합니다.
*/
@Transactional(rollbackFor = Exception.class)
public interface ProductService {
PageResponseDTO<ProductDTO> getList(PageRequestDTO pageRequestDTO);
Long register(ProductDTO productDTO);
ProductDTO get(Long pno);
}
* ProductServiceImpl 클래스의 get()은 Product, ProductImage를 하나의 ProductDTO로 변환하는 기능이 필요하므로 entityDTO() 라는 메서드를 생성해서 처리한다.
@Override
public ProductDTO get(Long pno) {
// 상품 번호로 상품을 조회합니다.
java.util.Optional<Product> result = productRepository.selectOne(pno);
// 조회된 상품이 존재하지 않으면 예외를 던집니다.
Product product = result.orElseThrow();
// 엔티티를 DTO로 변환합니다.
ProductDTO productDTO = entityToDto(product);
return productDTO;
}
// 엔티티를 DTO로 변환하는 메서드입니다.
private ProductDTO entityToDto(Product product) {
// Product 엔티티의 정보를 사용하여 ProductDTO를 생성합니다.
ProductDTO productDTO = ProductDTO.builder()
.pno(product.getPno())
.pname(product.getPname())
.pdesc(product.getPdesc())
.price(product.getPrice())
.build();
// 엔티티에서 이미지 리스트를 가져옵니다.
List<ProductImage> imageList = product.getImageList();
// 이미지 리스트가 비어있거나 null이면 DTO를 그대로 반환합니다.
if (imageList == null || imageList.size() == 0) {
return productDTO;
}
// 이미지 리스트에서 파일 이름만 추출하여 리스트로 만듭니다.
List<String> fileNameList = imageList.stream().map(productImage -> productImage.getFileName()).toList();
// DTO에 파일 이름 리스트를 설정합니다.
productDTO.setUploadFileNames(fileNameList);
return productDTO;
}
* 조회 기능 역시 ProductServiceTests를 이용해서 동작 여부를 확인한다.
@Test
public void testRead() {
// 실제 존재하는 상품 번호로 테스트
Long pno = 111L;
// 상품 번호로 상품 정보를 조회합니다.
ProductDTO productDTO = productService.get(pno);
// 조회된 상품 정보를 출력합니다.
log.info(productDTO);
// 조회된 상품의 업로드 파일 이름 리스트를 출력합니다.
log.info(productDTO.getUploadFileNames());
}
* 테스트 실행 후 출력되는 로그에서 한 번의 쿼리 실행과 ProductDTO 변환 결과를 확인한다(이미지가 여러 개인 경우 모든 파일이 처리되었는지 확인).
[컨트롤러와 연동 확인]
* ProductController에서 GET 방식으로 조회할 때 사용되는 read()를 추가한다. @PathVariable을 이용해서 상품번호(pno)를 경로의 일부로 사용한다.
// 해당 메서드는 GET 요청을 처리하며, 경로에 포함된 상품 번호(pno)를 받아와
// 상품 서비스(ProductService)를 통해 해당 상품의 정보를 조회하고 반환합니다.
@GetMapping("/{pno}")
public ProductDTO read(@PathVariable(name = "pno") Long pno) {
return productService.get(pno);
}
* Postman을 이용해서 '/products/번호'를 통해 결과를 확인한다(데이터베이스에 있는 번호로 조회, 상품에 속하는 모든 이미지들의 출력 여부 확인).
'SpringBoot_React 풀스택 프로젝트' 카테고리의 다른 글
(22) 리액트와 상품 API 서버 연동 1 (0) | 2024.03.05 |
---|---|
(21) 상품 API 서버 구성하기 6 (0) | 2024.03.04 |
(19) 상품 API 서버 구성하기 4 (0) | 2024.03.04 |
(18) 상품 API 서버 구성하기 3 (0) | 2024.03.04 |
(17) 상품 API 서버 구성하기 2 (0) | 2024.02.29 |