스프링/미션

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

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

콘솔 프로그램을 구현했으니, API 서버를 구현할 차례입니다. 

 

API 서버 구현 규칙은 다음과 같습니다. 

 

서버 구현 규칙

racing API 미션 안내

 

미션 설명 란에 처음 보는 단어들이 많은 것 같습니다. 해당 키워드들은 따로 정리하여 포스팅하려고 합니다.

 

 

다음은 API 명세서 입니다.

구현해야할 API는 다음과 같습니다.

 

API 명세서

 

이렇게 총 4개의 기능을 구현하면 됩니다.


이제 바로 기능 구현으로 넘어가도록 하겠습니다. 

 

1. 자동차 이름 등록(POST)

 

* WebController

@PostMapping("/create")
private ResponseEntity<Void> createCars(@RequestBody CreateRequest createRequest) {
    racingService.createCars(createRequest);
    return ResponseEntity.status(HttpStatus.CREATED).build();
}

 

 

컨트롤러 코드는 위와 같이 구현하였습니다.

한 가지 아쉬운 점은 생성된 이름을 CreateResponse(dto) 를 통해 어떤 자동차가 생성되었는지 알 수 있는 코드를 작성하지 못 한 점이 아쉽습니다. 또한, Restful 규칙에 따라 엔드포인트를 /cars 로 했어야 했는데 이 부분을 지키지 못했습니다.

 

 

* CreateRequest

public record CreateRequest(String name, int tryCount) {
}

 

해당 dto는 record 클래스로 구현하였습니다.

 

 

* RacingService

public void createCars(CreateRequest createRequest) {
    Cars cars = new Cars(new CarNameParser(createRequest.name()).getCarNames());
    carRepository.saveCars(cars, createRequest.tryCount());
}

 

콘솔 프로그램에서 구현한 CarNameParser를 이용해 json 값으로 들어온 자동차 이름을 분리하여, 그 값을 Cars 도메인에 생성자 매개변수에 전달하였습니다.

 

자동차들이 만들어지면 해당 자동차들과 경주를 시도할 횟수(tryCount)를 repository에 저장하였습니다.

 

참고로 CarRepository 는 다음과 같이 작성하였습니다.

 

 

* CarRepository

@Repository
public class CarRepository {

    private final Map<String, Car> database = new LinkedHashMap<>();
    private int tryCount;

    public void saveCars(Cars cars, int tryCount) {
        for (Car car : cars.getCars()) {
            database.put(car.getCarName(), car);
        }
        this.tryCount = tryCount;
    }

    public List<Car> findAllCars() {
        return new ArrayList<>(database.values());
    }

    public int findTryCount() {
        return tryCount;
    }

    public Optional<Car> findCarByName(String name) {
        return Optional.ofNullable(database.get(name));
    }
}

 

Map 자료구조 형태로 구현하였고, 

자동차와 경주 횟수를 저장하는 메서드, 모든 자동차를 불러오는 메서드, 경주 횟수를 불러오는 메서드, 자동차 이름으로 Car 객체를 꺼내오는 메서드를 구현하였습니다.

 

 

결과

 

postman을 통해 결과를 확인하였습니다. 자동차들이 제대로 생성된 것을 확인할 수 있습니다.


 

생각보다 포스팅이 길어져서 api 기능 2,3,4 번은 다음 포스팅에서 다루겠습니다.