본문 바로가기
개발 관련 공부/스프링부트 핵심 가이드

06 데이터베이스 연동(3)

by 슴새 2023. 10. 28.
반응형

서비스 클래스 만들기

먼저 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 이다.

 

반응형

댓글