Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천

[Springboot/SpringSecurity/JWT] 로그인 개발하기 (3) controller, repository, service, dto

alsruds 2024. 8. 16. 04:04

📂 apiPayload

📂 config

  L SecurityConfig

📂 controller

  L UserController

📂 domain

  L 📂 common

  L 📂 enums

  L User

📂 dto

  L 📂 request

        L LoginDto

  L 📂 response

        L LoginResponseDto

📂 jwt

  L JwtFilter

  L JwtUtil

📂 repository

  L UserRepository

📂 service

  L UserService

  L UserServiceImpl

🐘 build.gradle

 

 

로그인 기능 구현

 

LoginDto : 프론트엔드 서버에서 들어오는 데이터 정보

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class LoginDto {
    private String email;
    private String password;
}

 

LoginResponseDto : 로그인 성공 시 jwt 토큰 반환

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LoginResponseDto {
    private String token;

    public static LoginResponseDto loginResponse(String token) {
        return LoginResponseDto.builder()
                .token(token)
                .build();
    }
}

 

UserController : 프론트엔드 서버에서 전달받은 데이터를 서비스 코드로 전달

@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {

    private final UserService userService;

    @PostMapping("/login")
    public ApiResponse<LoginResponseDto> login(@RequestBody LoginDto dto) {
        return ApiResponse.onSuccess(userService.login(dto));
    }
}

 

UserRepository : 이메일로 사용자 존재 유무 확인하기

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

 

UserServiceImpl : 회원 존재 검증 성공 시 토큰 발급, 검증 실패 시 오류 반환

@Service
@Transactional
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

    public LoginResponseDto login(LoginDto dto) {
        Optional<User> savedUser = userRepository.findByEmail(dto.getEmail());

        if (savedUser.isPresent()) { // 사용자 검증 성공
            String savedPassword = savedUser.get().getPassword();

            // 비밀번호 검증
            if (!passwordEncoder.matches(dto.getPassword(), savedPassword)) {
                throw new GeneralException(ErrorStatus.PASSWORD_NOT_MATCHING);
            }
            
            // 토큰 발급
            Long expiredMs = 1000 * 60 * 60L;
            String token = JwtUtil.createJwt(dto.getEmail(), expiredMs);

            return LoginResponseDto.loginResponse(token);
        }

        // user not found exception - 사용자 검증 실패
        throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
    }

}