빙응의 공부 블로그
[공부노트]예외의 종류, 예외처리 개념과 방법 본문
📝개요
이번에 선배 추천으로 원티드 프리 온보딩 챌린지를 해보았다.
양질의 정보를 현업 개발자분이 알려주는 거라 매우 보물같은 시간이였기에 내가 공부한 부분을 남길 생각이다.
사전 과제 기준으로 작성하기에 한번 사전 과제를 해보는 것도 좋다
quddaz/wanted-preonboarding-20 (github.com)
GitHub - quddaz/wanted-preonboarding-20
Contribute to quddaz/wanted-preonboarding-20 development by creating an account on GitHub.
github.com
1단계를 최소한으로 구현하였다!
이번 포스팅은 개념적인 부분에 해당할 것!
📝오류에 대해 생각해보기
📌 생각해보자
Q1 = "a" + 1 Q2 = "1" + 1 Q3 = a + 1 |
자바에서 해당 코드를 돌리면 무엇이 나올까?
- 1번 : "a1"
- 2번 : "11"
- 3번 : a가 무슨 변수인지에 따라 다름
이 생각을 왜하는가? 그것은 저런 사소한 코드로도 오류가 생기기 때문이다.
현실세계의 오류와 달리 컴퓨터의 오류는 프로그램의 정상적인 흐름이 멈추는 것을 의미한다.
매우 치명적!!!
오류의 종류(크게)
오류 | 설명 | 치명도 |
문법 오류(컴파일 오류) | 문법이나 여러가지 규칙으로 인해 발생하는 오류 | 컴파일 중에 잡혀 오류가 가벼움 |
논리 오류(런타임 오류) | 구문오류와는 다르게 의도와 다르게 동작하는 오류 | 서비스 측면에서 매우 심각한 오류 |
문법 오류는 컴파일 과정에서 발견되어 치명적이지 않다. 개발자의 문법 실수 등등으로 이루어지기 때문이다.
논리 오류는 런타임 과정에서 발견되는 오류로, 원하지 않는 동작이나 다른 동작이 일어난다. 이렇기에 서비스 측면에서
문제가 발생해 매우 큰 오류이다.
그렇다면 예외는 무엇일까요?
예외와 오류의 차이는 무엇일까요?
예외란 무엇일까요? |
프로그램의 정상적인 실행을 방해하는 비정상적인 상황 |
예상하지 못한 예외적인 상황 |
개발자가 의도된 오류를 처리한 것 |
개발자가 복구할 수 있는 것 |
개발자가 피할 수 없는 것 |
쉽게 정리하면 예외는 예측할 수 있는 문제를 말한다.
그런데 예측한다고 예외를 피할 수 없다.....
그 이유는 사용자는 우리의 의도대로 움직이지 않기 때문이다.!
📝 Exception Handling(예외 처리)
우리는 예외 상황을 정상적으로 돌릴 수 있게 Exception Handling 예외처리를 해준다.
이 역할은 시스템이 동작을 하게 만드는 역할을 하는 것이다.
📌 자바의 예외
체크 예외(반드시 예외 처리 필요)
- RuntimeException을 상속하지 않는 예외
- 컴파일러가 체크하기 때문에 예외처리 코드가 필요하다
- IOException, SQLException 등이 있다.
언체크 예외(반드시 예외 처리 필요 X)
- RuntimeException을 상속하는 예외이다.
- 명시적인 예외처리가 필요하지 않고, 자동으로 예외를 발생시킨다.
- NullPointerException, ArrayIndexOutOfBoundsException 등이 있다.
📌 생각해보자
해당 사진은 Never의 로그인 창이다. 해당 상황에서의 예외는 무엇일까???
여러개가 있을 수 있지만 크게 추려보자
- 단순하게 입력 값이 잘 못 들어오는 경우, 데이터가 없는 경우
- 인증번호를 요청했는데 안 온 경우
당연하게도 우리는 이러한 상황 모두에서 예외처리를 해주어야 한다. 단순하게 입력 값이 잘못된 경우 들어온 요청에서
Vaildation을 해야하고 인증번호 요청했는데 안 온 경우 다시 보낼 수 있게 해줘야 한다.
또한 예외에 대해 세세하게 알려주고 싶으면 의도적으로 예외를 일으킬 수 있다.
만약 로그인 시 빈 값으로 넣었다면 내부에서 적절한 타입의 예외를 발생시킬 수 있다.
사전과제 예외처리 中
@AllArgsConstructor
@Getter
public enum UserErrorCode implements ErrorCode {
USERNAME_DUPLICATED(HttpStatus.CONFLICT, "유저 중복"),
FAILD_LOGIN(HttpStatus.NOT_FOUND, "유저가 없거나 비밀번호가 틀립니다.");
private HttpStatus httpStatus;
private String message;
}
public void join(String username, String password){
//중복 체크
memberRepository.findByUsername(username).ifPresent(user -> {
throw new AppException(UserErrorCode.USERNAME_DUPLICATED);
});
//저장
memberRepository.save(Member.builder()
.username(username)
.password(bCryptPasswordEncoder.encode(password))
.build());
}
해당처럼 의도적으로 예외를 내서 사용자에게 알려줄 수도 있고 다양한 예외처리도 가능하다.
📝 예외 처리의 방법론
예외처리는 크게 3가지로 나뉘어진다!
예외 복구 예외 회피 예외 전환 |
예외 복구
예외가 발생한 상황에 대응해서 정상적인 상황으로 복구하는 방법이다.
프로그램이 중단되지 않고 계속 실행할 수 있도록 한다.
이것을 처리함으로써 사용자가 무엇 때문에 예외가 발생했는지 알아야한다!
- 복구 가능한 오류 : 잘못된 입력 값 등 예측 가능한 경우
- 예외가 발생해서 프로그램은 정상적으로 실행
- 재시도를 통해서 예외 북구 진행 또한 가능
아이디, 비밀번호 입력
발생할 수 있는 예외
- 아이디가 존재하지 않는다.
- 비밀번호가 틀렸다.
- 빈칸을 입력하였다.
-> 사용자가 예외가 발생했음을 이해하고 다시 시도
외부 서비스 요청에 실패할 경우, 네트워크 이슈
- 미리 설정된 값 만큼 재시도한다.(일시적인 상황)
- 결과적으로 또 실패하더라도 사용자가 알 필요는 없다.
-> 알아도 사용자가 할 수 있는건 없다. 개발자의 역할
예외 회피
예외를 호출한 곳으로 그대로 던지는 방법을 의미한다.
try{
User user = userRepository.findById(id);
} catch(Exception e){
return e
}
굳이 잡을 필요는 없으나 필요성은 다음과 같다.
- 상위 계층에서 한번에 처리하여 예외 처리 로직을 단순화하고 중복을 피하기 위해 사용된다.
- 로깅 처리를 위해 Exception을 잡는 것
예외 전환
예외를 처리하기 위한 적절한 예외로 변경하는 것을 말한다.
- 커스텀 예외 정의
try:
return userRepository.findById(id);
catch(DatabaseError e)
throw new UserNotFoundError;
위 코드처럼 커스텀 에러를 정의해서 처리하면 좋은 구조의 예외처리이다.
동일한 예외로 처리를 하면 가독성이 떨어지며 세세한 예외처리 또한 힘들다. 이것을 위해 커스템 예외가 필요하다.
예외 복구 : 다시 정상적인 흐름
예외 회피 : 별다른 행동을 하지 않고 넘김
예외 전환 : 더 적절한 예외로 변환
📝 더 세세한 예외 처리
위처럼 회원가입 시에 오류가 났다고 생각해보자, 우리는 예외 복구에 대해 Status만을 가지고 예외에 대해 알 수 없다.
그렇기에 상태코드를 포함해서 더 많은 정보를 넣어야한다.
- 단순한 Status Code 만으로는 적절한 상황을 확인할 수 없다.
- 사용자가 적절한 다음 행동을 할 수 없다는 의미
- 더 세분화해서 보여줘야함
Error Code
에러에 대한 정보를 담는 객체를 만들어보자
public interface ErrorCode {
HttpStatus getHttpStatus();
String getMessage();
}
public enum UserErrorCode implements ErrorCode {
USERNAME_DUPLICATED(HttpStatus.CONFLICT, "유저 중복"),
FAILD_LOGIN(HttpStatus.NOT_FOUND, "유저가 없거나 비밀번호가 틀립니다.");
private HttpStatus httpStatus;
private String message;
}
해당처럼 400의 에러코드에서 세부적으로 프론트와 협업해서 예외를 처리할 수 있다.
'CS' 카테고리의 다른 글
[공부노트]모니터링 (0) | 2024.07.09 |
---|