[JPA/게시판]예외처리

gov's avatar
Nov 25, 2024
[JPA/게시판]예외처리
💡
try - catch
throw

개념

try-catch 개념과 특징

  • 예외 감지 및 예외 발생에 대한 처리 가능
  • try 블록 내 예외 발생 시, 해당 예외는 catch블록으로 전달되어 처리
  • 예외가 발생한 메서드에서 직접 처리하거나, 상위 계층에 예외를 전파하여 다른 계층이 처리 가능

throw 개념과 특징

  • throw는 예외를 강제로 던지는 키워드로, 예외가 발생한 지점에서 해당 예외를 던짐
  • throws와 SRP: 메서드는 자신의 본래 책임에 집중하며 예외 처리는 별도 처리 가능

예외 처리 예시

흐름

예외 처리를 각 클래스가 독립적으로 처리하지 않고, 상위 계층에서 예외를 던지며 다른 계층이 처리하는 방식으로 책임 분리
  1. 예외 발생:
      • RepositoryfindById()에서 예외 던짐(throw new RuntimeException("디비 오류 발생") )
      • 예외는 ServiceController를 거쳐 DispatcherServlet 에 전파
  1. 예외 처리:
      • 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

goho