try - catch
throw
개념
try-catch
개념과 특징
- 예외 감지 및 예외 발생에 대한 처리 가능
try
블록 내 예외 발생 시, 해당 예외는catch
블록으로 전달되어 처리
- 예외가 발생한 메서드에서 직접 처리하거나, 상위 계층에 예외를 전파하여 다른 계층이 처리 가능
throw
개념과 특징
throw
는 예외를 강제로 던지는 키워드로, 예외가 발생한 지점에서 해당 예외를 던짐
throws
와 SRP: 메서드는 자신의 본래 책임에 집중하며 예외 처리는 별도 처리 가능
예외 처리 예시
흐름
예외 처리를 각 클래스가 독립적으로 처리하지 않고, 상위 계층에서 예외를 던지며 다른 계층이 처리하는 방식으로 책임 분리
- 예외 발생:
Repository
의findById()
에서 예외 던짐(throw new RuntimeException("디비 오류 발생")
)- 예외는
Service
와Controller
를 거쳐DispatcherServlet
에 전파
- 예외 처리:
DispatcherServlet
에서catch
블록이 예외를 감지,ControllerAdvice
로 예외를 전달ControllerAdvice
는 예외 메시지를 출력이나 필요한 방식으로 예외 처리
코드
public class App {
public static void main(String[] args) {
ControllerAdvice controllerAdvice = new ControllerAdvice();
Repository repository = new Repository();
Service service = new Service(repository);
Controller con = new Controller(service);
DispatcherServlet ds = new DispatcherServlet(con, controllerAdvice);
ds.route("/board");
}
}
public class ControllerAdvice {
public void process(RuntimeException e) {
System.out.println("에러 공통 처리: " + e.getMessage());
}
}
public class Repository {
public List<Integer> findAll() {
return Arrays.asList(1,2,3,4,5);
}
public int findById() {
// 조회하다가 오류 [숫자를 리턴]
// -1 오류 (안됨 -타입이 달라질 수 있다)
// 오류가 난 곳에 서 처리 (안됨 -책임이 분리되어 있어서)
// 단일 책임 원칙(SRP)와 관련 -메서드가 예외 처리를 책임지지 않고, 호출한 곳에 위임
// service의 상세보기()에 위임
throw new RuntimeException("디비 오류 발생");
}
}
public class Service {
// 컴퍼지션 코드 -객체 3개 만들기
private final Repository repo;
public Service(Repository repo) {
this.repo = repo;
}
public List<Integer> 목록보기() {
return repo.findAll();
}
public int 상세보기() {
return repo.findById();
}
}
public class Controller {
private final Service service;
public Controller(Service service) {
this.service = service;
}
public void list() {
List<Integer> models = service.목록보기();
for (Integer model : models) {
System.out.println("렌더링 : " + model);
}
}
public void detail() {
int model = service.상세보기();
System.out.println("렌더링 : " + model);
}
}
public class DispatcherServlet {
private final Controller con;
private final ControllerAdvice controllerAdvice;
public DispatcherServlet(Controller con, ControllerAdvice controllerAdvice) {
this.con = con;
this.controllerAdvice = controllerAdvice;
}
public void route(String path) {
try {
if(path.equals("/")) {
con.list();
} else if(path.equals("/board")) {
con.detail();
} else {
System.out.println("404 not found");
}
} catch (RuntimeException e) {
// 1. 컴퍼넌트 스캔 @ControllerAdvice
// 2. invoke(호출) RuntimeException(괄호 해당 타입에 맞춰) 매개변수를 가진 친구를
controllerAdvice.process(e);
}
}
}
Share article