hyeonga_code

Java_57_Log_로그 처리 본문

Java

Java_57_Log_로그 처리

hyeonga 2023. 10. 17. 05:59
반응형


 - log 관련 라이브러리 파일
    - libs 폴더 > workspace 아래로 이동합니다.
        - logback-classic-1.4.8.jar
        - logback-core-1.4.8.jar
        - mariadb-java-client-2.4.1.jar
        - slf4j-api-2.0.7.jar   : 로그를 사용할 수 있게 하는 역할입니다.
        - pom.xml

        - 최근 log4 library에서 오류가 발생했습니다.
        > logback을 많이 사용하는 추세입니다.

'폴더' 우클릭 > 'Properties' > 'Java Build Path' > 'Libraries'
    - JRE...  : Java가 기본적으로 제공하는 파일밖에 없습니다.
    > 'Classpath' 선택 > 'ADD External JARs..' 
    > 추가할 파일 선택 > '열기'
        - Classpath에 추가된 것을 확인할 수 있습니다.
    - 이 모든 과정을 Maven을 사용하면 생략할 수 있습니다.
    > Apply and Close
      
    > /src폴더 아래 'Module-info.java' 파일을 삭제합니다.
        - 패키지/모듈 둘 중 하나만 선택하게 되어 있습니다.
    
     - Modulepath
        - 특정 패키지에도 접근 제한자를 적용하고 싶습니다.
     - Classpath
        - Java 버전이 달라도 호환이 가능합니다.

'ExceptionEx3.java'
    '''
        // log 추가 *****
        logger.debug(e.getMessage());
    '''
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package adv.exception_ex;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class ExceptionEx3 {
    
    /*
        - libs 폴더 > workspace 아래로 이동합니다.
            - logback-classic-1.4.8.jar
            - logback-core-1.4.8.jar
            - mariadb-java-client-2.4.1.jar
            - slf4j-api-2.0.7.jar   : 로그를 사용할 수 있게 하는 역할입니다.
            - pom.xml
            
         - 로그 라이브러리 추가
            > '폴더' 우클릭 > 'Properties' > 'Java Build Path' > 'Libraries'
                - JRE...  : Java가 기본적으로 제공하는 파일밖에 없습니다.
            > 'Classpath' 선택 > 'ADD External JARs..' 
            > 추가할 파일 선택 > '열기'
                - Classpath에 추가된 것을 확인할 수 있습니다.
            - 이 모든 과정을 Maven을 사용하면 생략할 수 있습니다.
            > Apply and Close
            > /src폴더 아래 'Module-info.java' 파일을 삭제합니다.
     */
    
    // 로그 라이브러리 사용_logback
    private static Logger logger = LoggerFactory.getLogger(ExceptionEx3.class);
    
    // 나누기 함수 생성
    static int divide(int a, int b) {
        return a/b;
    }    
    
    // 예외처리를 추가한 나누기 함수 생성
    static int divide2(int a, int b) {
        int result =0;
        
        try {
            result = a / b;
        } catch(Exception e) {
 
            // log 추가 *****
            logger.debug(e.getMessage());
 
            System.out.println("Error");
        }
        return result;
    }
    
    public static void main(String[] args) {
        
        // 정상 작동
        int result = divide(4,2);
        System.out.println("4/2 = " + result);
            /*  4 / 2 = 2    */
        
        result = divide2(4,2);
        System.out.println("4/2 = " + result);
            /*    4/2 = 2     */
        result = divide2(4,0);
            /*
                 14:09:04.223 [main] DEBUG adv.exception_ex.ExceptionEx3 -- / by zero
                     - main() 메소드에서 오류가 발생했습니다.
                 Error
             */
 
    }
}



 - 이 정보들은 콘솔 창을 계속 보고 있어야 하는 불편함이 있습니다.
    - 파일을 저장할 수 있습니다.


- 메세지 값을 예외처리에서 설정하면 출력하는 방법을 다르게 설정할 수 없습니다.

'Exception4.java'
    '''
        // 예외처리를 추가한 나누기 함수 생성
        static int divide3(int a, int b) throws Exception {
                // divide3() 메소드가 Exception을 생성하여 상위 메소드로 보낼 수 있는 권한을 부여합니다.
            int result =0;
            
            try {
                result = a / b;
            } catch(Exception e) {
                // log 추가
                logger.debug(e.getMessage());
                throw new Exception("Error");
                    // 메세지를 저장해서 상위로 보내겠습니다.
            }
            return result;
        }
    '''
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package adv.exception_ex;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class ExceptionEx4 {
    
    // 로그 라이브러리 사용_logback
    private static Logger logger = LoggerFactory.getLogger(ExceptionEx3.class);
    
    // 나누기 함수 생성
    static int divide(int a, int b) {
        return a/b;
    }    
    
    // 예외처리를 추가한 나누기 함수 생성
    static int divide3(int a, int b) throws Exception {
            // divide3() 메소드가 Exception을 생성하여 상위 메소드로 보낼 수 있는 권한을 부여합니다
        int result =0;
        
        try {
            result = a / b;
        } catch(Exception e) {
            // log 추가
            logger.debug(e.getMessage());
            throw new Exception("Error");
                // 메세지를 저장해서 상위로 보내겠습니다.
        }
        return result;
    }
    
    public static void main(String[] args) {
        
        try {
            int result = divide3(4,0);
            System.out.println(result);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
 
            /*
                14:28:08.453 [main] DEBUG adv.exception_ex.ExceptionEx3 -- / by zero
                    - divide3() try-catch에서 발생한 메세지를 출력합니다.
                Error
                    - 상위로 보낸 메세지를 Exception으로 생성해서 main() 메소드에서 출력합니다.
                    - Exception으로 받아온 메세지를 출력합니다.
             */
    }
}




 - 사용자 정의 예외 작성하기
    - 기존의 예외 클래스를 상속 받아 새로운 예외 클래스를 정의할 수 있습니다.
        - Exception 클래스를 상속받아 메인 생성자를 호출하고 예외 클래스의 생성자를 호출합니다.
    - 에러 코드를 저장할 수 있게 ERR_CODE와 getErrCode()를 멤버로 추가합니다.

'UserException.java' 클래스 생성
    - Superclass : Exception
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
package adv.exception_ex;
 
public class UserException extends Exception {
 
    // 기본 생성자
    public UserException() {}
    
    public UserException(String msg) {
        // 메세지를 매개 변수로 받아오겠습니다.
        super("UserException : " + msg);
            // super = Exception 클래스에 msg를 넘기겠습니다.
    }
}



'ExceptionEx5.java'
=====

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package adv.exception_ex;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class ExceptionEx5 {
    
    // 로그 라이브러리 사용_logback
    private static Logger logger = LoggerFactory.getLogger(ExceptionEx3.class);
    
    // 나누기 함수 생성
    static int divide(int a, int b) {
        return a/b;
    }    
 
    static int divide4(int a, int b) throws Exception{
        int result = 0;
        
        try {
            result = a/b;
        } catch(Exception e) {
            // log 추가
            logger.debug(e.getMessage());
            throw new UserException("Error");
                // 메세지를 저장해서 상위로 보내겠습니다.
        }
        return result;
    }
    
    public static void main(String[] args) {
        
        try {
            int result = divide4(4,0);
            System.out.println(result);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            // 예외가 발생함과 무관하게 반드시 실행되는 코드입니다.
            System.out.println("End program");
        }
            /*
                14:40:10.368 [main] DEBUG adv.exception_ex.ExceptionEx3 -- / by zero
                UserException : Error
                    - 'UserException.java'에서 설정한 메세지 형태로 출력됩니다.
                End program
             */
    }
}
반응형