LALA's blog
이것도 DTO 인가? 본문
public class ProfitResult {
private final ParticipantProfit dealerResult;
private final List<ParticipantProfit> playersResult;
public ProfitResult(List<Player> players, Dealer dealer) {
players = new ArrayList<>(players);
List<ParticipantProfit> playersResult = calculatePlayersResult(players, dealer);
this.dealerResult = calculateDealerResult(playersResult, dealer);
this.playersResult = playersResult;
}
private List<ParticipantProfit> calculatePlayersResult(List<Player> players, Dealer dealer) {
return players.stream()
.map(player -> calculateParticipantProfit(player, dealer))
.collect(Collectors.toList());
}
// 이하 생략..
}
public class ParticipantProfit {
private final String participantName;
private final int profit;
public ParticipantProfit(String participantName, int profit) {
this.participantName = participantName;
this.profit = profit;
}
public String getParticipantName() {
return participantName;
}
public int getProfit() {
return profit;
}
}
해당 객체는 수익 결과를 나타내기 위해 참가자의 수익을 계산하고, 저장하는 역할을 하고 있다. 수익을 계산하고, 결과를 저장하기 때문에 당연히 도메인 객체라고 생각했다.
그러다 리뷰어분의 피드백을 통해 ParticipantProfit 는 view 에서 사용하는 객체같다는 피드백을 받았다. 이게 비즈니스 로직을 수행하기 위해 필요한 VO 객체인데 왜 view 에서 사용하는 객체같다는 것이지?? 라는 의문을 갖게 됐다.
다른 크루들과 얘기를 나누다가 확 와닿는 질문이 있었다.
이 객체들이 view 에 “이름: 수익” 으로 출력되는게 아니였다면 이 객체가 이런 형태로 필요했을까? 당연히 대답은 NO 이다.
수익을 계산해주는 로직은 도메인에 존재하는 비즈니스 로직이 맞지만,
private final ParticipantProfit dealerResult;
private final List<ParticipantProfit> playersResult;
이런 구조의 상태를 저장하고 있는 이유는 View 에 출력되는 형식에 맞추어 만들어진 것이기 때문이다. 무의식적으로 이름:수익 으로 맵핑해서 저장해야지! 라고 view 를 생각하고 도메인을 결정했던 것이다. ParticipantProfit 도 블랙잭 게임이 진행되기 위해 필요한 객체라기 보단 View 에서 필요하니깐 이름과 이익을 묶어서 저장하고 있는 것이고. 만약 출력 형식이 이름이 아니라 닉네임:수익으로 출력된다면 해당 객체도 변경되었어야 할 것이다. 이게 도메인이라면 view 가 변경되면 도메인이 변경되는 것..이다.
이런 생각을 하고 들여다보니 DTO 색깔을 가지고 있으면서 도메인 로직도 가지고 있는게 어색하다고 느껴졌다. DTO 로 사용하려면 명확히 도메인과 분리하고, 아니라면 도메인에서 더 명확한 역할을 갖도록 수정해야겠다고 생각했다.
이제 승패 판결과 수익을 계산해주는 역할을 하는 심판(Referee) 이라는 객체를 추가하고, 플레이어와 심판의 수익만을 도출해주는 책임을 부여했다.
그리고 얻은 수익을 ParticipantProfit dto 에 담아 view 에 넘겨주도록 수정했다. 이제 도메인과 view 가 완전히 분리되어 편-안해졌다!
이제 도메인에서는 view 를 고려하지 않고 블랙잭 게임 이라는 핵심 로직을 작동시키기 위한 객체들의 역할과 책임에 집중하고, view 에 필요한 구조로 변경되어야 한다면 DTO 로 추가하도록 해야겠다!
'개발 > 우아한테크코스' 카테고리의 다른 글
[레벨1] 어떤 값을 상수로 관리해야 할까? (3) | 2022.03.04 |
---|---|
[우테코 강의] 자바 List, Generic (0) | 2022.02.25 |
[우테코 강의] 문자와 문자열 ( String , StringBuilder , StringBuffer ) (0) | 2022.02.25 |
DTO 란? 장점은? (0) | 2022.02.17 |
[우아한테크코스 4기] 프리코스 3주차 회고 (0) | 2021.12.14 |