TDD 연습 프로젝트 10 - 멤버 세션로그인 API

zunzero·2022년 9월 17일
0

스프링, JPA

목록 보기
18/23

이번엔 로그인 기능을 구현하려한다.
로그인 기능은 세션을 통한 로그인과 JWT를 통한 로그인 두가지 모두를 구현할 예정이다.
글을 쓰기 앞서, 해당 API를 구현함에 있어, 서비스 계층은 테스트를 통과하였지만 컨트롤러 계층의 테스트는 성공하지 못했음을 공지한다.

어제 새벽엔 테스트를 통과하지 못했는데 오늘 아침에 차근차근 글을 작성하면서 왜 테스트를 통과하지 못했을까에 대한 생각을 하면서 다시 수정한 결과 테스트가 성공했다. ㅎㅎ

세션 로그인 API

요구사항

  • 세션 로그인 API
    - 기능: 세션을 통한 로그인 기능을 구현한다.
    • 요청: 사용자 Email, 사용자 비밀번호
    • 응답: 사용자 이름, 사용자 Email
    • 기타: 쿠키에 해당 사용자를 위한 세션값이 있어야 한다.

Repository 계층 개발

로그인 기능을 위한 Repository 계층의 개발은 따로 필요없다.
findByEmail 기능에 대한 테스트와 구현이 이미 끝났기 때문이다.

Serivce 계층 개발

service 계층에서 로그인 기능을 위해 해야 할 일은 다음과 같다.
입력으로 넘어온 email 값을 통해 Member 객체를 찾고 값이 없다면 에러를 던진다.
Member 객체를 찾았다면 비밀번호를 비교해서 맞는지 아닌지를 따진다.
위 두 과정을 모두 성공했다면 로그인 성공의 의미로 사용자의 아이디를 Controller 계층에 넘겨준다.

테스트 케이스는 위와 같이 작성하였다.
우리는 SessionLoginService와 getMemberId 메서드를 구현하고, MemberErrorResult에 '멤버 아이디 없음'과 '비밀번호 틀림'을 나타내는 오류 케이스를 추가하면 된다.

또한 새로운 에러 클래스인 MemberException을 만들었기 때문에 해당 에러를 처리할 수 있는 ExceptionHandler를 구현해야 한다.
앞서 작성한 GlobalExceptionHandler 클래스에 아래와 같이 작성해주도록 하겠다.

로그인 서비스에 대한 테스트는 성공적으로 모두 통과하였다.

Controller 계층

작성한 테스트 케이스는 아래와 같다.
Email이 형식에 맞지 않는 경우와, email 혹은 비밀번호가 입력되지 않은 경우는 로그인에 실패하고, 위의 경우가 아니라면 로그인에 성공한다.

작성한 테스트 코드의 컴파일 오류 해결을 위해 MemberLoginController와 MemberLoginRequest, MemberLoginResponse 클래스를 아래와 같이 작성하였다.

Exception을 처리할 Handler도 구현되었고, Service 계층에서의 테스트도 모두 통과했기 때문에 문제 없이 통과할 것이라 짐작하고 테스트를 돌리면 역시나 성공적으로 통과하는 것을 볼 수 있다.

profile
나만 읽을 수 있는 블로그

0개의 댓글