1. 개요
JAVA Spring 시작!
Schedule_CRUD Upgrade! 더 많은 기능을 넣어 구현을 해보았습니다.!!
2. 과정
● 유저 CRUD ▶ 일정 CRUD ▶ 로그인 기능 ▶ 예외 처리
◎ exception : 오류 처리 및 응답 관리 🚨
○ CustomException: 애플리케이션에서 발생할 수 있는 오류를 정의하고, 해당 오류를 클라이언트에 전달하는 커스텀 예외 클래스
○ ErrorCode: 애플리케이션에서 발생할 수 있는 여러 가지 오류 코드와 그에 대한 메시지를 정의하는 Enum 클래스
○ ErrorResponseDto: 오류 발생 시 클라이언트에게 반환되는 오류 응답의 형식을 정의하는 객체입니다
○ GlobalExceptionHandler: 전역 예외 처리 클래스입니다. 이 클래스는 애플리케이션 내에서 발생할 수 있는 예외들을 처리하고, 적절한 HTTP 상태 코드와 메시지를 클라이언트에 반환
◎ controller
○ LoginController : 사용자의 로그인과 로그아웃을 처리하는 API입니다. 로그인 성공 시 세션에 사용자 정보를 저장하고, 로그아웃 시 세션을 무효화하여 로그인 상태를 초기화
◎ filter
○ Loginfilter : 로그인 상태를 확인하는 필터입니다. 화이트리스트에 포함된 URL을 제외한 모든 요청에 대해 로그인 상태를 검사합니다. 로그인되지 않은 상태로 접근하려 할 경우 예외를 발생
그 외에는 전에 과제 내용을 참고 부탁드려요!!!
3. Trouble Shooting
● 로그인 중복
public ResponseEntity<LoginResponseDto> login(
@RequestBody LoginRequestDto loginRequestDto, HttpSession session) {
Consummer loginUser = consummerService.login(
loginRequestDto.getConsummerEmail(),
loginRequestDto.getConsummerPassword()
);
if (loginUser == null) {
throw new CustomException(ErrorCode.INVALID_PASSWORD);
}
LoginResponseDto responseDto = new LoginResponseDto(
loginUser.getConsummerName(),
loginUser.getConsummerEmail()
);
session.setAttribute("LOGIN_USER", responseDto);
return ResponseEntity.ok(responseDto);
}
◎ 원인 : 한 명의 유저만 접속할 수 있는 것이 아니라 동시에 여러 명의 유저가 접속할 수 있는 상황 발생.
-- 이것이 문제가 된 원인은 여러 개의 일정을 동시에 컨트롤 할 수 있는 상황이 발생
// 현재 로그인 상태를 관리하는 변수 (true: 로그인됨, false: 로그인 없음)
private static final AtomicBoolean isLoggedIn = new AtomicBoolean(false);
@PostMapping("/login")
public ResponseEntity<LoginResponseDto> login(
@RequestBody LoginRequestDto loginRequestDto, HttpSession session) {
if (isLoggedIn.get()) {
throw new CustomException(ErrorCode.ALREADY_LOGGED_IN);
}
Consummer loginUser = consummerService.login(
loginRequestDto.getConsummerEmail(),
loginRequestDto.getConsummerPassword()
);
if (loginUser == null) {
throw new CustomException(ErrorCode.INVALID_PASSWORD);
}
isLoggedIn.set(true);
LoginResponseDto responseDto = new LoginResponseDto(
loginUser.getConsummerName(),
loginUser.getConsummerEmail()
);
session.setAttribute("LOGIN_USER", responseDto);
return ResponseEntity.ok(responseDto);
}
@PostMapping("/logout")
public ResponseEntity<Void> logout(HttpSession session) {
session.invalidate();
isLoggedIn.set(false);
return ResponseEntity.ok().build();
}
◎ 결과 : 로그인이 되어 있는 상태인지 true, false 로 확인 - 로그인하면 true, 로그 아웃하면서 false 띄움으로 해결
'Sparta > Task' 카테고리의 다른 글
Spring 심화 주차 개인 과제 - Trouble Shooting (0) | 2025.04.21 |
---|---|
Spring 심화 주차 개인 과제 (0) | 2025.04.18 |
일정( Schedule_CRUD ) Trouble Shooting (0) | 2025.03.26 |
키오스크 ( Kiosk ) - Trouble Shooting (0) | 2025.03.14 |
계산기 ( Calculator ) - TroubleShooting (0) | 2025.03.05 |