현재 인턴쉽 전형 중 과제 평가가 포함되어있어, 과제를 진행하고 있다.
과제는 목요일 오후 4시까지 제출해야하고 최대한 수요일 저녁까지 완료를 목표로 잡고 있다.
과제 내용은 Spring Boot 기반 JWT 인증/인가 및 AWS 배포이고, 몇 가지의 요구사항이 존재한다.
요구사항은 아래와 같다.
1. Spring Boot를 이용하여 JWT 인증/인가 로직과 API를 구현한다.
2. Junit 기반의 테스트 코드를 작성한다.
3. Swagger 로 API를 문서화 한다.
4. 애플리케이션을 AWS EC2에 배포하고, 실제 환경에서 실행되도록 구성한다.
요구사항대로 순차적으로 구현하면서 학습한 내용을 블로그에 정리해볼 계획이다.
기록하면서 진행하면 복습도 되고, 나중에 다시 볼 때 큰 도움이 될 것 같다.
◆ 프로젝트 셋업 ◆
인텔리제이에서 Spring Boot 프로젝트를 새로 만들었고,
패키지 구조도 어느 정도 생각한 뒤 기능별로 분리해서 작업하고 있다.
먼저 도메인(User)와 권한(Role)을 정의했다.
유저 권한은 처음에 단일 필드(`Role role`)로 처리할까 고민했는데,
회원가입 이후에 ADMIN 권한을 추가로 부여하는 API가 요구사항에 있어,
`Set<Role> roles`로 관리하는 방식이 더 적절하다고 판단했다.
◆ DTO 정리 ◆
현재까지 생성한 DTO는 다음과 같다:
- `SignupRequest` – 회원가입 요청용
- `LoginRequest` – 로그인 요청용
- `UserResponse` – 회원가입 성공 시 응답용
- `TokenResponse` – 로그인 성공 시 토큰 응답용
◆ 서비스 (AuthService) ◆
`signup()`과 `login()` 기능을 AuthService에서 구현했다.
아직 JWT는 적용하지 않았고, 기본적인 회원가입/로그인 처리부터 먼저 완성한 상태다.
★JWT란 ★
사용자의 인증 정보를 담은 디지털 토큰
서버는 토큰만 보고 "이 유저가 누군지, 어떤 권한을 가졌는지" 판단할 수 있다.
AuthService.signup()
POST 방식
signup요청 -> SignupRequestDto -> AuthService.signup() -> 중복 검사 -> 비밀번호 암호화 -> User 생성
-> 메모리에 저장 -> 응답 반환
회원가입은 이렇게 진행할 것이다.
AuthService.login()
POST 방식
LoginRequestDto 수신 - > userStore에서 username으로 사용자 조회 -> 사용자 없으면 로그인 실패(예외처리)
-> 입력한 비밀번호와 저장된 비밀번호 비교 -> 다르면 로그인 실패(예외 처리) -> 비밀번호가 맞으면 로그인 성공
-> "임시 토큰" 문자열 생성(나중에 JWT로 바꿀예정) -> TokenResponseDto객체에 담음 -> 클라이언트에게 응답
로그인은 이렇게 진행 할 것이다.
◆ 컨트롤러 (AuthController) ◆
마지막으로 AuthController에서는 signup, login API를 만들었다.
서비스 단에서 만든 로직을 잘 분리해서 호출하고 있고,
입력은 @RequestBody, 검증은 @Valid를 통해 처리하고 있다.
◆ 마무리 ◆
지금까지 회원가입/로그인 기능을 DTO → Service → Controller 구조로 구현해봤고,
다음은 JWT 발급 유틸(JwtUtil) 을 만들어서 로그인 응답에 진짜 토큰을 포함시키는 작업으로 넘어갈 예정이다.