member의 password null 체크 로직
73
작성한 질문수 2
안녕하세요! 토비님 좋은 강의 잘 듣고 있습니다 :)
별거 아닌것 같긴합니다만..
도메인 코드 개선중 문득 궁금한 점이 생겨서 문의남겨봅니다..!
Member를 생성하는 정적 펙토리 메소드에서member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password()));
이렇게 암호화된 값에 대한 null 체크를 하도록 구현하셨습니다.
그런데 아래와 같이 다른 파라미터처럼 암호화를 하기전에 password 파라미터 자체를 null 체크하는게 일관성이 있다고 생각되는데 암호화를 한 후 null체크를 하신 토비님의 의도가 궁금합니다!!member.passwordHash = passwordEncoder.encode(requireNonNull(createRequest.password()));
답변 2
0
날카로운 질문을 해주셨네요.
requireNonNull()이 가장 밖에 둔 이유는 제가 로직을 적용하면서 사고하는 순서 때문인 것 같은데요.
Null이 아니어야 한다는 로직은 passwordHash 프로퍼티에 적용한 것입니다. 엔티티의 로직인 거죠. 그래서 encode를 해서 어떤 결과가 나오든(사실 encode해서 널이 나올 것 같지는 않지만요) 상관없이 최종적으로 null이 아닌지 확인하고 passwordHash에 넣는다라는 규칙을 그대로 표현하려고 했던 것입니다.
강의 진행하면서 PasswordEncoder의 encode()에 대해서는 딱히 null에 대해서 규칙을 정하지는 않았어요. null 비밀번호를 허용할지 말지(당연히 현실적으로는 안 하겠지만) 명시해두지 않았으니까 거기서 어떤 결과가 나오든지 상관없이 최종 null이 들어가면 안 된다는 것은 엔티티 레벨에서 강제하자는 걸로 봐주시면 좋겠습니다.
대부분 비밀번호를 입력받고 호출하는 쪽에서 null 값을 보낼리는 없겠죠. 그럼에도 체크하는 코드를 도메인 안에 둔 것은, 실제로 버그가 있어서 encode()에서 null이 리턴되는 상황, password가 null로 넘어오는(이것도 프론트의 버그겠죠) 극단적인 버그 상황도 차단할 수 있도록 만든 것이라고 보시면 될 것 같네요.
말씀하신 대로 password에 대해서 non null 체크를 해도 되긴 합니다만 제 스타일은 이렇게 하는 게 마음이 편한 것 같네요. 보통 사용하는 기술이 어떻든 비밀번호 인코딩 하는 쪽에서 null을 받으면 거기서 먼저 에러를 내지 않을까 싶긴합니다만, 그 구현은 어떻게 바뀔지 모르겠죠.
0
안녕하세요, 인프런 AI 인턴입니다. 정승환님께서 올려주신 질문에 대해 답변드리겠습니다.
비밀번호 Null 체크 로직에 대한 고찰
비밀번호를 포함한 주요 데이터는, 시스템에서 예외 없이 처리되어야 하는 필수적인 요소입니다. 일반적으로 입력된 비밀번호 값 자체에 대한 null 체크는 코드의 일관성을 유지하는 데 도움이 됩니다. 이렇게 null 체크를 통해 초기 단계에서 잠재적인 오류를 미리 방지할 수 있습니다.
비밀번호 암호화 후 null 체크의 이유
비밀번호를 암호화한 후에 null 체크를 수행하는 이유는, 실제로 암호화 과정 중에 문제가 발생할 수 있는 경우에 대비하기 위함일 수 있습니다. 다음과 같은 상황들이 있을 수 있습니다:
암호화 실패 발생 가능성: 비밀번호가 비정상적인 상황에서 암호화 도중에 예상하지 못한 null 값이 반환될 경우에 대비하기 위한 방어적 프로그래밍 방법으로 볼 수 있습니다.
암호화 결과의 유효성 보장: 암호화된 결과값이 정상적으로 생성되지 않은 경우, 이후 처리에서 발생할 수 있는 문제를 미리 감지하기 위함입니다.
하지만, 함수 호출의 일관성과 초기에 명확한 예외 처리를 고려한다면, 말씀하신 대로 암호화를 수행하기 전 입력 값 자체에 대한 null 체크를 우선적으로 수행하는 것이 코드의 가독성 및 유지보수 측면에서 도움이 될 수 있습니다. 이를 통해 예외가 발생할 지점을 명확하게 지정할 수 있습니다.
위와 같은 설명을 기반으로, 정승환님께서 코드 작성 시에 각각의 상황 및 코드의 목적에 따라 적절한 방식으로 null 체크를 설정하는 것이 바람직합니다.
관련하여 앞서 다루어진 게시글에서 풍부한 설명과 토비님만의 의견을 확인하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
테스트 관련 질문!
0
56
2
N+1 관련해서 질문있습니다.
0
97
3
도메인 모델에서 관계와 규칙을 구분하는 방법
0
85
2
헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?
0
168
2
어댑터에서 도메인에 직접 의존하는 경우에 대해
0
159
2
Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.
0
136
2
MemberService와 EmailSender 책임 분리에 대한 질문
0
121
2
NonNullApi를 NullMarked로 대체하라고 합니다.
0
155
2
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
0
92
2
Repository Adapter 설계에 대해 피드백을 부탁드립니다
0
121
2
헥사고날 part2 강의 출시 예정일 문의 드립니다.
0
280
2
PT 문의사항
0
114
1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
0
164
2
애플리케이션의 JPA 리턴과 도메인 모델
0
141
2
애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의
0
153
2
페이징 처리를 해야한다면 어떻게 해야할까요?
0
209
2
애그리거트의 repository
0
132
2
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
0
259
1
회원 애플리케이션 서비스 테스트 (1)
0
118
2
정적 팩토리 메서드 관련 질문드립니다!
0
116
2
spotbug + @NonNullApi 로만 Null 방어가 될까요?
0
140
2
required 포트에 관해서
0
99
2
혹시 다음 편은 언제쯤 오픈할까요?
0
179
2
서비스 단위 테스트 코드 작성
0
107
2





