Skip to content

유효성 검사의 위치 #18

@dbalsk

Description

@dbalsk

안녕하세요! 위 책으로 기본기를 잡고 개발을 하고 있는 학생입니다.
책 내용을 바탕으로 개인 프로젝트를 진행하면서 의문점이 생겨 질문 드립니다. 많이 고민해봤는데 명쾌한 해답이 떠오르지 않네요 ㅠㅠ

(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);
    }

질문과 별개로 책 덕분에 정말 많은 도움이 됐습니다! 감사합니다

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions