반응형
서비스 클래스 만들기
먼저 dto를 만들고 서비스 클래스들을 만들자.
entity와 dto 둘 다 객체인데..
클라와 가까운 레이어에서는 dto를 사용하고 db와 가까운 레이어에서는 entity를 사용하는 것이 일반적이다.
단 회사 내 규정에 따라 얼마든지 바뀔 수 있는 사항 인 것 같다.
어쨌든 서비스 클래스를 만든다.
public interface ProductService {
ProductResponseDto getProduct(Long number);
ProductResponseDto saveProduct(ProductDto productDto);
ProductResponseDto changeProductName(Long number, String name) throws Exception;
void deleteProduct(Long number) throws Exception;
}
간단하게 crud 기능을 담아서~
(예제에선 ProductDto와 ProductResponseDto를 따로 선언해서 인자로 넘겨주는 dto와 결과값으로 반환하는 dto를 구분하였다.)
@Service
public class ProductServiceImpl implements ProductService {
private final ProductDAO productDAO;
@Autowired
public ProductServiceImpl(ProductDAO productDAO) {
this.productDAO = productDAO;
}
// 예제 6.23
@Override
public ProductResponseDto getProduct(Long number) {
Product product = productDAO.selectProduct(number);
ProductResponseDto productResponseDto = new ProductResponseDto();
productResponseDto.setNumber(product.getNumber());
productResponseDto.setName(product.getName());
productResponseDto.setPrice(product.getPrice());
productResponseDto.setStock(product.getStock());
return productResponseDto;
}
// 예제 6.24
@Override
public ProductResponseDto saveProduct(ProductDto productDto) {
Product product = new Product();
product.setName(productDto.getName());
product.setPrice(productDto.getPrice());
product.setStock(productDto.getStock());
product.setCreatedAt(LocalDateTime.now());
product.setUpdatedAt(LocalDateTime.now());
Product savedProduct = productDAO.insertProduct(product);
ProductResponseDto productResponseDto = new ProductResponseDto();
productResponseDto.setNumber(savedProduct.getNumber());
productResponseDto.setName(savedProduct.getName());
productResponseDto.setPrice(savedProduct.getPrice());
productResponseDto.setStock(savedProduct.getStock());
return productResponseDto;
}
// 예제 6.25
@Override
public ProductResponseDto changeProductName(Long number, String name) throws Exception {
Product changedProduct = productDAO.updateProductName(number, name);
ProductResponseDto productResponseDto = new ProductResponseDto();
productResponseDto.setNumber(changedProduct.getNumber());
productResponseDto.setName(changedProduct.getName());
productResponseDto.setPrice(changedProduct.getPrice());
productResponseDto.setStock(changedProduct.getStock());
return productResponseDto;
}
// 예제 6.26
@Override
public void deleteProduct(Long number) throws Exception {
productDAO.deleteProduct(number);
}
@Service 어노테이션 붙여서 구현체도 만들어주고~
생성자 주입을 해주고~
dao 활용해서 crud 구현하는데 response용 Dto를 따로 만들었기 때문에 set을 해준다
컨트롤러 생성
@RestController
@RequestMapping("/product")
public class ProductController {
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
@GetMapping()
public ResponseEntity<ProductResponseDto> getProduct(Long number) {
ProductResponseDto productResponseDto = productService.getProduct(number);
return ResponseEntity.status(HttpStatus.OK).body(productResponseDto);
}
@PostMapping()
public ResponseEntity<ProductResponseDto> createProduct(@RequestBody ProductDto productDto) {
ProductResponseDto productResponseDto = productService.saveProduct(productDto);
return ResponseEntity.status(HttpStatus.OK).body(productResponseDto);
}
@PutMapping()
public ResponseEntity<ProductResponseDto> changeProductName(
@RequestBody ChangeProductNameDto changeProductNameDto) throws Exception {
ProductResponseDto productResponseDto = productService.changeProductName(
changeProductNameDto.getNumber(),
changeProductNameDto.getName());
return ResponseEntity.status(HttpStatus.OK).body(productResponseDto);
}
@DeleteMapping()
public ResponseEntity<String> deleteProduct(Long number) throws Exception {
productService.deleteProduct(number);
return ResponseEntity.status(HttpStatus.OK).body("정상적으로 삭제되었습니다.");
}
}
이제 컨트롤러를 만든다.
마찬가지로 @RestController, @RequestMapping 달아주고~
@Autowired로 주입해주고~
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping을 달아 정석적으로 서비스의 함수들을 호출하도록 한다.
리턴 값은 ResponseEntity를 사용해서 ok 메세지와 함께 리턴될 수 있도록~
참고로 PutMapping의 경우 이름만 수정하는 목적으로 ChangeProductNameDto를 추가로 만들었다.
이제 스웨거에서 api들을 테스트 할 수 있다.
항상 까먹는데, 스웨거 접속 링크는 http://localhost:8080/swagger-ui.html 이다.
반응형
'개발 관련 공부 > 스프링부트 핵심 가이드' 카테고리의 다른 글
07 테스트 코드 작성하기(2) (0) | 2023.12.24 |
---|---|
07 테스트 코드 작성하기(1) (1) | 2023.11.12 |
06 데이터베이스 연동(2) (2) | 2023.10.14 |
06 데이터베이스 연동(1) (0) | 2023.10.03 |
03 개발환경 구성~05 API를 작성하는 다양한 방법 (0) | 2023.10.02 |
댓글