inblog logo
|
goho
    스프링부트

    [JPA/게시판]예외처리

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

    개념

    try-catch 개념과 특징

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

    throw 개념과 특징

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

    예외 처리 예시

    흐름

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

    RSS·Powered by Inblog