CoffeeService 구현
|
- CoffeeService 클래스에서 사용하는 Coffee 엔티티(Entity) 클래스의 데이터는 다음으로 제한합니다.
- coffeeId(커피 식별자): long
- korName(한글 커피명): String
- engName(영문 커피명): String
- price(가격): int
|
- 다음과 같이 총 다섯 개의 메서드를 구현합니다.
- createCoffee(Coffee coffee)
- 파라미터: 등록할 커피 정보(Coffee 클래스 객체)
- 메서드 바디
- 리턴 값
- 커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
- updateCoffee(Coffee coffee)
- 파라미터: 수정할 커피 정보(Coffee 클래스 객체)
- 메서드 바디
- 리턴 값
- 커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
- findCoffee(long coffeeId)
- 파라미터: 조회할 커피의 커피 식별자(long)
- 메서드 바디
- 리턴 값
- 커피 정보: 아래 Stub 데이터를 포함한 Coffee 클래스의 객체를 리턴합니다.
- 커피 식별자: 파라미터로 전달받은 커피 식별자(coffeeId)를 포함합니다.
- 한글 커피명: 아메리카노
- 영문 커피명: Americano
- 가격: 2500
- findCoffees()
- 파라미터: 없음
- 메서드 바디
- 리턴 값
- 커피 정보: 아래 Stub 데이터를 포함한 List를 리턴합니다.
- 커피 정보 1
- 커피 식별자(coffeeId): 1L
- 커피명(한글): 아메리카노
- 커피명(영문): Americano
- 가격: 2500
- 커피 정보 2
- 커피 식별자(coffeeId): 2L
- 커피명(한글): 캐러멜 라떼
- 커피명(영문): Caramel Latte
- 가격: 5000
- deleteCoffee(long coffeeId)
- 파라미터: 삭제할 커피의 커피 식별자(long)
- 리턴 값: 없음
- 메서드 바디
|
package com.codestates.coffee;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CoffeeService {
public Coffee createCoffee(Coffee coffee) {
//파라미터: 등록할 커피 정보(Coffee 클래스 객체)
//
//메서드 바디
//
//구현해야 될 내용 없습니다.
//리턴 값
//
//커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
Coffee createdCoffee = coffee;
return createdCoffee;
}
public Coffee updateCoffee(Coffee coffee) {
//파라미터: 수정할 커피 정보(Coffee 클래스 객체)
//
//메서드 바디
//
//구현해야 될 내용 없습니다.
//리턴 값
//
//커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
Coffee updatedCoffee = coffee;
return updatedCoffee;
}
public Coffee findCoffee(long coffeeId) {
//파라미터: 조회할 커피의 커피 식별자(long)
//
//메서드 바디
//
//구현해야 될 내용 없습니다.
//리턴 값
//
//커피 정보: 아래 Stub 데이터를 포함한 Coffee 클래스의 객체를 리턴합니다.
//
//커피 식별자: 파라미터로 전달받은 커피 식별자(coffeeId)를 포함합니다.
//
//한글 커피명: 아메리카노
//
//영문 커피명: Americano
//
//가격: 2500
Coffee coffee = new Coffee(coffeeId, "아메리카노", "Americano", 2500);
return coffee;
}
public List<Coffee> findCoffees() {
//파라미터: 없음
//
//메서드 바디
//
//구현해야 될 내용 없습니다.
//리턴 값
//
//커피 정보: 아래 Stub 데이터를 포함한 List를 리턴합니다.
//
//커피 정보 1
//커피 식별자(coffeeId): 1L
//커피명(한글): 아메리카노
//커피명(영문): Americano
//가격: 2500
//
//커피 정보 2
//커피 식별자(coffeeId): 2L
//커피명(한글): 캐러멜 라떼
//커피명(영문): Caramel Latte
//가격: 5000
List<Coffee> coffees = List.of(
new Coffee(1L, "아메리카노", "Americano", 2500),
new Coffee(2L, "카라멜 라떼", "Caramel Latte", 5000)
);
return coffees;
}
public void deleteCoffee(long coffeeId) {
//파라미터: 삭제할 커피의 커피 식별자(long)
//
//리턴 값: 없음
//
//메서드 바디
//
//구현해야 할 내용 없습니다.
}
}
CoffeeController 및 CoffeeMapper 구현
|
- DTO 클래스 ↔ 엔티티 클래스 매퍼(Mapper) 구현
- CoffeeController의 핸들러 메서드에서 DTO 클래스와 Coffee 엔티티 클래스 매핑에 사용될 CoffeeMapper를 MapStruct로 구현하세요.
- CoffeeController 핸들러 메서드에서 CoffeeService 클래스의 메서드 호출 연동
- CoffeeController 핸들러 메서드에서 CoffeeService 클래스의 메서드를 호출해서 결과 데이터(Coffee 엔티티 객체)를 받아오세요. (’→’는 메서드 호출을 의미합니다.)
- postCoffee() → createCoffee()
- patchCoffee() → updateCoffee()
- getCoffee() → findCoffee()
- getCoffees() → findCoffees()
- deleteCoffee() → deleteCoffee()
- coffeeService.deleteCoffee() 메서드의 경우 리턴값이 없으므로 결과 데이터를 받아올 수 없음을 참고하세요.
- CoffeeController의 핸들러 메서드에 CoffeeMapper 적용
- CoffeeController의 핸들러 메서드에 CoffeeMapper를 적용하세요.
- 매퍼(Mapper)는 아래 상황에 필요합니다.
- CoffeeController 클래스에서 CoffeeService 클래스의 createCoffee(), updateCoffee() 메서드 호출 시
- CoffeeController 핸들러 메서드의 응답 데이터
|
package com.codestates.coffee;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.Positive;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/v5/coffees")
@Validated
public class CoffeeController {
private final CoffeeService coffeeService;
private final CoffeeMapper mapper;
public CoffeeController(CoffeeService coffeeService, CoffeeMapper mapper) {
this.coffeeService = coffeeService;
this.mapper = mapper;
}
@PostMapping
public ResponseEntity postCoffee(@Valid @RequestBody CoffeePostDto coffeePostDto)
//@RequestBody 어노테이션을 사용하여 CoffeePostDto객체를 받아온후 유효성 검사 후
{
Coffee coffee = mapper.coffeePostDtoToCoffee(coffeePostDto);
//mapper 객체를 이용하여 coffee 엔티티로 변환
Coffee response = coffeeService.createCoffee(coffee);
//coffeeService.createCoffee를 호출하여 Coffee엔티티를 저장한다
return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.CREATED);
}
@PatchMapping("/{coffee-id}")
public ResponseEntity patchCoffee(@PathVariable("coffee-id") @Positive long coffeeId,
@Valid @RequestBody CoffeePatchDto coffeePatchDto)
//@PathVariable : 경로 변수 받기
//@Positive : 양수인지 검사
{
coffeePatchDto.setCoffeeId(coffeeId);
//coffeePatchDto객체에 coffeeId설정
Coffee coffee = mapper.coffeePatchDtoToCoffee(coffeePatchDto);
//mapper 객체를 사용하여 coffeePatchDtoToCoffee객체로 변환
Coffee response = coffeeService.updateCoffee(coffee);
//변환된 Coffee엔티티를 coffeeService 객체의 updateCoffee() 메소드를 호출하여 업데이트
return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.OK);
}
@GetMapping("/{coffee-id}")
public ResponseEntity getCoffee(@PathVariable("coffee-id") long coffeeId)
//@PathVariable로 경로 변수를 받아온후 long 타입의 coffeeId에 변수 저장
{
Coffee response = coffeeService.findCoffee(coffeeId);
return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.OK);
}
@GetMapping
public ResponseEntity getCoffees() {
List<Coffee> response = coffeeService.findCoffees();
List<CoffeeResponseDto> responses = response.stream()
//stream()를 이욯애 스트림으로 변환
.map(m -> mapper.coffeeToCoffeeResponseDto(m))
//map() 사용해 mapper 객체를 이용해 각각의 엔티티를 CoffeeResponseDto로 변환
.collect(Collectors.toList());
//collect를 사용해 list 형태로 변환
return new ResponseEntity<>(responses, HttpStatus.OK);
}
@DeleteMapping("/{coffee-id}")
public ResponseEntity deleteCoffee(@PathVariable("coffee-id") long coffeeId) {
coffeeService.deleteCoffee(coffeeId);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
package com.codestates.coffee;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface CoffeeMapper {
Coffee coffeePostDtoToCoffee(CoffeePostDto coffeePostDto);
Coffee coffeePatchDtoToCoffee(CoffeePatchDto coffeePatchDto);
CoffeeResponseDto coffeeToCoffeeResponseDto(Coffee coffee);
}