DTO 단계별 적용(자동차경주)
List<단일Dto>->일급Dto->OutputViewTest
📜 제목으로 보기
단일DTO
<단일Dto>
반환해주기
01 Controller의 OutputView.print( )에 ListOutputView.printResultEveryRound(racingGame.getCurrentCars());
- 관리자객체에서도 List< 단일객체 >나오는 일급에 들어가지 않았으므로 그대로 여기서 return될 타입이
List< 단일Dto >
를 예상하자
public List<CarDto> getCurrentCars() {
return this.cars.getCurrentCars();
}
<단일객체>
를 stream.map으로 List<단일Dto>
로 변환
02 일급 속 Listpublic List<CarDto> getCurrentCars() {
return this.cars.stream()
.map(car -> CarDto.from(car))
.collect(Collectors.toList());
}
03 Dto 변환 정펙메는 from(단일객체) -> 모든 속성들 원시값까지 나눠서 get
- 이 때, Car는 VO Name, Position이라도,
Dto의 속성 및 getter()는 순수 원시값
만 가지고 뱉어낸다.- 예를 들어, car.getName()은
Name(VO)
return이 아니라this.name.getName()
의 원시값을 return해야 CarDto가 생성자에서 개별속성들을 원시값으로 받아먹을 수 있다.
- 예를 들어, car.getName()은
public class CarDto {
private final String name;
private final int position;
public CarDto(String name, int positiion) {
this.name = name;
this.position = positiion;
}
public static CarDto from(Car car) {
return new CarDto(car.getName(), car.getPosition());
}
public String getName() {
return this.name;
}
public int getPosition() {
return this.position;
}
}
<단일Dto>
를 받아서 getter들로 출력 로직 작성
04 OutputView는 Listpublic static void printResultEveryRound(List<CarDto> currentCars) {
for (CarDto currentCar : currentCars) {
System.out.println(currentCar.getName() + " : " + collectDash(currentCar.getPosition()));
}
System.out.println();
}
일급Dto
<단일Dto>
자리를 일급Dto로 교체
01 일급.toDto()를 통한 List- 단일Dto는 List -> steram -> map 가운데만 등장했으나단일>
- 일급Dto는 this.
일급.toDto()
의 책임이 주어진다.
public CarsDto getCurrentCars() {
//return this.cars.getCurrentCars();
return this.cars.toDto();
<단일객체>
(No List<단일Dto>
)
02 일급Dto 정펙매 공식 재료는 일급 내부에 있는 List- 단일Dto는 Car가 모르고, 내부에서 이용안한다. Cars내부에서
List<CarDto>
만들 때 map에서 사용된다. - 일급Dto는 Cars가 알고 이용하여, 내부에서 변환환다.
-
일급내부의
단일객체 List
만 건네주면, 내부에서단일Dto
->일급Dto
한번에 변환후 생성 다해준다.List<단일Car>
—정팩메List<단일Dto>
—>CarsDto
// todo: 4. Cars의 toDto()함수는 <<Cars내부지만 CarsDto를 알고, 의존하여>> [CarsDto의 정팩메]를 호출 Cars -> CarsDto로 변환한다.
// my) Cars는 CarsDto와 그 정팩메를 알고 있다!
public CarsDto toDto() {
return CarsDto.fromCars(cars); // from List<단일객체CarDto> vs from다른것 Cars
}
- 일급Dto 정펙매의 재료가 List<단일
Dto
>가 아니라 List<단일객체
>만 있으면, 내부에서 단일Dto List -> 일급Dto까지 간다.
public static CarsDto fromCars(final List<Car> cars) {
// 필요재료가 List<단일Dto>가 아니라 List<단일객체>만 있으면, 내부에서 단일Dto List -> 일급Dto까지 간다.
final List<CarDto> carDtos = cars.stream()
.map(car -> CarDto.from(car))
.collect(Collectors.toList());
return new CarsDto(carDtos);
}
03 일급Dto의 getter 네이밍은 get()으로 줄여주자.
- 안줄이면.
XXXsDto.getXXXsDto()
-> get으로 네이밍 줄여주기 - 단일Dto는 개별속성 getter()가 목적이라
Dto.get속성()
public List<CarDto> get() {
return carsDto;
}
<단일Dto>
사용 -> 일급Dto.get()
04 OutputView내부 List//public static void printRacingRecord(List<CarDto> cars) {
// for (CarDto car : cars) {
public static void printRacingRecord(CarsDto carsDto) {
for (CarDto car : carsDto.get()) {
DTO테스트
01 Dto를 사용하는 OutputView의 Test로 테스트한다.
- ByteArrayOutputStream 변수 + setOut에 설정하기
- 차후 print명령을 내놓고 ->
output.toString()
에서 확인하기
- 차후 print명령을 내놓고 ->
private final ByteArrayOutputStream output = new ByteArrayOutputStream();
@BeforeEach
public void setUp_streams() {
System.setOut(new PrintStream(output));
}
02 [원시속성들]로 단일Dto 만드는 깡통 [정펙매of ] 정의
- 메서드로만 변환되는 deafult값의 position필드도 다 받도록 한다. (Dto는 깡통)
- 1개 이상의 속성들을 받아야하므로 .of()의 정펙매로 개발한다.
public static CarDto of(final String name, final int position) {
return new CarDto(name, position);
}
<단일Dto>
) 정의
03 프로덕션에 없던, 일급Dto의 정펙매from ( List- 프로덕션에서는 일급내부
List<단일>
—일급Dto정펙매–> (List<단일Dto변환 ->)일급Dto
- 테스트에선 단일Dto 출발 ->
List<단일Dto>
를 받아일급Dto
생성해줄 정펙매 필요함.
- 테스트에선 단일Dto 출발 ->
public static CarsDto from(final List<CarDto> carsDto) {
return new CarsDto(carsDto);
}
04 output.toString()은 변수로 못받는다. 바로 확인
//given
final CarsDto carsDto = CarsDto.from(Arrays.asList(CarDto.of("재성", 1), CarDto.of("재경", 1)));
//when: output.toString을 이후 actual변수에 따로 못받음.
OutputView.printRacingRecord(carsDto);
//then
assertThat(output.toString()).contains("재성 : -" + System.lineSeparator()
+ "재경 : -");
final CarsDto carsDto = CarsDto.from(Arrays.asList(CarDto.of("재성", 1), CarDto.of("재2", 1)));
// 우승자가 2명인 상황이라 가정해야됨. ---> Winner들만 모인 CarsDto를 넘겨받는다.
OutputView.printRacingResult(carsDto);
assertThat(outputStream.toString()).contains("재성, 재2가 최종 우승했습니다");