📂 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);
}
}
'Spring > [P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천' 카테고리의 다른 글
[Springboot] 이메일로 임시 비밀번호 전송 설계하기 (0) | 2024.08.20 |
---|---|
[Springboot/JWT] 로그아웃 설계하기 (0) | 2024.08.19 |
[Springboot/SpringSecurity/JWT] 로그인 개발하기 (2) jwt (0) | 2024.08.15 |
[Springboot/SpringSecurity/JWT] 로그인 개발하기 (1) build.gradle, config (0) | 2024.08.14 |
[Springboot] 로그인 설계하기 (0) | 2024.08.09 |