작성
·
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의 본래 역할을 벗어나는 것에 대한 우려로써 충분히 타당한 지적입니다.
관련 논의들은 다양한 포럼과 강의에서 다루어졌으며, 이와 유사한 문제에 관한 설명을 찾아 보시면 더 많은 인사이트를 얻으실 수 있을 것입니다.
이러한 구분은 나중에 프로젝트를 관리하고 확장하는 데 매우 유리하며, 특히 규모가 커질수록 그 중요성이 커집니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.