-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
안녕하세요! 위 책으로 기본기를 잡고 개발을 하고 있는 학생입니다.
책 내용을 바탕으로 개인 프로젝트를 진행하면서 의문점이 생겨 질문 드립니다. 많이 고민해봤는데 명쾌한 해답이 떠오르지 않네요 ㅠㅠ
(376p - 유효성 검사의 위치에 대한 파트) 도메인 지식에 대한 유효성 검사는 도메인 객체에서, 무관한 데이터의 유효성을 따질 때는 dto에서 진행한다고 나와있습니다.
이를 토대로 개인 프로젝트에서 회원가입을 구현할 때 이름, 이메일, 비밀번호의 사용자 입력에 대한 유효성 검사를 진행하려고 했습니다. @ NotBlank는 dto로 컨트롤러에서 처리하도록 하고, @ Size는 엔티티로 서비스에서 처리하도록 하려고 했는데 서비스 코드에서 의문점이 발생했습니다.
서비스로 넘겨준 DTO를 엔티티로 변경하여 유효성 검사를 해줘야 하는데 이 과정에서 비밀번호가 암호화되지 않은 상태로 넘어가게 되는 문제가 생겼습니다. 물론 checkValid로 넘어간 엔티티 객체가 더 이상 참조되지 않고 가비지컬렉터에 의해 사라지긴 하겠으나, 보안적으로 좋은 코드가 아니라는 생각이 들어 질문 드립니다. 비밀번호 필드의 @ Size를 어디에서 검증해줘야 할까요? 그리고 위와 같이 회원 정보에 대한 유효성 검사는 실무에서 어떻게 수행되는지 궁금합니다.
아래는 코드는 서비스의 회원가입 메소드입니다.
@Transactional
public MemberDTO registerMember(MemberDTO memberDTO) {
//1. 도메인 객체에 대한 유효성 검증 (여기서 문제 발생)
validationService.checkValid(MemberDTO.toEntity(memberDTO));
//2.이메일 중복 체크 (해당 이메일로 조회하여 존재하는지 체크)
if (memberRepository.findByMemberEmail(memberDTO.getMemberEmail()).isPresent()) {
throw new IllegalArgumentException("이미 가입된 이메일입니다");
}
//3. 비밀번호 암호화
String encryptedPassword = passwordEncoder.encode(memberDTO.getMemberPassword());
//4. 엔티티 객체 생성
MemberEntity memberEntity = new MemberEntity(memberDTO.getMemberName(), memberDTO.getMemberEmail(), encryptedPassword);
//5. DB에 저장
MemberEntity saveEntity = memberRepository.save(memberEntity);
return MemberDTO.toDTO(saveEntity);
}
질문과 별개로 책 덕분에 정말 많은 도움이 됐습니다! 감사합니다
lleellee0
Metadata
Metadata
Assignees
Labels
No labels