티스토리 뷰

	//중복회원 확인
	private void validateDuplicateMember(SignupDto signupDto) {
        Long count = memberRepository.countByEmail(signupDto.getEmail());
        if (count > 0) {
            // 중복된 이메일이 존재하는 경우 예외 발생
            throw new DuplicateMemberException("이미 존재하는 회원입니다.");
        }
    }

    //로그인
    public Member login (LoginDto loginDto) {
        Member member = memberRepository.findByEmail(loginDto.getEmail());
        if (member == null)
            throw new MemberNotFoundException("존재하지 않는 회원입니다.");
        if (!passwordEncoder.matches(loginDto.getPassword(), member.getPassword()))
            throw new IncorrectPasswordException("비밀번호가 맞지 않습니다.");

        member.clearPassword();
        return member;
    }

 

위와 같이 중복회원 확인이나, 이메일 혹은 비밀번호가 틀렸을 때 예외처리를 해주어야 한다. 

 

예외처리에는 두가지의 방법이 있는데,

1. 하나는 자바 표준 라이브러리에서 기본으로 제공하는 IllegalArgumentException과 같은 표준 예외 처리가 있고, 

2. 두번째는 직접 예외 클래스를 만드는 사용자 정의 예외처리(Custom Exception)가 있다.

 


1. 기본으로 제공하는 표준 예외 처리 방법

    private void validateDuplicateMember(SignupDto signupDto) {
        Long count = memberRepository.countByEmail(signupDto.getEmail());
        if (count > 0) {
            // 중복된 이메일이 존재하는 경우 예외 발생
            throw new IllegalStateException("이미 존재하는 회원입니다.");
        }
    }

 

 

이 방법은 새로운 클래스를 만들지 않고 기존의 예외를 재사용하여 코드가 더 간결해진다는 장점이 있지만, 특정한 에러 상황을 정확히 나타내지 못하거나 프론트엔드 단에서 메시지를 확인하기 어렵다는 단점이 있다.

 

실제로 postman에서 확인해보면 trace로 길게 리턴되어 프론트엔드 단에서 trace 의 string 메시지 (예. 이미 존재하는 회원입니다 라는 데이터)를 확인하기 쉽지 않다. 한 status 에러가 500으로 뜨는 데 이 경우엔 프론트엔드에서 구체적으로 어떤 에러인지 확인하기 쉽지 않다. 따라서 이왕이면 custom 으로 Exception 을 핸들링해주는 것이 좋다.

 


2.  직접 예외 클래스를 만드는 사용자 정의 예외처리(Custom Exception)

memberService

	//중복회원 확인
	private void validateDuplicateMember(SignupDto signupDto) {
        Long count = memberRepository.countByEmail(signupDto.getEmail());
        if (count > 0) {
            // 중복된 이메일이 존재하는 경우 예외 발생
            throw new DuplicateMemberException("이미 존재하는 회원입니다.");
        }
    }

 

DuplicateMemberException이라는 새로운 사용자 정의 예외를 만들어주었고, 이에 따라

 

DuplicateMemberException

package teamFive.freshmanCommunity.exception;

public class DuplicateMemberException extends RuntimeException{
    public DuplicateMemberException(String message) {
        super(message);
    }
}

 

RuntimeException을 상속받는 DuplicateMemberException 클래스를 생성해주었다. 

 

GlobalExceptionHandler

package teamFive.freshmanCommunity.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(DuplicateMemberException.class)
    public ResponseEntity<String> handleDuplicateMemberException(DuplicateMemberException e) {
        return ResponseEntity
                .status(HttpStatus.CONFLICT)
                .body(e.getMessage());
    }

 

GlobalExceptionHandler 클래스는 스프링 프레임워크의 중앙화된 예외 처리 메커니즘을 사용하여, 애플리케이션 전반에서 발생할 수 있는 예외를 관리하고 처리하는 역할을 한다.

예외가 발생했을 때, HTTP StatusCode(상태 코드) CONFLICT (409)와 함께 예외 메시지를 담은 ResponseEntity<String>를 반환한다.

 

postman으로 확인해볼 때도 위의 표준 예외 처리 방법처럼 복잡한 trace나 500 에러코드로 뜨는 것이 아닌, 

프론트엔드에서 확인하기 쉬운 메시지와 적절한 409 conflict라는 에러코드를 확인할 수 있다.

 

이러한 사용자 정의 예외 처리는 특정 에러 조건을 정확하게 나타내어 오류를 더 쉽게 식별하고 처리할 수 있으며, 더 세밀한 예외 처리가 가능하다. 또한 StatusCode도 정확하게 나타내어 프론트엔드가 어떤 에러인지 확인하기 쉽다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함