서비스 객체 설계를 마친 후에는 비즈니스 로직
과 클라이언트 요청을 연결
하는 컨트롤러 생성
해야 함
컨트롤러는 클라이언트로부터 요청을 받고 해당 요청에 대해 서비스 레이어에 구현된 적절한 메서드를 호출해서 결과값 받음
즉 컨트롤러는 요청과 응답을 전달하는 역할만 맡는 것이 바람직
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;
}
}
@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("정상적으로 삭제되었습니다.");
}
}
지금까지 완성한 프로젝트 구조
상품 정보를 조회,저장,삭제 할 수 있는 기능 + 상품정보 중 상품의 이름을 수정하는 기능 포함
각 기능에 대한 요청은 컨트롤러-서비스-DAO-리포지토리
계층을 따라 이동하고, 역순으로 응답을 전달하는 구조
Swagger API를 통해 클라이언트 입장에서 기능을 요청하고 어떻게 결과가 나오는지 살펴보자
Hibernate:
insert
into
product
(created_at, name, price, stock, updated_at)
values
(?, ?, ?, ?, ?)
정상적으로 insert 쿼리가 생성되어 실행됨
createProduct 처음 실행 시 number 칼럼 값은 1
Swagger에서 입력한 이름과 가격, 재고수량이 정상적으로 입력되고 ProductService에서 구현한 saveProduct()
를 통해 created_at
과 updated_at
칼럼에 시간이 포함된 데이터가 추가됨
값이 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쿼리가 실행 된것을 확인 할 수 있음
쿼리 문
Hibernate:
update
product
set
created_at=?,
name=?,
price=?,
stock=?,
updated_at=?
where
number=?
Hibernate:
delete
from
product
where
number=?