📜 제목으로 보기

단일DTO

01 Controller의 OutputView.print( )에 List<단일Dto> 반환해주기

OutputView.printResultEveryRound(racingGame.getCurrentCars());
  • 관리자객체에서도 List< 단일객체 >나오는 일급에 들어가지 않았으므로 그대로 여기서 return될 타입이 List< 단일Dto >를 예상하자
public List<CarDto> getCurrentCars() {
    return this.cars.getCurrentCars();
}

02 일급 속 List<단일객체>를 stream.map으로 List<단일Dto>로 변환

public 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가 생성자에서 개별속성들을 원시값으로 받아먹을 수 있다.
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;
	}
}

04 OutputView는 List<단일Dto>를 받아서 getter들로 출력 로직 작성

public static void printResultEveryRound(List<CarDto> currentCars) {
    for (CarDto currentCar : currentCars) {
        System.out.println(currentCar.getName() + " : " + collectDash(currentCar.getPosition()));
    }
    System.out.println();
}

일급Dto

01 일급.toDto()를 통한 List<단일Dto>자리를 일급Dto로 교체

  • 단일Dto는 List -> steram -> map 가운데만 등장했으나단일>
  • 일급Dto는 this.일급.toDto()의 책임이 주어진다.
public CarsDto getCurrentCars() {
    //return this.cars.getCurrentCars();
    return this.cars.toDto();

02 일급Dto 정펙매 공식 재료는 일급 내부에 있는 List<단일객체> (No List<단일Dto>)

  • 단일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;
}

04 OutputView내부 List<단일Dto> 사용 -> 일급Dto.get()

//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()에서 확인하기
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);
}

03 프로덕션에 없던, 일급Dto의 정펙매from ( List<단일Dto>) 정의

  • 프로덕션에서는 일급내부 List<단일> —일급Dto정펙매–> (List<단일Dto변환 ->) 일급Dto
    • 테스트에선 단일Dto 출발 -> List<단일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가 최종 우승했습니다");