저번 포스팅에 이어 바로 제가 어떻게 구현했는지 보여드리고자 합니다.
2. 자동차 경주 시작(Post)
* WebController
@PostMapping("/cars/racing")
private ResponseEntity<Void> starRace() {
racingService.startRace();
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
컨트롤러는 위와 같이 구현하였습니다.
경주만 시작하면 되고, Response가 따로 정해진게 없어서 Response 를 넘겨주지 않았습니다.
*RacingService
public void startRace() {
for (int i = 0; i < carRepository.findTryCount(); i++) {
moveCars();
}
}
private void moveCars() {
for (Car car : carRepository.findAllCars()) {
car.moveCar(createRandomNumber);
}
}
저번 포스팅에서 설명드린 CarRepository에서 저장된 자동차들과 경주 횟수를 꺼내와 경주를 시작하는 메서드를 구현하였습니다.
여기서 중요한 포인트는 createRandomNumber 입니다.
* CarRandomNumber
@Component
public class CarRandomNumber implements CreateRandomNumber {
private static final Random randomNumberGenerator = new Random();
private static final int LAST_NUMBER = 10;
@Override
public int generateRandomNumber() {
return randomNumberGenerator.nextInt(LAST_NUMBER);
}
}
createRandomNumber를 RacingService 객체 안에서 사용하기 위해 CreateRandomNumber 를 상속 받는 CarRandomNumber 클래스를 @Component 어노테이션으로 Bean 등록하였습니다.
이를 통해 RacingService 객체 안에서 해당 인터페이스 구현체를 이용할 수 있었습니다.
결과
postman을 통해 잘 실행되는 것을 볼 수 있습니다.
3. 자동차 경주 결과 조회(GET)
* WebController
@GetMapping("/cars")
private ResponseEntity<CarResultResponse> getResult() {
return ResponseEntity.ok(racingService.getResult());
}
RacingService에서 값을 dto로 반환하도록 하여 컨트롤러에서 ResponseEntity에 담아주었습니다.
*RacingService
public CarResultResponse getResult() {
List<Car> carBundle = carRepository.findAllCars();
Cars cars = new Cars(carBundle, true);
List<String> winner = cars.getWinner();
return CarResultResponse.from(String.join(",", winner), getCarStatuses(carBundle));
}
private List<CarStatusResponse> getCarStatuses(List<Car> cars) {
List<CarStatusResponse> carStatuses = new ArrayList<>();
for (Car car : cars) {
carStatuses.add(CarStatusResponse.from(car.getCarName(), car.getMoveCount()));
}
return carStatuses;
}
getCarStatues 메서드에서 자동차 이름 + 움직임 결과를 반환해주는 로직을 구현하였고,
getResult 메서드에서는 우승자를 뽑고 + getCarStatues 반환값 을 합쳐 반환해주는 로직을 작성하였습니다.
* 결과
반환값이 제대로 나오는 것을 확인할 수 있습니다.
4. 자동차 경주 결과 개별 조회(GET)
* WebController
@GetMapping(value = "/cars", params = "name")
private ResponseEntity<CarStatusResponse> getResultByName(@RequestParam("name") String name) {
return ResponseEntity.ok(racingService.getResultByName(name));
}
구현 목록 request 값에 ?name 형식이 있었기에 @RequestParam 어노테이션을 사용하였습니다.
*RacingService
public CarStatusResponse getResultByName(String name) {
Car car = carRepository.findCarByName(name)
.orElseThrow(() -> new CustomException(CustomErrorCode.EXCEPTION_CAR));
return CarStatusResponse.from(car.getCarName(), car.getMoveCount());
}
이름으로 받는 경우, 서비스 로직은 매우 간단합니다.
CarRepository 에서 Controller 에서 받은 자동차 이름으로 조회하여 해당 자동차 정보를 가져올 수 있었습니다.
반환값은 CarStatusResponse(dto) 로 반환해주었습니다.
* 결과
결과가 잘 나오는 것을 볼 수 있습니다.
이렇게 racing API 서버 구현을 완료해봤습니다. 정말 느낀 것이 많아서 느낀 점은 다음 포스팅에서 다루도록 하겠습니다.
감사합니다~~!
'스프링 > 미션' 카테고리의 다른 글
[Spring] lotto - 미션 소개와 기능 구현 목록 정리 (0) | 2024.10.01 |
---|---|
[Spring] racing - 후기 (1) | 2024.10.01 |
[Spring] racing - API 서버 구현(1) (0) | 2024.09.30 |
[Spring] racing 콘솔 테스트 코드 작성 - 인터페이스는 어떻게 테스트 해야할까? (1) | 2024.09.30 |
[Spring] racing - 콘솔 프로그램 구현 (0) | 2024.09.30 |