12강 AnimalDto에 대해서 질문이 있습니다.
12강 11:24 쯤 질문이 있습니다
sealed interface AnimalDto를 구현한 Dto 2개를 switch와 sealed를 사용해서 코드를 깔끔하게 할 수 있다는 걸 알게되었습니다.
실제 코드로 작성하면 of의 반환 타입은
인터페이스인 AnimalDto가 되는데 이때 DogDto와 CatDto의 필드를 조회할 수 있는 추상 메서드가 모두 있다는 전제로 말씀해주시는게 맞을까요?
回答 1
1
안녕하세요! kamser님! 🙂 좋은 질문 주셔서 감사합니다.
두 가지 관점에서 답변드려보겠습니다!
[1. DTO를 만들어 내는 과정]
11:24 초 쯤에 코드로 보이는 DTO를 만드는 과정에서는 selaed interface 안의 정적 팩토리 메소드를 타고 실제 구현 DTO의 정적 팩토리 메소드까지 코드가 호출되고 있습니다.
예를 들어 제가
Dog dog = dogRepository.findById(dogId);
AnimalDto dto = AnimalDto.of(dog);라는 코드를 사용하게 된다면, AnimalDto.of는 DogDto.of를 부르게 되죠.
AnimalDto의 정적 팩토리 메소드를 일종의 facade 처럼 사용하는 방식입니다.
이 경우는 switch pattern matching을 통해 DogDto로 들어올 때 결국 Dog 타입으로 바뀌기에 상위 타입에 필드를 접근할 수 있는 추상 메소드가 없더라도 문제가 없습니다.
[2. 만들어진 DTO를 사용하는 과정]
하지만 이렇게 AnimalDto를 사용해야 한다면 얘기가 조금 달라집니다.
Dog dog = dogRepository.findById(dogId);
AnimalDto dto = AnimalDto.of(dog);
dto.getXXX(); // 바로 이 부분입니다!dto.getXXX() 를 하려면 결국 AnimalDto 타입에 결국getXXX()이 존재해야 하기에 추상 메소드가 있어야 하는것이 맞습니다.
그런데, 만약 이 DTO를 저희가 직접 사용하는게 아니라 단순히 API 바깥으로 내보내는것이라면 또 얘기가 달라집니다.
interface AnimalDto {
}
public class DogDto implements AnimalDto {
private String name;
}
public class XXController {
@GetMapping("...")
public AnimalDto getDto{
// ... 생략 ...
return new DogDto("이름");
}
}
예를 들어 스프링에서 위와 같은 코드가 있다고 했을 때 AnimalDto 에 추상 메소드가 없더라도 json <-> 객체를 변환해주는 jackson은 알아서 하위 타입의 필드에 접근해
{
"name": "이름"
}과 같은 필드를 만들 수 있습니다. 보통 DTO로 변환되는 것은 API로 반환되기 위함인 경우가 많아 이 경우를 가정하고 설명드렸습니다! 👍
살짝 TMI이지만, 반대로 interface로 Request를 받을 때 @JsonTypeInfo 와 같은 적절한 어노테이션을 사용하면 추상 메소드 없이 인터페이스와 그 구현체에 대한 역직렬화도 가능합니다!
좋은 질문 주셔서 감사드립니다.
다른 질문들도 얼른 차례로 답변드리도록 하겠습니다!
감사합니다! 🙏
Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)
0
1
0
런타임 에러
0
9
0
서브넷 마스크
0
12
1
모의고사 1회 계산문제 2개 맞았는데
0
19
1
서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서
0
20
2
업캐스팅 문제 예시 4번 부모 호출
0
30
1
copilot-instruction.md
0
18
1
트랜잭션 내 Redis I/O 에 대한 궁금한점
1
25
1
모의고사 자료 해설이 너무 불친절하네요.
0
63
2
부모의 생성자 출력 관련
0
31
2
이론파트 재탕문제
0
31
0
누락코드
0
33
1
다차원 배열 포인터 질문있습니다
0
50
3
이론 파트 재탕
0
43
1
모의고사 5회
0
40
1
12분 10초 func(values, 0, 1)을 넣을 때
0
39
1
재탕문제
0
59
1
잘지내시죠?
2
99
1
2강 예제 소스 실행 문의
0
161
3
12강 강의 챕터 제목에 오타가 있네요
1
180
1
14강 Map에 대해서 질문이 있습니다.
0
231
1
compact constructor 질문이 있습니다.
1
232
1
2강 주요 키워드 정리 질문이 있습니다.
0
214
1
JPMS을 사용하면 빌드 툴 없이 모듈 구성이 가능하다
0
297
1

