-- INDEX --
1. 롬복 | 2. 컨트롤러 어드바이스 | 3. 로깅 | 4. 로그 설정 파일 | 5. 롬복 + 로거 |
자동으로 코드 작성 @Data |
컨트롤러 예외 처리 @ControllerAdvice @ExceptionHandler |
slf4j log4j Loggerfactory getLogger( class ) |
LoggerLevel appenders RootLoger layout |
@slf4j |
1. 롬복이란?
- 필드 추가할 때 자동으로 getter/setter /투스트링 만들어주는 애
- 즉, 자동으로 “코드”가 만들어진다.
- 이클립스 또는 STS 같은 IDE자체에다가 자체에다가 등록을 시켜주어야 된다.
1-1 : 롬복 설치
1-2 : 롬복 사용법 – 어노테이션 활용
우리가 모든 인자 값 받는 생성자 만들었던 이유는?
모든 값 가지고 정상적으로 태어나도록 해주기 위해서
프로그래밍 관점에서 좋은 건 맞는데 파라미터 하나하나 채워주기 불편하다
사용하기 편리하기 위해서 세터를 사용했었다.!
사용하지 않는 거 굳이 만들어줄 필요 없다.!
나중에는
세터의 편리함 / 객체 생성의 관점 2가지를 모두 갖춘
@Builder 패턴을 이용한 객체 생성을 해준다!
2. 컨트롤러 어드바이스
2-1 : 컨트롤러 어드바이스란?
- 컨트롤러 부분에 대한 간섭을 할 수 있는 객체
- 일반적으로는 - 컨트롤러에서 발생하는 예외 처리해주는 친구라고 한다.
- 다른 걸로도 할 수 있는데, 보통 예외 처리할 때는 이렇게 한다.
- 인터셉터와 비슷하지만 – CA는 이것저것 간섭할 수 없고, 예외처리에 많이 사용된다.
조언, 감시, 잔소리
반드시 컨트롤러에 대해서만 작동하는 것이 아닌
내가 만든 어노테이션도 감지하도록 설정 가능
404에러는 처리 불가
(web.xml이랑 해서 처리 가능하긴 함)
2-2 : 예외를 발생시키는 컨트롤러 생성해서 컨트롤러 어드바이스 테스트
이런 에러 발생 화면을 클라이언트에게 보여주면 안 된다..
패키지경로, 어떤에러인지, 등등 보여진다.
그대로 보여지는거 좋지 않다..
2-3 : 컨트롤러 에러 발생 시 에러 처리되는 경로 내가 직접 지정하기
- 내가 지정한 경로로 에러 처리 되게 만들고 싶다.
- 만드는 방법은?
- 어느 클래스에 간섭할 것인지 지정
- 어느 예외에 간섭할 것인지 지정
class
= @ControllerAdvice 로 등록
- 어느 클래스에 간섭할 것인지 지정 -
method
= @ExceptionHandler로 등록
- 어느 예외에 간섭할 것인지 지정 -
에러 처리 잘 잡혀서 – 콘솔 창에 출력되는 거 확인
페이지는 아직 안 만들어서404 에러남
#Check Point
- 구체적인 예외가 먼저 처리된다!
- 구체적 예외처리상황 정의된 게 있으면 – 그것으로 처리하고
- 구체적인 게 없으면 – 그 다음으로는 발생한 exception에 가까운 예외로 처리된다.
#Check Point
- 메서드의 파라미터로 발생한 예외 받아올 수 있다.
- 컨트롤러 담당 잔소리꾼인 ControllerAdvice는 Controller가 받을 수 있는 거 다 받을 수 있다
- ( HttpServletRequest 객체나 Model이나 등등 )
- 이것을 이용하면 – 500 에러 발생했을 때 그 에러를 받아서 에러 기록하는 곳으로 보내줄 수 있겠죠?
- 로깅에 이용할 수 있겠죠?
#PlusAlpah
- 컨트롤러 어드바이스를 가지고는 404 에러를 처리할 수 없다. - 다른 곳에서 처리
2-4 : 내가 만든 어노테이션 감지하도록 컨트롤러 어드바이스 설정하기
- 모든 컨트롤러를 감시하고 싶지 않은 경우에는?
- 특정 컨트롤러만 감시하고 싶은 경우에는?
- 어노테이션 만들어서 처리
- 어노테이션은 인터페이스이다.
#1. 사용할 어노테이션 만들고
#2. 만든 어노테이션에 대해서 감시하겠다고 해주고
#3. 감시할 곳에 내가 만든 어노테이션 붙여주고 테스트해보기
3. 로깅
- 에러 발생이나 무슨 일 있으면, 콘솔 창 출력했었다. 이런 거는 방법이 아니다.
- 24시간 보고 있을 것도 아니고, 시간이 지나면 없어지고, 찾기도 어렵다.
- 이제부터는
- 서버 측에서 무언가 기록할 때, 로거 객체를 이용해서 파일에다가 내용 남기도록해보자
- 로그를 남길 수 있는 여러 객체가 있다 .
- 그 중 우리는 log4j를 이용해서 남길 것이다.
- log4j 는 스프링에서 기본적으로 만들어져 있다. - pom.xml에서 확인
- 스프링에서는 log4j객체를 바로 사용하는 것이 아니라 slf4j를 이용하여 사용한다.
3-1 : slf4j 최신 버전으로 변경해주기
- 변수 값 수정
그룹id와 artifactid 같으므로 – 버전 레벨만 수정
변수 값 변경해주었으니 아래에서 사용하는 곳은 자동으로 변경될 것이다.
3-2 : log4j 최신 버전으로 <dependency> 추가해주기
- <scope>runtime</scope> 도 추가
로거 사용 준비 끝!
3-3 : Logger 객체 가져오기
3-4 : Logger 메서드 사용해보기
4. 로그 설정 파일
- src/main/resources/ log4j.xml
4-1 : Logger Level
- 위의 로거 메서드 사용 결과 콘솔 창에서 살펴보면 디버그와 트레이스가 안 나오고 있다.
- 로거 메서드 애들은 – System.out.print() 랑 다를 게 없다.
- 다만 출력문은 모든 상황에 출력되지만
- logger를 이용한 것은 레벨에 따라서 상황에 따라서 출력이 되거나 안되게 해 줄 수 있다.
# log4j 레벨 수준
# 로그 레벨을 사용하는 이유는?
- 코드의 흐름을 파악하기 위해 찍어놓은 출력문은 – 모든 상황에서 출력된다는 문제점과
- 필요 없을 때는 주석처리 또는 지우거나 따로 처리가 필요했다.
- 이거를 logger를 가지고 작업하면?
- logger-level만 변경해주면 된다.
# 코드 흐름 추적하려고 logger를 사용하는 경우
- 레벨을 trace나 debug로 지정해서 작성해주고
- 평소에는 출력되지 않게 해 주다가
- 확인하려고 하는 경우 설정파일-로그레벨 trace나 debug로 변경해주고 확인하면 된다.
4-2 appenders
- 지금까지 우리가 사용하던 거는 ConsoleAppender 였다.
- 새로운 어팬더 사용해보자!
- 콘솔창이 아닌 파일에 써주기 위해 FileAppender 사용해보자
#1. FileAppender - xml파일
- org.apache.log4j.FileAppender
- 어떤 파일에 로그 기록 작성해줄 것인지 정해주어야 한다. - xml파일에 기록해보자
- <param name="file" value="mylog.xml">
- append는 이어쓰기 여부 ( true = 이어쓰기 , false = 덮어쓰기 )
- 레이아웃은 XML 레이아웃 사용 - org.apache.log4j.xml.XMLLayout
스프링 시작하면 생김 – 처음엔 비어있을텐데 : 요청 보내면 채워져 있다.!.!
# FileAppender - txt파일
- org.apache.log4j.FileAppender
- <param name="file" value="mylog.txt">
- 레이아웃은 PatternLayout 레이아웃 사용 - org.apache.log4j.xml.PatternLayout
# DaillyRolling FileAppender - txt파일
- org.apache.log4j.DailyRollingFileAppender
- <param name="file" value="mylog.txt">
- <param name="DatePattern" value="yyyy-MM-dd" />
- 레이아웃은 PatternLayout 레이아웃 사용 - org.apache.log4j.xml.PatternLayout
## layout말고 DatePattern 부분 Check ##
날짜별로 로그를 관리해주는 데일리롤링파일어팬더
파일명의 날짜를 표현해주는 부분이 있는데 그 부분에 대한 패턴 설정
# 날짜별로 파일명 바뀌는 거 체크해보기 #
4-2 : Root Logger
- 위에서 특별히 정한 상황 없으면 여기서 정한 value 레벨 이상 로그 출력
- 위에서 등록한 어펜더 중 사용할 어펜더 지정
- 여러 개의 어팬더 같이 사용할 수도 있다.
4-3 : layout
- 로그를 어떻게 출력할지 지정해주는 파라미터
%p :
- 로그의 레벨을 표시해주는 애
- “%-10p :로 변경
- 자릿수 변경되는구나 :: 자리수 지정해주어서 보기 좋게 해 주는구나
%c
- 패키지부터 클래스 경로까지 : 패키지의 풀 경로
- 로거를 사용할 때 어떤 클래스를 기반으로 로거를 얻어왔고, 그 로거 객체를 이용하여 출력하고 있다.
- 이때 가져온 그 클래스의 정보를 출력해 줄 수 있다.
%m%n
- %m의 역할 – 메시지 내용
- %n의 역할 – 줄 바꿈 - 개행문자
%d
- date : 날짜 시간 관련 정보가 나온다.
- %d{ yyyy-MM-dd HH:mm:ss } 출력 형식 지정도 가능
5. 로거와 롬복 같이 사용해보기
- 로거 객체를 사용하기 위해서는 - 로거 적용할 클래스에 – 매번 로거 얻는 코드 적어주어야 한다.
- @ 어노테이션으로 쉽게 사용해보자
# 로거 적용할 클래스에 @Slf4j 어노테이션 달아주면 log 사용 가능!
다만 어노테이션으로 만들어주면 logger 가 아닌 log 명으로 생긴다.
# 로깅 정리 #
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 9월' 카테고리의 다른 글
22.09.21 - [ 12차 시험! - 통합 구현 ] (0) | 2022.09.29 |
---|---|
22.09.20 - [ Spring ] tx(트랜잭션), AOP(관점지향프로그래밍) (1) | 2022.09.29 |
22.09.16 - [ Spring ] DelegatingFilterproxy ,proxy, interceptor (0) | 2022.09.28 |
22.09.15 - [ Spring ] 암호화 처리, 리다이렉트 방법 (0) | 2022.09.21 |
22.09.14 - [ Spring ] Spring 작동 원리 , mapper.xml 파일 연결하기 (0) | 2022.09.20 |