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단계 - 웹 자동차 경주] 허브(방대의) 미션 제출합니다. #128

Merged
merged 37 commits into from
Apr 20, 2023

Conversation

greeng00se
Copy link
Member

안녕하세요 라빈🍦 잘 지내셨나요?

2단계 구현해서 제출합니다!

요구사항 이외에 추가 및 수정된 부분은 다음과 같습니다.

  1. RestControllerAdvice 사용하여 예외처리
  2. request, response 형식 변경 및 프론트에도 적용 => 참가자, 우승자를 콤마로 구분된 문자열이 아닌 List 을 받도록 수정했습니다.
  3. 테이블 수정 => Car 테이블이 winner 필드를 가지도록 했습니다.
  4. validation 적용
  5. 기존의 post 요청에서 created status로 반환하도록 수정(location은 리소스 생성 위치에 대한 api가 없어서 적용하지 않았습니다!)
  6. 콘솔 애플리케이션은 dao를 사용하지 않아서, service에 빈 구현체를 주입하여 사용했습니다.

그 외 작게 작게 수정했습니다!

Copy link

@giantim giantim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

허브 안녕하세요! 리뷰어 라빈입니다 👋
1단계 부터 느꼈는데 굉장하시네요 👍 서비스 계층 하나로 콘솔과 웹 애플리케이션의 공통 부분을 잘 분리하고 의존성 주입도 정말 잘 활용해주셨어요. 어떤 방식으로 의존성 주입이 동작하는지, 어떻게 구현해야하는지 정말 잘 이해하고 계신것 같습니다!
정말 간단한 피드백 남겨드렸는데 확인 부탁드릴께요 😉

carDao.saveAll(gameId, cars);
final GameEntity gameEntity = racingGameMapper.toGameEntity(gameRequest.getCount());
final int gameId = gameDao.saveAndGetId(gameEntity)
.orElseThrow(() -> new IllegalArgumentException("게임 저장에 실패하였습니다."));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

던지는 예외에서 조금 고민이 있네요!
엔티티를 정상적으로 생성한 이후에 데이터베이스에 저장하는 과정에서 발생한 예외에 대한 처리로 보여지는데요. IllegalArgumentException이 아닌 다른 예외를 던져보는것은 어떨까요? ☺️

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

말씀해주신대로 다른 예외를 던지는 것이 좋아보입니다.
현재는 저장이 되지 않은 것이니 IllegalStateException을 적용해보도록 하겠습니다! 👍

Comment on lines 5 to 10
public class CarEntity {
private Integer id;
private String name;
private int position;
private boolean winner;
private Integer gameId;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDE에서 final로 추천해주네요 😉

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

앗 이 부분 final을 빼먹었군요 😢 꼼꼼하게 봐주셔서 감사합니다!

() -> assertThat(carEntity.getId()).isPositive(),
() -> assertThat(carEntity.getName()).isEqualTo("car1"),
() -> assertThat(carEntity.getPosition()).isEqualTo(1),
() -> assertThat(carEntity.isWinner()).isEqualTo(false),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

boolean을 검증할때는 isFalse() / isTrue() 등을 활용해보면 어떨까요? 😉

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 것 같습니다! 바로 적용하겠습니다 😄


// then
assertThat(id).isPositive();
assertThat(gameId.isPresent()).isTrue();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional의 존재를 검사하는 isPresent()를 활용해보면 어떨까요?😉

Suggested change
assertThat(gameId.isPresent()).isTrue();
assertThat(gameId).isPresent();

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional 검사할 때 isPresent를 사용할 수 있군요! 처음 알았습니다. 👍👍👍

@greeng00se
Copy link
Member Author

안녕하세요 라빈! 아침에 리뷰해주셔서 편하게 리뷰 반영할 수 있어서 너무 좋았습니다. 😄
남겨주신 코멘트 덕분에 더욱 꼼꼼하게 코드를 작성할 수 있었던 것 같습니다!
리뷰를 반영하고 추가로 통합 테스트도 작성해보았습니다!
꼼꼼하게 코드 봐주셔서 정말 감사합니다~ 👍


final List<CarEntity> carEntities = racingGameMapper.toCarEntities(game, gameId);
carDao.saveAll(carEntities);

return GamePlayResponseDto.of(game.findWinners(), game.getCars());
}

@Transactional
@Transactional(readOnly = true)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와,,,, 허브 굉장하시네요 👍
지금과 같이 하나의 클러스터를 사용하는 경우에는 영향이 없겠지만 나중에 규모있는 애플리케이션을 작성할 때는 항상 신경써야 하는 부분이에요. 정말 선행학습이 잘 되어있으시네요 👏

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

칭찬을 받으니 너무 좋습니다👍🏻 라빈의 기운 받고 꾸준히 정진 하겠습니다!!

Comment on lines +33 to +38
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
@SuppressWarnings("NonAsciiCharacters")
public class RacingGameIntegrationTest {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요거는 저희 팀에서 관리하는 컨벤션인데요.
하나의 클래스에 다양한 어노테이션을 붙일 때 중요도가 높은 어노테이션일 수록 클래스 이름에 가깝게 명시해주고 있어요. 해당 클래스가 어떤 도움을 받고 있는지 빠르게 파악하기 위해서요.
중요도를 선정하는 기준은 스프링 프레임워크를 사용하고 있고, 해당 클래스가 빈인지, 설정 파일인지 등을 명시해주는 어노테이션을 가장 먼저 사용하고 그 이후에 부가적인 어노테이션들을 붙이고 있어요. 이 테스트 클래스를 기준으로 본다면 @SpringBootTest -> @AutoConfigureMockMvc -> @transactional -> @DisplayNameGeneration -> @SuppressWarnings 순이 되겠네요!
이 피드백은 반드시 따르거나 지켜야하는건 아니고 허브가 어떤 방식이 클래스를 봤을 때 무엇을 하는지 파악하기 쉬운지 고민해보셔도 좋을거 같아요 😉

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

중요도에 의해 순서를 결정하는 부분 좋은 것 같습니다. 확실히 해당 클래스가 어떤 애너테이션에 제일 영향을 많이 받는지 한 눈에 이해할 수 있을 것 같아요!
다음 미션부터 적용하도록 해보겠습니다!
실무에서 직접 사용하고 있는 컨벤션에 대한 부분을 리뷰로 남겨주셔서 정말 좋은 것 같습니다!👍🏻👍🏻👍🏻

Copy link

@giantim giantim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

허브 안녕하세요! 라빈입니다 👋
통합테스트 작성까지 정말 굉장하시네요~~ 👍 각 계층에 대한 이해도가 충분하시고 코드 중복 분리도 정말 잘 하시고 테스트로 검증까지 대단합니다! 많은 리뷰 못드려서 죄송하네요 😂
이번 단계는 여기까지 충분한것 같고 몇가지 코멘트만 남겨드렸어요. 고생 많으셨습니다!

@giantim giantim merged commit 72a6ccf into woowacourse:greeng00se Apr 20, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants