ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Exception 처리
    Programming/JAVA 2019. 11. 19. 14:31

    개발을 하다보면 왜쓰는지 이유도 모른채로 try~catch 문이나 exception을 throw하기도 한다. 하지만 개발한 코드를 배포하는데 있어서, 에러가 어디서 나는지에 대한 log를 찍는 것 만큼 중요한 것은 없다. 그래서 오늘은 exception 처리를 한번 같이 해보겠다.

     

    에러에 대한 log를 찍어보기 위해서는 Logger를 impoert해 사용해야 한다.

    클래스의 가장 상위단에 있는 <private static final Logger LOGGER = LoggerFactory.getLogger(RestContorller.class); > 를 사용해아하고 import로는 <slf4j> 로 되어있는 애를 이용한다.

    여기까지 하면 기본적으로 log를 찍어보기 위한 설정은 끝이났다. 이제 try~catch 문에서 에러를 확인해보자.

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    private static final Logger LOGGER = LoggerFactory.getLogger(RestContorller.class); 

    Controller 단에 있는 getCount() 메소드에 일부러 db connection error를 생성해서 내보았다. 

    try 문 내부에 있는 throw new Exception("");을 통해 에러가 어떤 식으로 나는지 실행시켜본다.

    보게되면 catch 문에 있는 ERROR 로그로 : 데이터 조회 실패가 try문에서 고의로 낸 "db connection error"보다 먼저 콘솔창에 출력된다.

    이 말은 즉슨 에러가 났을 당시 throw 하게되면 catch로 들어가 내부단을 실행시키고 최종으로 에러 내용을 마지막에 확인할 수 있다는 것이다.

     

    만약 에러가 하나도 없는 코드를 보자.

    <에러가 없는 코드>

    물론 결과가 예상은 가겠지만 실행하게 된다면?

    <실행화면>

    당연하겠지만 try 문 안에 있는 데이터 조회 완료 로그만 뜨고 다른 것은 출력하지 않는다!!

     

    이번엔 Spring Boot의 ServiceImpl단에서 try ~ catch를 해보고 주의해야할 점을 알아보겠다.

    <getBaseInfo()>

    여기 getBaseInfo() 메소드가 있다.

    첫 번째 try 문 안에서 연산이 0 / 0이 들어가므로 빌드에러가 나지는 않겠지만, 실행 후 연산이 실제로 발생할 때는 에러가 생긴다. (0은 분모가 될 수 없기 때문) 

    SpringBoot의 작동의 따라 ServiceImpl에서 exception이 발생한 경우 catch 단에 있는 코드가 실행되고

    Service->Controller 단으로 전송되어야 한다.

    위에 사진에 있는 코드는 실행결과 어떻게 될까?

    우리가 원했던 의도는 첫 번째 try ~ catch 문에서 Error가 발생했다면 두 번째 try ~ catch 문인 2번이 실행되지 않고 Controller단으로 Error가 발생했음을 돌려보내야 한다. 하지만 로그를 찍어보게 되면 첫번째 try~catch 문에서 catch문인 1번이 실행되고, 후에 Controller단으로 가는 것이 아닌 두번째 try문으로 내려오게 된다.

    이 것은 결국 우리가 원하는 방향으로 흘러가지 않는 것이다. 이유가 무엇일까? Service단으로 <throw>, 즉 에러를 던져주지 않았기 때문이다. 

     

    해결 방법은 간단하다. 아래 처럼 catch 문에서 에러를 throw 해주기만 하면 된다. 

    이 세개의 그림을 보면, 첫 번째 그림에서, 첫 번째 try ~ catch에서 에러가 발생한 후에 더 이상 두 번째 try~catch로 들어가지 않는 것을 로그가 찍힌 것을 통해 확인할 수 있다. catch 문에서 <throw e>를 해줌으로서 Error를 Controller로 보내는 것이다. 

    SpringBoot 에서 Controller단이 아닌 다른 단에서 try ~ catch 문을 작성하는 것은 implement단에서 실행한다.

     

    Exception, 예외처리는 개발하는 데 있어서 가장 중요한 부분이라고 한다. 다들 기초부터 잘 갖춘 상태에서 개발을 수행할 수 있으면 좋겠다. 사실 내가 먼저 해야한다 그렇게 ... ㅎ

     

    출처 : https://aljjabaegi.tistory.com/458

    'Programming > JAVA' 카테고리의 다른 글

    [JAVA] 엑셀 (excel) 파일 read 하는 법 (.xls, .xlsx)  (0) 2019.12.04
    [JAVA] 생성자 JAVA Constructor  (0) 2019.11.29
    [JAVA] 페이징 처리  (1) 2019.11.25
Designed by Tistory.