Sparta/Task

일정( Calendar_CRUD ) Trouble Shooting

hyunjg94 2025. 4. 4. 13:17

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 띄움으로 해결