인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

0xe82de님의 프로필 이미지
0xe82de

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

문제점들

"프레젠테이션 계층에서 사용자 요청을 검증한다"에 궁금한 점이 있습니다.

작성

·

464

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
안녕하세요. 영한님 :)
"프레젠테이션 계층에서 사용자 요청을 검증한다"에 대해서 궁금한 점이 있습니다.
 
아래 상황에서 제가 생각한 것이 맞는지 여쭤보고 싶습니다.
 
"특정 유저의 기본키와 새로운 패스워드를 전달 받아서 해당 유저의 패스워드를 수정해야 하는 REST API가 있다. 이 때 패스워드에는 유저의 이메일이 포함되면 안 된다. 예를 들어, 이메일이 test@gmail.com일 경우 패스워드에 test가 포함되면 안 된다."
 
위 상황을 해결하기 위해 제가 생각한 로직은 다음과 같습니다.
  1. 컨트롤러 계층에서 유저 기본키로 유저의 이메일을 찾아 반환하는 서비스 계층 메서드를 호출한다.
  2. 반환된 이메일이 새로운 패스워드에 포함되는지 검증한다.
  3. 포함되지 않았다면 유저의 패스워드를 변경하는 서비스 계층 메서드에 유저의 기본키와 새로운 패스워드를 담아서 호출한다.
  4. 유저의 패스워드를 변경하는 서비스 계층 메서드에서는 전달받은 유저의 기본키로 유저의 패스워드를 변경한다. 이 때는 패스워드에 유저의 이메일이 포함되어 있는지 검증하지 않는다.
 
위 상황에서 이러한 로직으로 해결을 하는 것이 최선인지 의문이 듭니다. 이 방법이 틀린 것인지.. 더 좋은 방법이 있는지 가이드를 주시면 감사하겠습니다. :)

답변 1

2

안녕하세요, 0xe82de 님! 공식 서포터즈 codesweaver 입니다.

제 생각엔 컨트롤러에서 여러 서비스를호출하는 것은 괜찮지만 (말 그대로 흐름을 컨트롤 하는 역할)

검증에 대한 부분을 컨트롤러에서 처리하는것은 좋지 않습니다.

차라리 회원을 관리하는 서비스 객체에 '패스워드 유휴성 체크' 메서드가 있어서 이곳에서 회원 조회와 유효성 검사를 진행하고 이 결과를 boolean으로 받은다음, 다시 '패스워드 변경' 메서드를 호출하는 방법이 어떨가 생각합니다.

컨트롤러 코드가 아래와 비슷한 형태가 될 것 같습니다.

if (memberService.isValidPassword(params)) {

    memberService.changePassword(params);

}

 

유효하지 않은 이메일일 때 오류를 내고 싶다면 아래처럼 될 것 같습니다.

if (!memberService.isValidPassword(params) {

    throw new SomeException();

}

memberService.changePassword(params);

return "viewFile";

 

코드에는 정답은 없고, 필요에 따라 해답이 있을뿐이긴 하지만,

요점은, 컨트롤러는 서비스를 호출하는 것 외에 기능은 갖지 않는것이 좋다고 생각합니다.

감사합니다.

0xe82de님의 프로필 이미지
0xe82de
질문자

답변 감사드립니다! 한 가지 질문이 있습니다.

컨트롤러에서 memberService.isValidPassword(params)로 검증을 하고 통과하면 memberService.changePassword(params) 메서드를 호출할텐데요. 이 때 changePassword 메서드 내부에서 패스워드 유효성을 한 번 더 체크하는 것은 필요가 없을까요?

이중체크가 되어 그 부분은 필요하지 않을 것 같습니다.

아니면 컨트롤러에서 changePassword() 하나만 호출하도록 하고,

서비스 내에서 유효성 체크와 변경을 처리하도록 묶는 방법도 있을것 같습니다.

 

<클린 코드> 에 의하면 예외처리도 기능의 하나 이므로

컨트롤러에서 직접 처리하는 것보단 서비스에 넘기도록 하고,

서비스에서 메서드를 잘 분리하여 가독성 있게 작성하면 어떨까요

0xe82de님의 프로필 이미지
0xe82de
질문자

친절한 답변 감사합니다. :)

언급해주신 클린코드 책을 한 번 읽어보면 좋곘네요 ㅎㅎ

 

정말 감사합니다!!

0xe82de님의 프로필 이미지
0xe82de

작성한 질문수

질문하기