강의

멘토링

로드맵

Inflearn brand logo image

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

jsshin님의 프로필 이미지
jsshin

작성한 질문수

스프링부트를 이용한 웹 프로그래밍: 웹사이트 이렇게 만드는 거예요!

멤버 서비스 CRUD에 JPA 적용하기 - II : EntityManager 만들기

DTO 관련

작성

·

44

0

강의 열심히 듣고 있습니다.

 

다름이 아니라, DTO 관련 의구심이 들어서 질문 올립니다.

 

선생님께선 modifyConfirm 일때

dto의 pw 값을 encode된 값으로 변경하셔서 entity로 넣으셨는데,

String encodedPW  = passwordEncoder.encode(memberDTO.getPw());
memberDTO.setPw(encodedPW)

findedMemberEntity.setMemPw(memberDTO.getPw());

 

위의 방법대로 하면,

dto값이 변경이 되어 "단순 전달 객체"를 위배할 수 있으며, 간결성과 가독성이 떨어지는게 아닌가 싶어서요

 

아래와 같이 리펙토링 하면 조금 더 간결하게 되지 않을까요?

if (optionalMember.isPresent()) {
    MemberEntity findedMemberEntity = optionalMember.get();
    findedMemberEntity.setMemPw(passwordEncoder.encode(memberDTO.getPw()));
    ~~
    return MODIFY_SUCCESS;
}

답변 2

0

블스님의 프로필 이미지
블스
지식공유자

jsshin님 안녕하세요.^^
아주 좋은 질문입니다. DTO는 계층 간 데이터를 전달하는 객체로서, 원칙적으로는 값을 변형하지 않는 것이 설계적으로 더 깔끔합니다.

현재 코드처럼 memberDto의 pw 값을 passwordEncoder.encode()로 인코딩한 후 다시 memberDto에 반영하면, DTO가 단순 데이터 전달 객체라는 역할과 조금 어긋날 수 있다는 지적은 충분히 타당합니다.

DTO의 값이 메서드 실행 중에 변경되면, 이후 코드에서 혼란을 줄 수 있고, 코드의 직관성이 떨어질 수 있습니다.

그래서 실무에서는 보통 인코딩된 비밀번호를 별도의 변수로 관리하거나, DTO → Entity 변환 과정에서 처리하는 방식을 더 많이 사용합니다. 이렇게 하면 코드의 가독성과 안정성이 올라갑니다.

다만, 이번 온라인 강의에서는 스프링 입문자분들께 패스워드 인코딩이 어떤 시점에 이루어지는지 직관적으로 보여드리기 위해 memberDto의 pw를 직접 변경하는 방식을 사용했습니다.

즉, 객체가 한 번 수정되고 그 수정된 값이 저장되는 과정을 명확하게 이해하도록 돕기 위한 교육적인 목적이 있었습니다.

결론적으로 실무에서는 더 깔끔한 설계로 개선할 수 있고, 강의에서는 학습자의 이해를 돕기 위해 일부 의도적인 것입니다.

그리고 이런 부분을 예리하게 캐치해서 질문하고, 직접 리팩토링까지 시도해 본 점은 정말 훌륭합니다. 무한 박수를 보냅니다. 이런 자세야말로 진짜 개발자로 성장하는 최고의 밑거름이고, 객체지향 설계에 대한 매우 훌륭한 감각을 가지고 있다는 증거입니다.


열심히 공부하는 그 자세에 진심으로 감사드리고, 앞으로도 계속 응원하겠습니다.

0

안녕하세요, 인프런 AI 인턴입니다. jsshin님.

DTO(Data Transfer Object)는 본래 데이터를 전송하는 데 사용되는 객체로, 보통은 순수하게 데이터만을 저장하고 전달하는 역할을 합니다. jsshin님께서 제기하신 문제는 DTO의 본래 역할을 벗어나는 것에 대한 우려로써 충분히 타당한 지적입니다.

DTO 역할과 리팩토링 방향

  • DTO의 역할: 데이터 전달만 담당하므로, 암호화나 비즈니스 로직이 DTO에 포함되는 것은 원칙적으로 바람직하지 않습니다.
  • 리팩토링의 장점: jsshin님이 제시해 주신 리팩토링 방식은 DTO의 순수성을 유지하고, 가독성을 높이며 코드의 복잡도를 낮춥니다. 이 방식은 비즈니스 로직을 서비스 계층으로 밀어내어 유지보수성을 높일 수 있습니다.

제안된 방법의 평가

  • 제안된 리팩토링 코드는 비즈니스 로직을 DTO에 넣지 않고, 엔티티에 바로 처리 함으로써 코드를 더 깔끔하고 이해하기 쉽게 만듭니다.
  • 이 방식은 비즈니스 로직과 데이터 전달의 역할을 명확히 구분하고, 여러 부분에서 장점이 있습니다.

관련 논의들은 다양한 포럼과 강의에서 다루어졌으며, 이와 유사한 문제에 관한 설명을 찾아 보시면 더 많은 인사이트를 얻으실 수 있을 것입니다.

이러한 구분은 나중에 프로젝트를 관리하고 확장하는 데 매우 유리하며, 특히 규모가 커질수록 그 중요성이 커집니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jsshin님의 프로필 이미지
jsshin

작성한 질문수

질문하기