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

[1단계 - 웹 자동차 경주] 마코(이규성) 미션 제출합니다. #54

Merged
merged 18 commits into from
Apr 17, 2023

Conversation

aak2075
Copy link

@aak2075 aak2075 commented Apr 13, 2023

안녕하세요 마코입니다.

학습 테스트에서 진행했던 내용들을 정리하면서 자동차 경주 게임을 웹 애플리케이션으로 구현해봤습니다.

진행하면서 궁금한 점들이 있어서 따로 질문남깁니다.

의존성 주입

현재 컨트롤러에서 RacingCarService 의 인스턴스를 직접 생성해주고 있습니다.
여기서 의존성을 직접 주입해주고 있습니다.

RacingCarService@Autowired로 생성자 주입을 해주려면 RacingCarService 의 필드인 Cars , NumberGenerator@component로 컨테이너에 빈을 등록해주어야 합니다. 도메인 객체를 직접 빈으로 등록해주는 방법은 좋지 않다고 생각합니다. 이런 도메인 객체를 Service에서 어떻게 관리하는 것이 좋을지 잘 모르겠습니다.

테스트

도메인 테스트에서 도메인이 잘 작동하는 것을 확인할 수 있기 때문에 응답이 정상적으로 생성됐는지만 테스트했습니다. 이 정도의 테스트만 진행해도 충분하다고 생각하는데 어떻게 생각하시는지 궁금합니다.

DAO와 Repository

DAO가 database를 직접 조작하고, Repository에서는 DAO를 사용하는 로직을 담고 있습니다. 즉, DB에 원하는 데이터를 저장하는 로직을 Repository에 추상화 했습니다. 이것이 DAO와 Repository의 역할이 맞는건지 궁금합니다.

@joseph415
Copy link

joseph415 commented Apr 14, 2023

의존성 주입

컨트롤러에서 서비스 의존성을 직접 주입을 하게 되면 결합하려는 객체가 구현이 안되면, 테스트또한 불가능하고요.
그리고 스프링의 장점도 사용하지 못하게 됩니다. (객체의 라이프사이클을 담당하는 스프링이 가져가는 것)

스프링은 ioc를 사용해서 di를 해주게 되는데 이것으로 ocp를 만족하는 코드를 만들어주게 됩니다. 따라서 빈으로 설정할 수 있는 것들은 빈으로 설정하여 객체의 라이프사이클 관리를 스프링에 넘기도록 변경해주시면 좋을 것 같아요.

그리고 몇가지 생각해보시면 좋을 것 같은데요.

  1. Service의 역할
  2. Service의 역할을 생각해볼 때, Cars라는 상태를 갖을 필요가 있을지
    • 즉, 상태관리가 필요해서 RacingService를 엔티티로 봐야할지? (RacingService는 Cars가 달라질때마다 인스턴스를 생성해야하는지)

이 부분 생각해보시고 답변 한번 달아주세요. 같이 고민해보ㅏ요

테스트

네~ E2E 테스트나 DB 테스트는 현재 필수가 아니여서 이정도까지만 진행해도 좋다고 생각합니다~ 도메인테스트는 필수로 들어가야하고요!

DAO와 Repository

도메인 객체를 저장소에 저장해야 할때, Repositoryㄹ를 사용합니다. 즉, Repository 는 도메인 객체를 저장하는 역할을 합니다.
DAO는 data acess object로 좀 더 큰 의미라고 생각하시면 될 것 같아요.

도메인이란 우리가 해결하고 싶은 영역이고, 도메인 객체는 그 것을 풀어나가기 위한 객체들로 구성되어 있잖아요? 따라서 도메인 객체를 저장소에 저장하고 가져오려는 행위를 repository를 사용해 가져오게 됩니다.

여기서 중요한 차이는 도메인 객체입니다. repository는 도메인 객체를 저장소에 관리를 하기 위해 사용하는 모델이고, dao는 그런 개념이 들어간 것이 아닌, 저장소 접근을 하는 오브젝트입니다. 이 차이를 잘 구분하시면 좋을 것 같습니다.

추가질문

웹 관련 기능을 추가하면서 스프링을 적용해주셨는데, 어떤 장점을 느끼셨나요?! 마코는 스프링이 제공해주는 장점이 무엇이 있을지 생각해보신적이 있으실까요? 한번 같이 간단하게 이야기해보면 좋을 것 같습니다!

Copy link

@joseph415 joseph415 left a comment

Choose a reason for hiding this comment

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

안녕하세요 마코

리뷰어 서브웨이입니다! 1단계 구현 잘해주셨네요💯
1차적으로 리뷰 달았습니다! 확인 부탁드려요!
궁금한 사항은 맘편히 DM 또는 리뷰 코멘트 달아주세요!
확인이 완료된 리뷰는 resolve conversation 눌러주시면 감사하겠습니다.

src/main/java/racingcar/domain/Car.java Show resolved Hide resolved
src/main/java/racingcar/dto/RacingGameRequestDto.java Outdated Show resolved Hide resolved
src/main/java/racingcar/service/RacingCarService.java Outdated Show resolved Hide resolved
src/main/java/racingcar/view/OutputView.java Outdated Show resolved Hide resolved
Copy link

@joseph415 joseph415 left a comment

Choose a reason for hiding this comment

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

안녕하세요 마코.

첫번째 리뷰에 대한 추가 코멘트 드렸습니다.
확인 부탁드립니다.

@joseph415
Copy link

마코 제가 남긴 추가 질문에 대한 답변이 안달려서 따로 코멘트 드려요 :)
#54 (comment)

@aak2075
Copy link
Author

aak2075 commented Apr 17, 2023

안녕하세요 서브웨이 마코입니다.

가이드를 잘 해주신 덕분에 결론이 많이 내려진 것 같습니다.

말씀해주신대로 상위 도메인 객체인 RacingGame을 추가했습니다.

이를 통해 로직이 훨씬 깔끔해진 것 같습니다.

추가 질문을 답변을 안했었네요!😅

추가 질문 답변

웹 관련 기능을 추가하면서 스프링을 적용해주셨는데, 어떤 장점을 느끼셨나요?! 마코는 스프링이 제공해주는 장점이 무엇이 있을지 생각해보신적이 있으실까요? 한번 같이 간단하게 이야기해보면 좋을 것 같습니다!

스프링을 사용하면서 느낀 가장 큰 장점은 관심사의 분리입니다. 기존에는 의존성들을 직접 주입해주고, 트랜잭션의 ACID를 보장하려면 직접 코드로 작성해야 하지만 이러한 작업들을 스프링에서 담당해주고, 비즈니스 로직에 집중할 수 있다는 것이 가장 큰 장점이라고 생각합니다. 아직은 스프링의 기능 중 일부만 사용해봤지만 다른 기능들도 같은 목표를 달성하기 위해 사용할 것 이라고 생각합니다. 또한, POJO를 지킬 수 있다는 것이 장점인 것 같습니다. 다른 프레임워크는 아직 사용해보지 않았고 글로만 POJO를 지킨다 라고 배우기는 했지만 실제로 비즈니스 레이어까지는 계속해서 객체를 사용할 수 있다는 것을 느꼈습니다.

@joseph415
Copy link

joseph415 commented Apr 17, 2023

스프링의 장점에 대해서 잘 알고 계신것 같네요👍 POJO에 대해서도 잘 알고 계신것 같고요.
말씀주신대로 관심사의 분리를 통해서 개발자는 비지니스에 집중할 수 있는 코드를 만들 수 있도록 해주는것이 가장 큰 장점이라고 생각합니다.

웹 기능을 추가했지만, 대부분 스프링이 만들어둔 추상화를 이용해서 어떤 웹관련된 코드도 저희가 크게 작성한 것이 없으니까요~

#54 (comment) 여기에서 말씀드린 것처럼 지금은 아니고ㅎㅎ.. 스프링에 대해서 많이 익숙해지셨다면, 한번 해당 책 읽어보시는거 추천해요~ 저는 이해에 많은 도움을 얻었습니다!

Copy link

@joseph415 joseph415 left a comment

Choose a reason for hiding this comment

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

안녕하세요. 마코

리뷰 적용되고나서 전체적으로 코드가 많이 좋아진것 같습니다.👍
1단계 리뷰는 이만 여기서 merge 하겠습니다. 간단한 리뷰 몇개 남겼는데, 2단계에서 적용부탁드릴게요.

import java.util.List;
import java.util.stream.Collectors;

public class RacingGame {

Choose a reason for hiding this comment

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

2단계에서 도메인 테스트 작성해주시면 좋을 것 같습니다.


public interface RacingGames {

RacingGame save(RacingGame racingGame);

Choose a reason for hiding this comment

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

도메인 객체 리턴 👍

}

@Override
public RacingGame save(RacingGame racingGame) {

Choose a reason for hiding this comment

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

위의 답변으로 id 관련해서 리뷰 남겼습니다.

import java.util.List;
import java.util.stream.Collectors;

public class RacingGameMapper {

Choose a reason for hiding this comment

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

👍

@joseph415 joseph415 merged commit 73897ea into woowacourse:aak2075 Apr 17, 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.

3 participants