-
Notifications
You must be signed in to change notification settings - Fork 47
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
[team-13 새리] API 구현 #27
base: team-13
Are you sure you want to change the base?
Conversation
Game에 id, 게임이 가진 두 팀 아이디를 바탕으로 조인을 이용해 팀 이름 가져오기
에러코드 등 구체적인 예외 구현은 나중에 할 예정
플레이어 테이블이 팀 테이블을 가리킬 수 있도록 스키마도 변경
우선은 아이디로 팀을 찾아주는 메서드만 구현했다
TeamDTO가 팀의 아이디, 팀 이름, 해당 팀의 선수들을 다 불러오고 TeamRecordDTO로 감싸서 내보낸다
기존의 게임, 팀, 플레이어 NotFoundException들이 상속받을 수 있도록 구현
에러코드만 넣으면 그에 맞는 http status와 메세지를 꺼내올 수 있는 static 메서드 구현
만들어 둔 커스텀 예외들을 처리하는 핸들러 close #9
맞춰둔 형식에 맞게 반환하기 위해 GameStatusDTO를 반환한다
어차피 ErrorCode를 통해 생성될 객체이므로 인자로 ErrorCode만 받도록 수정했다
선택한 팀의 isPlayable 상태가 false일 때 발생시키는 예외
average 계산이 필요해서 추가했다
Feat/ios/10/network service
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어려운 프로젝트를 혼자 진행하고 있으시군요. 응원합니다 👍
GameService
가 TeamRepository
를 가져도 된다고 생각하고, 그런 구현을 시도해 보시면 좋겠다는 생각이 드네요.
컨트롤러 설계에 대한 제 생각을 포함해서 이외에도 몇 가지 피드백 남겨보았습니다.
확인하시고, 질문이 있다면 다시 남겨주세요! 감사합니다. 💯
|
||
import org.springframework.data.relational.core.mapping.Column; | ||
|
||
public class GameListDTO { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DTO인데 @Column
이 있는 것은 좀 어색한데, DTO인가요? 엔티티인가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아 이 부분도 질문으로 여쭤보려했는데 깜빡했어요! DTO입니다! GameListDTO를 받아오는 레포지토리 부분을 쿼리로 짜고 컬럼명 다 맞추고 MySQL에서 쿼리가 잘 작동하는 부분까지 확인했습니다. 하지만 json으로는 모두 null로 나왔고 @Column
을 붙이고 해결했지만 관련부분 검색해보아도 나오는 게 없었습니다ㅠㅡㅠ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@min27604 댓글이 좀 늦었네요. 죄송합니다. ㅠㅠ
DTO를 받아오는 이라고 하셨는데 어디서 받아오시는 건가요? 보통의 설계로는, 레포지토리를 통해 DB row <-> Entity class 간의 정보 교환을 하고, entity <-> DTO는 다시 한 번 정보 전파 및 가공이 이뤄지는 부분인데요. 혹시 한 단계를 빼먹은 건 아니려나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@wheejuni 앗 네 맞아요 DB에서 가져올 때 game의 정보와 team의 정보가 조인으로 섞여있어 바로 DTO로 가져오게 했습니다.. 이렇게 하면 안 되는 거였군요ㅠㅡㅠ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@min27604 네 맞습니다. 서로 절대 존재를 알아차리지 못하게 해주세요. (DTO - 엔티티 간)
물론 작업하다보면 변환하는 로직이 필요해서 완전히 그렇게 고립시키기는 어렵지만, 최대한 노력해 보시는게 좋아요.
BE/baseball/src/main/java/com/codesquad/baseball/DTO/record/PlayerRecordDTO.java
Outdated
Show resolved
Hide resolved
BE/baseball/src/main/java/com/codesquad/baseball/DTO/record/PlayerRecordDTO.java
Outdated
Show resolved
Hide resolved
BE/baseball/src/main/java/com/codesquad/baseball/DTO/record/PlayerRecordDTO.java
Outdated
Show resolved
Hide resolved
BE/baseball/src/main/java/com/codesquad/baseball/DTO/score/TeamScoreDTO.java
Outdated
Show resolved
Hide resolved
private final GameService gameService; | ||
private final TeamService teamService; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/baseball/game
, /baseball/team
과 같은 스타일로 컨트롤러가 분리됐으면 좋겠다는 생각이 듭니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네 수정했습니다!
BE/baseball/src/main/java/com/codesquad/baseball/controller/GameController.java
Outdated
Show resolved
Hide resolved
BE/baseball/src/main/java/com/codesquad/baseball/controller/GameController.java
Outdated
Show resolved
Hide resolved
BE/baseball/src/main/java/com/codesquad/baseball/controller/GlobalExceptionHandler.java
Show resolved
Hide resolved
Co-authored-by: Hwijun Jeong <[email protected]>
fix min27604/baseball#39
GameService에 TeamRepository를 주입받아 컨트롤러 안의 로직을 최소화 시켰다
쿼리를 통해 DB에서 바로 DTO로 꺼내왔던 기존의 코드에서 DB에서 entity class로, 또 거기서DTO로 가공해 가져오도록 수정했다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
9일이나 지났는데 못 보고 있었습니다. 죄송합니다 ㅠㅠ
간단한 피드백 하나 남겼는데 크게 문제는 없어 보이거든요.
스트림 API를 더 적극적으로 활용해서 리팩 해보면 어떨까 싶긴 한데요, 새리가 보시고 필요하다고 생각되면 진행해주세요.
일단 이 PR은 머지하지 않고 피드백만 남겨둘게요. 감사합니다.
|
||
import org.springframework.data.relational.core.mapping.Column; | ||
|
||
public class GameListDTO { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@min27604 네 맞습니다. 서로 절대 존재를 알아차리지 못하게 해주세요. (DTO - 엔티티 간)
물론 작업하다보면 변환하는 로직이 필요해서 완전히 그렇게 고립시키기는 어렵지만, 최대한 노력해 보시는게 좋아요.
private Long awayTeamId; | ||
|
||
public static GameListDTO of(Long gameId, Team homeTeam, Team awayTeam) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 좋네요.
Team homeTeam = teamService.browseTeamById(game.getHomeTeamId()); | ||
Team awayTeam = teamService.browseTeamById(game.getAwayTeamId()); | ||
return new TeamRecordDTO(homeTeam, awayTeam); | ||
return gameService.browseTeamPlayersByGameId(gameId); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
훨씬 깔끔하네요. 이게 컨트롤러가 지향해야 할 모습입니다.
Iterable<Game> games = gameRepository.findAll(); | ||
List<GameListDTO> gameList = new ArrayList<>(); | ||
for (Game game : games) { | ||
Long id = game.getId(); | ||
gameList.add(GameListDTO.of(id, findHomeTeamByGameId(id), findAwayTeamByGameId(id))); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
games
할당 없이 gameRepository.findAll()
에서 출발해서 쭉 뻗어나올 수 있을 것 같은 느낌이 드는데요?
어떻게 할 수 있을까요? .map()
적절히 활용하면 가능하지 않을까요?
이러면 .collect()
해서 바로 리턴까지 한 큐에 가능할 것 같은데요. 물론 취향 문제라 새리가 판단하시는 대로 하면 되긴 해요
안녕하세요 새리입니다.
게임관련 프로젝트가 처음이어서인지 아님 혼자하는 프로젝트가 처음이어서인지 이번 프로젝트는 설계부터(항상 설계가 제일 어렵다고 느끼지만) 너무 복잡하게 느껴졌습니다. 어차피 설계를 꼼꼼히 한다고 해도 구현하다보면 요구사항 분석으로 돌아가 빠진부분을 찾게될 것 같아 처음에는 테이블을 최소한으로 잡고(Game, Team, Player) 기능도 최소한으로 잡고(ㅠㅡㅠ) 구현을 시작했습니다.
browseAllScore()
(line 55-59)를 구현하면서 GameScoreDTO를 만드는 부분까지 서비스단에서 해결하고 싶었지만 gameId로 팀을 불러올 수 있는 상황이 되지 못해 컨트롤러에서 해결하도록 했습니다. 해당 메서드는 gameId를 PathVariable로 받지만 바로 위의addScore()
에서는 teamId를 PathVariable로 받는 부분또한 같은 원인이라고 생각됩니다. 이런 부분은 설계, 관계설정의 문제일까요?감사합니다!