inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 9부터 자바 21까지

12강. record pattern과 switch pattern matching

12강 AnimalDto에 대해서 질문이 있습니다.

해결된 질문

209

티벳로보

작성한 질문수 49

1

12강 11:24 쯤 질문이 있습니다

sealed interface AnimalDto를 구현한 Dto 2개를 switch와 sealed를 사용해서 코드를 깔끔하게 할 수 있다는 걸 알게되었습니다.

실제 코드로 작성하면 of의 반환 타입은

인터페이스인 AnimalDto가 되는데 이때 DogDto와 CatDto의 필드를 조회할 수 있는 추상 메서드가 모두 있다는 전제로 말씀해주시는게 맞을까요?

java

답변 1

1

최태현

안녕하세요! kamser님! 🙂 좋은 질문 주셔서 감사합니다.

 

두 가지 관점에서 답변드려보겠습니다!

 

[1. DTO를 만들어 내는 과정]

11:24 초 쯤에 코드로 보이는 DTO를 만드는 과정에서는 selaed interface 안의 정적 팩토리 메소드를 타고 실제 구현 DTO의 정적 팩토리 메소드까지 코드가 호출되고 있습니다.

 

예를 들어 제가

Dog dog = dogRepository.findById(dogId);
AnimalDto dto = AnimalDto.of(dog);

라는 코드를 사용하게 된다면, AnimalDto.ofDogDto.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 와 같은 적절한 어노테이션을 사용하면 추상 메소드 없이 인터페이스와 그 구현체에 대한 역직렬화도 가능합니다!

 

좋은 질문 주셔서 감사드립니다.

다른 질문들도 얼른 차례로 답변드리도록 하겠습니다!

감사합니다! 🙏

1

티벳로보

이렇게 가능한지 몰랐습니다..

상세하게 알려주셔서 많이 배웠습니다!

1

최태현

도움이 되신 것 같아 좋네요!! 🙂

API 다형성 같은 키워드로 검색해보시면 더 많은 정보가 나올거에요!

감사합니다! 🙏

26년2회 실기기출은 언제쯤...

0

24

2

진짜화면이랑달라서못해먹겟어요먹겟어요

0

18

1

네이버 API | '검색 - 책' API 제공 중단

0

19

2

ArticleReadService 관련 질문

0

15

1

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

1

45

1

이론 공부법 요약본 버전 업데이트 문의

0

21

2

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

31

1

해당 프로젝트를 똑같이 따라하려니 spring installer가 버전이 17부터 가능하네요.

0

18

1

Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.

0

35

2

테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.

0

22

1

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

60

1

리뉴얼 시기

0

39

2

스크립트에 대해 질문 있습니다.

1

54

1

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

61

1

조건 검색 질문

0

32

1

JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문

0

53

3

클로드코드 명령어-대화&세션관리 수업 자료

0

40

1

잘지내시죠?

2

74

1

2강 예제 소스 실행 문의

0

130

3

12강 강의 챕터 제목에 오타가 있네요

1

172

1

14강 Map에 대해서 질문이 있습니다.

0

218

1

compact constructor 질문이 있습니다.

1

220

1

2강 주요 키워드 정리 질문이 있습니다.

0

205

1

JPMS을 사용하면 빌드 툴 없이 모듈 구성이 가능하다

0

284

1