[프로젝트] 8. 로그인 기능 구현
로그인 기능을 통해 사용자는 이메일과 비밀번호를 사용하여 시스템에 로그인할 수 있으며, 성공적인 인증 후 JWT 토큰을 받게 됩니다. 이 토큰은 이후의 요청에서 사용자 식별과 권한 확인에 사용됩니다.
Auth Controller 수정
로그인 요청을 처리하기 위해 AuthController에 로그인 메소드를 추가합니다. 또한, 현재 인증된 사용자의 정보를 가져오는 getAuth 메소드도 포함됩니다.
@GetMapping
public UserDto getAuth() {
TokenContext context = TokenContextHolder.getContext();
Long userId = context.getUserId();
return userService.getAuth(userId);
}
@PostMapping
public TokenResponseDto login(@RequestBody LoginDto loginDto) {
return userService.login(loginDto);
}
LoginDto 구현
LoginDto는 로그인 요청 시 클라이언트로부터 받은 데이터를 담는 객체입니다. 이메일과 비밀번호 필드를 포함합니다.
package com.myshop.dto;
import lombok.Getter;
@Getter
public class LoginDto {
private String email;
private String password;
}
UserRepository 수정
사용자의 이메일을 통해 사용자를 조회하는 메소드 findByEmail을 UserRepository에 추가합니다. 이는 로그인 과정에서 사용자의 존재 여부와 정보를 확인하는 데 사용됩니다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
UserService 수정
UserService에서는 로그인 과정과 현재 인증된 사용자의 정보를 가져오는 로직을 구현합니다. 로그인 메소드는 제공된 이메일과 비밀번호를 검증하고, 성공 시 사용자 ID를 포함한 JWT 토큰을 생성하여 반환합니다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final TokenManager tokenManager;
public UserDto getAuth(Long userId) {
User user = userRepository.findById(userId).orElseThrow(
() -> new BadRequestException("로그인이 필요합니다.")
);
return UserDto.builder()
.id(user.getId())
.name(user.getName())
.email(user.getEmail())
.profileImg(user.getProfileImg())
.introduce(user.getIntroduce())
.build();
}
public TokenResponseDto login(LoginDto loginDto) {
User user = userRepository.findByEmail(loginDto.getEmail()).orElseThrow(
() -> new BadRequestException("이메일이 존재하지 않습니다.")
);
TokenDto tokenDto = TokenDto.builder().userId(user.getId()).build();
return tokenManager.generateToken(tokenDto);
}
}
Postman을 사용한 테스트
Postman을 사용하여 로그인 기능을 테스트할 수 있습니다. /api/auth 엔드포인트로 POST 요청을 보내며, 요청 바디에는 email과 password를 포함시킵니다. 성공적인 로그인 시, 응답으로 JWT 토큰을 받게 됩니다.
예외 처리
UserService 내에서 발생할 수 있는 예외 상황(이메일이 존재하지 않을 때, 비밀번호가 틀렸을 때 등)을 적절히 처리하기 위해 사용자 정의 예외를 활용하고, GlobalExceptionHandler를 통해 클라이언트에게 명확한 에러 메시지를 전달합니다.
결론
이 과정을 통해 구현된 로그인 기능은 사용자 인증을 위한 기본적인 구조를 제공하며, 성공적인 인증 후 사용자에게 JWT 토큰을 발급하여, 애플리케이션 내에서의 사용자 식별 및 권한 관리의 기초를 마련합니다.