스프링/미션

[Spring] racing - API 서버 구현(2)

문상휘파람 2024. 9. 30. 20:57

저번 포스팅에 이어 바로 제가 어떻게 구현했는지 보여드리고자 합니다. 

 

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 서버 구현을 완료해봤습니다. 정말 느낀 것이 많아서 느낀 점은 다음 포스팅에서 다루도록 하겠습니다.

 

감사합니다~~!