프로젝트 (Java)/예약마켓

[프로젝트] 8. 로그인 기능 구현

hihyuk 2024. 1. 25. 09:56

로그인 기능을 통해 사용자는 이메일과 비밀번호를 사용하여 시스템에 로그인할 수 있으며, 성공적인 인증 후 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 수정

사용자의 이메일을 통해 사용자를 조회하는 메소드 findByEmailUserRepository에 추가합니다. 이는 로그인 과정에서 사용자의 존재 여부와 정보를 확인하는 데 사용됩니다.

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 요청을 보내며, 요청 바디에는 emailpassword를 포함시킵니다. 성공적인 로그인 시, 응답으로 JWT 토큰을 받게 됩니다.

 

예외 처리

UserService 내에서 발생할 수 있는 예외 상황(이메일이 존재하지 않을 때, 비밀번호가 틀렸을 때 등)을 적절히 처리하기 위해 사용자 정의 예외를 활용하고, GlobalExceptionHandler를 통해 클라이언트에게 명확한 에러 메시지를 전달합니다.

 

결론

이 과정을 통해 구현된 로그인 기능은 사용자 인증을 위한 기본적인 구조를 제공하며, 성공적인 인증 후 사용자에게 JWT 토큰을 발급하여, 애플리케이션 내에서의 사용자 식별 및 권한 관리의 기초를 마련합니다.