여기저기서 알 수 없는 에러들과… 예외 클래스들을 가지고 있다.
아직 프로젝트가 큰 것도 아니고 내가 다 개발했는데 예외 발생지점과 에러 메시지가 기억이 안난다는 것은 그만큼 예외 표준화가 필요하다는 것!!
에러를 다루는 공통된 로직 → 표준화가 필요하다.
💡 enum은 상수가 아니다. 하나의 객체다. (실제로 힙메모리에 저장된다.)
Enum은 싱글턴으로 동작하는 객체다.
따라서 문자열로 Enum
을 이해하지는 말자
코드를 한 형태로 다룰 수 있도록 하는 것은 코드를 알아보기 쉽게 만들고, 쉬운 변경과 알지 못하는 에러에 대한 위험에 대비할 수 있게 한다. (코드의 표준화 )
하지만 추상 클래스나 인터페이스도 존재하는 데 왜 Eunm을 추천하신걸까?
💡 바로 에러메시지 자체를 상수화하기 위해서
💡 추가로 상태코드와, 에러메시지 관리가 편해진다.
한달의 첫번째날
과 일주일의 첫번째 날
을 동일하게 판단하는 경우에러메시지 하나하나를 Enum 클래스로 만드는 줄 알았따;;
(내가 생각한 것)
이메일을 잘못 적용했을때 이메일에러메시지 enum
public enum 이메일 {
에러코드("401"),
에러메시지("이메일이 틀렸습니다.")
}
--이런식으로 enum 클래스 엄청 많이 두기--
(실제)
public enum 에러코드 {
잘못된_이메일("상태코드","에러메시지")
잘못된_상품명("상태코드","에러메시지")
...
}
이제 왜 enum을 쓰는지 바로 알겠다@,@
1. 에러 메시지를 한 곳에서 수정이 가능하다.
2. 객체 타입이기 때문에 좀 더 많은 IDE의 지원을 받을 수 있다.
현재 내가 에러 메시지를 보고 찾아가려면…^^ 검색해서 가야한다는 치명적인 단점;;ㅋㅋ
하지만 Enum으로 하면 이동으로 슈수숙!
3. enum은 싱글턴객체로 간단하고 안전하게 동일한지 검사할 수 있다.
<문자열로 직접 메시지를 넣은 경우>
- 상황을 만든다.
- 에러메시지를 구현한 곳에 찾아..찾아..찾아..가서 복사해서 직접 검사
-> 오타 대마왕인 나에게는 실제로는 잘 동작하지만,
에러 검사시 틀린 값을 내는 등의 불안요소가 커진다.
<enum 으로 에러메시지로 구현한 경우>
- 상황을 만든다.
- enum클래스.발생객체 == 로 검사하면 된다.
결국 개발자가 관리하지 않고 자바에서 관리하게 되면서 안전성이 높아진다.
결국 관리가 편한 상황을 만들어준다.
gettet
메서드로 접근한다.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;
}
}
enum
을 쓰면 자바가 싱글턴등으로 관리해주기 때문에 안전성이 높아진다.