Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2단계 - 웹 자동차 경주] 우르(김현우) 미션 제출합니다. #135

Merged
merged 36 commits into from
Apr 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
cd77c2d
refactor : schema 스펙 변경
java-saeng Apr 13, 2023
72fab15
feat : bean validation 추가
java-saeng Apr 13, 2023
c40b2a1
refactor : column 명 변경
java-saeng Apr 13, 2023
585644b
feat : 게임 이력 조회 기능 구현
java-saeng Apr 13, 2023
2f1278b
feat : mock data 추가 및 data 초기화 path 변경
java-saeng Apr 13, 2023
450e8d7
refactor : RacingCarController, RaceResultService 자동차 움직임 method extract
java-saeng Apr 14, 2023
a7577cd
feat : RaceResultService Unit Test 작성
java-saeng Apr 18, 2023
add4aad
feat : RacingCarWebController Unit Test 작성
java-saeng Apr 18, 2023
c7fd7e9
feat : CarService Unit Test
java-saeng Apr 18, 2023
b59f890
style : code 제출 전 reformatting
java-saeng Apr 18, 2023
b4c6fc6
refactor : dto 를 Controller -> Service 패키지로 변경
java-saeng Apr 18, 2023
af5f873
feat : Car 에 created_at column 추가
java-saeng Apr 18, 2023
141f18b
feat : Service Integration Test 추가
java-saeng Apr 18, 2023
2c9f6e2
refactor : 경기 결과 저장 시 자동차 batch insert
java-saeng Apr 20, 2023
781f2c1
refactor : 경기 결과 생성일 경우 Http 상태코드 Created로 변경
java-saeng Apr 20, 2023
f501bcd
feat : 경기 결과 생성 시 자동차 저장까지의 로직을 논리적으로 묶기 위해 트랜잭션 사용
java-saeng Apr 20, 2023
4d50307
fix : batch insert 제대로 수행안되어 해결
java-saeng Apr 20, 2023
ca6898f
feat : exception handler 기능 추가
java-saeng Apr 20, 2023
1f39b72
test : input, output 에 의존되지 않게 수정
java-saeng Apr 20, 2023
a84ae91
feat : CarDao 에서 Entity 사용
java-saeng Apr 21, 2023
74d46a9
feat : RaceResultDao 에서 Entity 사용
java-saeng Apr 21, 2023
69faec4
feat : RaceResultDao 조회에서 도메인이 아닌 Entity 사용
java-saeng Apr 21, 2023
f8ae605
refactor : 패키지 변경
java-saeng Apr 21, 2023
b1ab8d0
refactor : CarDao SimpleJdbcInsert 를 인스턴스 필드로 변경
java-saeng Apr 21, 2023
e310a1f
feat : CarEntity로 변경시켜주는 CarMapper 추가
java-saeng Apr 21, 2023
994ac58
refactor : 모든 인스턴스 필드를 담고 있는 생성자 접근 제어자를 public -> private 변경
java-saeng Apr 21, 2023
12317c4
feat : domain 들의 움직임과 결과를 명령하는 RacingGame 추가
java-saeng Apr 21, 2023
000d97b
feat : RacingGame 추가에 따른 CarService 변경
java-saeng Apr 21, 2023
87f96b8
feat : java 에서 제공하는 기본 exception 에 대한 handling method 추가
java-saeng Apr 21, 2023
4f7b056
refactor : Random 대신 ThreadLocalRandom 사용
java-saeng Apr 21, 2023
95aebb3
feat : Car가 우승 여부를 가지고 있게 테이블 변경
java-saeng Apr 22, 2023
0f99a89
feat : Car 에 winner column 추가 후 코드 변경
java-saeng Apr 22, 2023
78dd809
feat : DB 관련 exception handler 추가
java-saeng Apr 22, 2023
775e9a1
style : 코드 제출 전 reformatting
java-saeng Apr 22, 2023
f4f9060
refactor : 사용하지 않는 메서드 삭제
java-saeng Apr 22, 2023
d4c33f8
feat : 데이터베이스 문제 생길 시 exception test
java-saeng Apr 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ dependencies {

implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

implementation 'org.springframework.boot:spring-boot-starter-validation'
}

tasks.named('test') {
Expand Down
70 changes: 11 additions & 59 deletions src/main/java/racingcar/controller/RacingCarController.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
package racingcar.controller;

import racingcar.domain.Car;
import racingcar.domain.RacingCars;
import racingcar.util.NumberGenerator;
import racingcar.view.InputView;
import racingcar.view.OutputView;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RacingCarController {

private static final int START_POSITION = 0;

private final OutputView outputView;
private final InputView inputView;
private final NumberGenerator numberGenerator;
Expand All @@ -27,63 +18,24 @@ public RacingCarController(final NumberGenerator numberGenerator) {
}

public void run() {
String[] carNames = readCarNamesStep();
RacingCars racingCars = generateRacingCarsStep(carNames);
int tryNum = readTryNumStep();
race(tryNum, racingCars);
showWinners(racingCars);
}
final String carNames = inputView.readCarNames();
int trialCount = inputView.readTryNum();

private String[] readCarNamesStep() {
outputView.printReadCarNamesMessage();
String[] carNames = inputView.readCarNames();
return carNames;
RacingCars racingCars = moveCars(carNames, trialCount);
showRaceResult(racingCars);
}

private RacingCars generateRacingCarsStep(String[] carNames) {
List<Car> cars = generateCars(carNames);
return null;
private void showRaceResult(final RacingCars racingCars) {
showWinners(racingCars);
}

private List<Car> generateCars(String[] carNames) {
return Arrays.stream(carNames)
.map(carName -> new Car(carName, START_POSITION))
.collect(Collectors.toUnmodifiableList());
private RacingCars moveCars(String carNames, int trialCount) {
RacingCars racingCars = RacingCars.makeCars(carNames);
racingCars.moveAllCars(trialCount, numberGenerator);
return racingCars;
}

private void showWinners(RacingCars racingCars) {
List<String> winners = convertWinnersNameForPrint(racingCars.getWinners());
outputView.printWinners(winners);
}

private void race(int tryNum, RacingCars racingCars) {
outputView.printRacingResultMessage();
for (int repeatIndex = 0; repeatIndex < tryNum; repeatIndex++) {
List<Car> currentCars = racingCars.getCars();
for (Car currentCar : currentCars) {
int randomValue = numberGenerator.generate();
currentCar.move(randomValue);
}
outputView.printCurrentRacingCarsPosition(convertRacingCarsResultForPrint(currentCars));
}
}

private int readTryNumStep() {
outputView.printReadTryNumMessage();
return inputView.readTryNum();
}

private Map<String, Integer> convertRacingCarsResultForPrint(List<Car> currentCars) {
Map<String, Integer> racingCarsResult = new HashMap<>();
for (Car currentCar : currentCars) {
racingCarsResult.put(currentCar.getName(), currentCar.getPosition());
}
return racingCarsResult;
}

private List<String> convertWinnersNameForPrint(List<Car> winners) {
return winners.stream()
.map(Car::getName)
.collect(Collectors.toList());
outputView.printWinners(racingCars);
}
}
27 changes: 16 additions & 11 deletions src/main/java/racingcar/controller/RacingCarWebController.java
java-saeng marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
package racingcar.controller;

import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import racingcar.controller.dto.GameInfoRequest;
import racingcar.controller.dto.RaceResultResponse;
import racingcar.controller.validator.GameOptionValidator;
import racingcar.service.RaceResultService;
import racingcar.service.dto.GameInfoRequest;
import racingcar.service.dto.RaceResultResponse;

import java.util.List;

@RestController
public class RacingCarWebController {

private final GameOptionValidator gameOptionValidator;
private final RaceResultService raceResultService;

public RacingCarWebController(final GameOptionValidator gameOptionValidator,
final RaceResultService raceResultService) {
this.gameOptionValidator = gameOptionValidator;
public RacingCarWebController(final RaceResultService raceResultService) {
java-saeng marked this conversation as resolved.
Show resolved Hide resolved
this.raceResultService = raceResultService;
}

@PostMapping("/plays")
public RaceResultResponse registerRaceResult(@RequestBody final GameInfoRequest gameInfoRequest) {

gameOptionValidator.validateGameOption(gameInfoRequest);

@ResponseStatus(code = HttpStatus.CREATED)
public RaceResultResponse registerRaceResult(@Validated @RequestBody final GameInfoRequest gameInfoRequest) {
java-saeng marked this conversation as resolved.
Show resolved Hide resolved
return raceResultService.createRaceResult(gameInfoRequest);
}

@GetMapping("/plays")
public List<RaceResultResponse> showRaceResult() {
return raceResultService.searchRaceResult();
}
}
18 changes: 0 additions & 18 deletions src/main/java/racingcar/controller/dto/GameInfoRequest.java

This file was deleted.

This file was deleted.

43 changes: 43 additions & 0 deletions src/main/java/racingcar/dao/CarDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package racingcar.dao;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import racingcar.entity.CarEntity;

import java.util.List;

@Repository
public class CarDao {

private final JdbcTemplate jdbcTemplate;
private final SimpleJdbcInsert simpleJdbcInsert;
private final RowMapper<CarEntity> rowMapper = (rs, rowNum) ->
new CarEntity(
rs.getLong("id"),
rs.getString("name"),
rs.getInt("position"),
rs.getLong("race_result_id"),
rs.getBoolean("winner"),
rs.getTimestamp("created_at").toLocalDateTime()
);

public CarDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
this.simpleJdbcInsert =
new SimpleJdbcInsert(jdbcTemplate)
.withTableName("CAR")
.usingGeneratedKeyColumns("id");
}

public void save(final List<CarEntity> carEntities) {
simpleJdbcInsert.executeBatch(SqlParameterSourceUtils.createBatch(carEntities));
}

public List<CarEntity> findAll() {
final String sql = "select * from CAR";
return jdbcTemplate.query(sql, rowMapper);
}
}
25 changes: 25 additions & 0 deletions src/main/java/racingcar/dao/RaceResultDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package racingcar.dao;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import racingcar.entity.RaceResultEntity;

@Repository
public class RaceResultDao {

private final SimpleJdbcInsert simpleJdbcInsert;

public RaceResultDao(final JdbcTemplate jdbcTemplate) {
this.simpleJdbcInsert =
new SimpleJdbcInsert(jdbcTemplate)
.withTableName("RACE_RESULT")
.usingGeneratedKeyColumns("id");
}

public Long save(final RaceResultEntity raceResultEntity) {
return simpleJdbcInsert.executeAndReturnKey(new BeanPropertySqlParameterSource(raceResultEntity))
.longValue();
}
}
31 changes: 0 additions & 31 deletions src/main/java/racingcar/dao/car/CarDao.java

This file was deleted.

26 changes: 0 additions & 26 deletions src/main/java/racingcar/dao/car/dto/CarRegisterRequest.java

This file was deleted.

34 changes: 0 additions & 34 deletions src/main/java/racingcar/dao/raceresult/RaceResultDao.java

This file was deleted.

This file was deleted.

4 changes: 4 additions & 0 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ public boolean isSamePositionCar(Car maxPositionCar) {
return this.position == maxPositionCar.position;
}

public boolean isSameCar(Car car) {
return this.name.equals(car.name);
}

public String getName() {
return name;
}
Expand Down
Loading