Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/9월

22.09.19 - [ Spring ] lombok, controlllerAdvice, logger

giggs 2022. 9. 28. 13:17

 

-- 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 명으로 생긴다.

 

 

 

 

 


 

 

 

# 로깅 정리 #