인프런 커뮤니티 질문&답변

poiuy1132님의 프로필 이미지
poiuy1132

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

변경 감지와 병합(merge)

updateItemDto

작성

·

614

·

수정됨

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요.
새해 복 많이 받으세요 !

열심히 강의를 수강중인 학생 입니다.

updateItemDTO 관련하여 궁금한게 생겨서 문의 남깁니다.

영한님이 말씀해주신 의견에 따라 소스를 변경해보았습니다.

Controller

 

updateItemDto (service package안에 뒀습니다)

Service

Item

book

소스는 이런식으로 변경해서 잘 동작 하는 것 확인 했습니다.

 

궁금점

  1. 영한님이 다른 분에게 남겨 준 글을 봤을 때

    DTO가 생성되는 계층에 dto class를 작성하라고 쓰여있었습니다.
    저의 소스 같은 경우 Controller 에서 인스턴스화 되고 있는데 이럴 때는 Controller 밑에 dto package를 만들었어야 하는건가요?

  2.  

    Service 쪽에서 Item findItem = itemRepository.findOne(itemId); findItem.changeItem(updateItemDto);

    이 로직을 실행하게 되면 Book, Album , Movie 다 똑같이 changeItem override 해주었습니다. 이후에 Controller에서 Album , Movie 에 필요한 필드 값 세팅 후 Service로 넘겼습니다. 3개의 자식 중에 Book 호출 되게 되는데 이 점이 궁금합니다

    (기본적인 자바 지식 일수도 있지만, 구글링을 하여도 적합한 글을 찾지 못해서 글 남겼습니다)

 

3. 2번과 이어지는 질문인데, 혹시 movie , album , book 을 다 수정할 수 있게 된다면 어떤 식으로 구성해야 좋은지 궁금합니다!

4.처음 view에서 넘겨 받은 BookForm을 itemService.updateItem()
인자로 넘기지 않고 중간에 변환해서 넘긴 이유가 궁금합니다! 5번 질문과 같은 맥락일까요

5.service 계층에서 dto를 의존하게 되는 경우는 어떤 경우인지도 궁금합니다 !

좋은 강의 잘 보고 있습니다.
항상 감사합니다!

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

1.4.5: DTO의 위치는 해당 DTO를 어떤 계층까지 사용할 것인가에 따라서 달라집니다. 사용을 의존이라는 단어로 바꾸어도 됩니다.

예를 들어서 리포지토리 계층까지 사용해야 하는 DTO라면 리포지토리 계층에 두면되고,

서비스 계층 까지 사용해야 하면 서비스 계층에, 컨트롤러 계층까지 사용해야 한다면 컨트롤러 계층에 두면 됩니다.

만약 모든 계층에서 전체적으로 다 사용한다면 별도의 패키지를 만들고 그곳에 DTO를 두시면 됩니다.

여기서 핵심은 의존관계에 대한 부분입니다.

자세한 내용은 클린 아키텍처라는 책을 보시면 도움이 되실꺼에요.

2.3: 이 부분은 처리해야 하는 데이터가 다르기 때문에 각각 별도의 컨트롤러, 서비스가 필요할 것 같아요. 또는 같은 컨트롤러나 서비스 내부에서 구분해서 분기를 탈 수도 있구요.

감사합니다.

 

0

poiuy1132님의 프로필 이미지
poiuy1132
질문자

2번 자문 자답
혼자 이것저것 해보면서 찾은 부분입니다.

ITEM에서 singleTable 전략을 사용하고 있습니다.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

자식 Entity는 총 Movie, Album, Book 3개가 있으며 이를 분기 하기위한 Column은 DTYPE
입니다.
처음 상품이 등록될 때 DTYPE이 정해지게 됩니다.

이후 수정하게 되면 이와 같은 로직을 타게 되고
image해당 로직을 실행 후 System.out을 보게 되면
DTYPE으로 인스턴스가 나뉘게 됩니다.

imageimage
DTYPE이 B인 경우 BOOK에 대한 인스턴스가 생성됩니다.
이로 인해서 findItem은 해당하는 인스턴스의 함수를 호출하게 됩니다!
강의에서는 B에만 해당하는 DB값이 있어서 계속 BOOK을 호출 한 것 같습니다.
부족한 부분 및 틀린 부분 있으면 수정댓글 남겨주시면 감사하겠습니다 !

poiuy1132님의 프로필 이미지
poiuy1132

작성한 질문수

질문하기