[Spring] DAO 연동을 위한 Controller 생성 및 Swagger를 통한 동작 확인

WOOK JONG KIM·2022년 10월 28일
0
post-thumbnail
post-custom-banner

서비스 객체 설계를 마친 후에는 비즈니스 로직클라이언트 요청을 연결하는 컨트롤러 생성 해야 함

컨트롤러는 클라이언트로부터 요청을 받고 해당 요청에 대해 서비스 레이어에 구현된 적절한 메서드를 호출해서 결과값 받음

즉 컨트롤러는 요청과 응답을 전달하는 역할만 맡는 것이 바람직

ChangeProductNameDto

public class ChangeProductNameDto {
    
    private Long number;
    private String name;
    
    public ChangeProductNameDto(Long number, String name){
        this.number = number;
        this.name = name;
    }
    
    public ChangeProductNameDto(){}
    
    public Long getNumber(){
        return this.number;
    }
    
    public String getName(){
        return this.name;
    }
    
    public void setNumber(Long number){
        this.number = number;
    }
    
    public void setName(String name){
        this.name = name;
    }
}

ProductController 클래스

@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("정상적으로 삭제되었습니다.");
    }

}

Swagger API를 통한 동작 확인

지금까지 완성한 프로젝트 구조

상품 정보를 조회,저장,삭제 할 수 있는 기능 + 상품정보 중 상품의 이름을 수정하는 기능 포함

각 기능에 대한 요청은 컨트롤러-서비스-DAO-리포지토리 계층을 따라 이동하고, 역순으로 응답을 전달하는 구조

Swagger API를 통해 클라이언트 입장에서 기능을 요청하고 어떻게 결과가 나오는지 살펴보자

  1. POST 메서드를 사용하는 createProduct() 메서드 사용

Hibernate: 
    insert 
    into
        product
        (created_at, name, price, stock, updated_at) 
    values
        (?, ?, ?, ?, ?)

정상적으로 insert 쿼리가 생성되어 실행됨

createProduct 처음 실행 시 number 칼럼 값은 1

Swagger에서 입력한 이름과 가격, 재고수량이 정상적으로 입력되고 ProductService에서 구현한 saveProduct()를 통해 created_atupdated_at 칼럼에 시간이 포함된 데이터가 추가됨


  1. 값을 가져오기

값이 Body에 잘 담김

Hibernate: 
    select
        product0_.number as number1_0_0_,
        product0_.created_at as created_2_0_0_,
        product0_.name as name3_0_0_,
        product0_.price as price4_0_0_,
        product0_.stock as stock5_0_0_,
        product0_.updated_at as updated_6_0_0_ 
    from
        product product0_ 
    where
        product0_.number=?

select쿼리가 실행 된것을 확인 할 수 있음


  1. updateProductName() 메서드를 통해 상품 이름 변경

쿼리 문

Hibernate: 
    update
        product 
    set
        created_at=?,
        name=?,
        price=?,
        stock=?,
        updated_at=? 
    where
        number=?

  1. deleteProduct()

Hibernate: 
    delete 
    from
        product 
    where
        number=?
profile
Journey for Backend Developer
post-custom-banner

0개의 댓글