에러코드를 관리하는 좋은 방법 : ENUM

코린이서현이·2024년 7월 13일
0

백엔드 공부

목록 보기
8/10

에러를 관리하기 어려운 현재 상황

여기저기서 알 수 없는 에러들과… 예외 클래스들을 가지고 있다.
아직 프로젝트가 큰 것도 아니고 내가 다 개발했는데 예외 발생지점과 에러 메시지가 기억이 안난다는 것은 그만큼 예외 표준화가 필요하다는 것!!

에러를 다루는 공통된 로직 → 표준화가 필요하다.


어떻게 하면 에러를 표준화 할 수 있을까?

👩‍🏫 에러 메시지를 enum 클래스로 작성하는 것은 어떨까요?

Enum을 알아보자

💡 enum은 상수가 아니다. 하나의 객체다. (실제로 힙메모리에 저장된다.)

Enum은 싱글턴으로 동작하는 객체다.

  • 힙영역에 저장되는 객체지만, 값 비교가 가능한 이유는 싱글턴 객체이기 때문이다.
    (그렇기 때문에 Enum 생성자가 private인 것이다.)

따라서 문자열로 Enum을 이해하지는 말자

에러메시지를 Enum으로 구현해야하는 이유?

코드를 한 형태로 다룰 수 있도록 하는 것은 코드를 알아보기 쉽게 만들고, 쉬운 변경과 알지 못하는 에러에 대한 위험에 대비할 수 있게 한다. (코드의 표준화 )

하지만 추상 클래스나 인터페이스도 존재하는 데 왜 Eunm을 추천하신걸까?
💡 바로 에러메시지 자체를 상수화하기 위해서
💡 추가로 상태코드와, 에러메시지 관리가 편해진다.

Enum의 장점

  1. 타입 비교가 가능헤 IDE의 도움을 받을 수 있다.
  2. 개발자의 실수로 인한 다른 값이 동일하게 처리될 확률을 줄여준다.
    한달의 첫번째날일주일의 첫번째 날을 동일하게 판단하는 경우
  3. 리팩토링 변경 범위가 최소화된다.

💡 내가 잘못 생각한 부분

에러메시지 하나하나를 Enum 클래스로 만드는 줄 알았따;;

(내가 생각한 것)
이메일을 잘못 적용했을때 이메일에러메시지 enum
public enum 이메일 {
	에러코드("401"),
	에러메시지("이메일이 틀렸습니다.")
}

--이런식으로 enum 클래스 엄청 많이 두기--

(실제)
public enum 에러코드 {
	잘못된_이메일("상태코드","에러메시지")
	잘못된_상품명("상태코드","에러메시지")
	...
}

이제 왜 enum을 쓰는지 바로 알겠다@,@


(느낀 점) Enum으로 에러메시지를 작성한다면!

1. 에러 메시지를 한 곳에서 수정이 가능하다.
2. 객체 타입이기 때문에 좀 더 많은 IDE의 지원을 받을 수 있다.

    현재 내가 에러 메시지를 보고 찾아가려면…^^ 검색해서 가야한다는 치명적인 단점;;ㅋㅋ
    하지만 Enum으로 하면 이동으로 슈수숙!

3. enum은 싱글턴객체로 간단하고 안전하게 동일한지 검사할 수 있다.

<문자열로 직접 메시지를 넣은 경우>
- 상황을 만든다.
- 에러메시지를 구현한 곳에 찾아..찾아..찾아..가서 복사해서 직접 검사
-> 오타 대마왕인 나에게는 실제로는 잘 동작하지만, 
에러 검사시 틀린 값을 내는 등의 불안요소가 커진다.

<enum 으로 에러메시지로 구현한 경우>
- 상황을 만든다.
- enum클래스.발생객체 == 로 검사하면 된다.

결국 개발자가 관리하지 않고 자바에서 관리하게 되면서 안전성이 높아진다.

결국 관리가 편한 상황을 만들어준다.

  • 추가로 enum 내부 필드에 여러 값을 가지는 경우 : gettet 메서드로 접근한다.

이제 도입해보입시다~!

enum으로 에러 메시지 만들기

package gift.main.global.Exception;

import org.springframework.http.HttpStatus;

public enum ErrorCode {
    //회원가입시
    EMPTY_EMAIL(HttpStatus.BAD_REQUEST, "이메일을 채워주세요"),
    EMPTY_NAME(HttpStatus.BAD_REQUEST, "이름을 채워주세요"),
    EMPTY_PASSWORD(HttpStatus.BAD_REQUEST, "비밀번호를 채워주세요"),

    ALREADY_EMAIL(HttpStatus.BAD_REQUEST, "이미 존재하는 이메일입니다."),
    ERROR_LOGIN(HttpStatus.BAD_REQUEST, "이메일과 비밀번호를 정확히 입력해주세요"),
    ;
    //이메일과 비밀번호 코드가 401이 아닌 400인 이유: 코드를 보고 해당 유저가 있다고 판단할 것 같아서

    private final HttpStatus httpStatus;
    private final String errorMessage;

    ErrorCode(HttpStatus httpStatus, String errorMessage) {
        this.httpStatus = httpStatus;
        this.errorMessage = errorMessage;
    }

    public HttpStatus getHttpStatus() {
        return httpStatus;
    }

    public String getErrorMessage() {
        return errorMessage;
    }
}
@Service
public class UserService {

    private final UserDao userDao;
    private final AuthUtil authUtil;

    public UserService(UserDao userDao, AuthUtil authUtil) {
        this.userDao = userDao;
        this.authUtil = authUtil;
    }

    public String joinUser(UserJoinRequest userJoinRequest) {
        //유효성 검사해야하는데용~!
        if (userDao.existsUserByEmail(userJoinRequest.email())) {
            throw new UserException(ErrorCode.ALREADY_EMAIL.getErrorMessage(), ErrorCode.ALREADY_EMAIL.getHttpStatus());
  //예외 내부에 enum 에러 코드로 생성자를 둬서 코드리팩토링을 할 수도 있다. 
        }
        UserDto userDto = new UserDto(userJoinRequest) ;
        Long id = userDao.insertUser(userDto);
        String token = authUtil.createToken(id,userDto);
        return token;

    }
}

최종 정리

  1. enum을 쓰면 자바가 싱글턴등으로 관리해주기 때문에 안전성이 높아진다.
  2. 한 곳에서 관리가 가능해 유지보수가 편리해진다.
  3. 에러 코드를 동일한 방법으로 관리 가능해져 유지보수가 편리해진다.

참고 자료

[Java] Enum 사용법 (2) - 문법

[Java] enum(열거형)

profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글