inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

Member 도메인 코드 개선

member의 password null 체크 로직

73

정승환

작성한 질문수 2

0

안녕하세요! 토비님 좋은 강의 잘 듣고 있습니다 :)
별거 아닌것 같긴합니다만..
도메인 코드 개선중 문득 궁금한 점이 생겨서 문의남겨봅니다..!
Member를 생성하는 정적 펙토리 메소드에서
member.passwordHash = requireNonNull(passwordEncoder.encode(createRequest.password()));

이렇게 암호화된 값에 대한 null 체크를 하도록 구현하셨습니다.
그런데 아래와 같이 다른 파라미터처럼 암호화를 하기전에 password 파라미터 자체를 null 체크하는게 일관성이 있다고 생각되는데 암호화를 한 후 null체크를 하신 토비님의 의도가 궁금합니다!!
member.passwordHash = passwordEncoder.encode(requireNonNull(createRequest.password()));

java 리팩터링

답변 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 인턴

안녕하세요, 인프런 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