Logging
- 어플리케이션 개발 중 혹은 완료 후 발생할 수 있는 오류를 디버깅하거나 상태를 모니터링하기 위헤 필요한 정보를 기륵하는 것.
개발 중에 필요한 완료시에 필요한 로그를 구분하기 위해서 Sysout으로 개발 중에 내가 어떤 메시지가 필요한지 확인하고, 주석하고 풀고... -> 매번 컴파일/재컴파일 하게됨
개발상태, 완료상태를 알려주는 Sysout... 로깅처리하기 좋은 부분은 아니다
Java 주요 Logging framework
- Log4j
- Logback: Log4j의 후속버전으로 더 많이 쓰임 - SpringBoot에 포함되어있다
- tinylog: 최소형 로그처리 (소형 애플리케이션에 맞음 예) 모바일, 스마트카드...)
- SLF4J(Simple Loggnig Facade For Java)
- 자바 주요 로깅 프레임워크의 표준안
- 파사드(facade) 패턴: 쓰기 쉽게, 단순하게 바꿔주는 것.

- logback, log4j, jul = slf4j의 구현체이다.


로깅처리를 하기 위해서는 SLF4J와 연결된 slf4j-log4j12.jar 라이브러리가 필요하다.
slf4j-log4j12.jar 가 사용하려고하는 로깅 프레임워크가 log4j일때 slf4j api의 사용법을 보면서 사용하게 된다. 왜냐하면 slf4j api가 표준안이기 때문에.
각각의 실제 프레임워크의 사용법으로 직접사용하면 사용법이 서로 조금씩 달라서 프레임워크 기능이 꼬일 수 있다.

- 따라서 이걸봐도 logback을 쓰려면 logback-classic-{}.jar같은 바인딩을 위한 라이브러리와 logback-core같은 와 slf4j-api사용법이 들어있어야한다.

- 실제 기술은 logback이지만 slf4j 문법을 쓰면 알아서 호출되므로 저걸로 선택


- 로그 레벨
- TRACE < DEBUG < INFO < WARN < ERROR 로 나누어진다.
TRACE 레벨 : 상세정보를 나타낸다. (너무 상세해서 안씀)
DEBUG 레벨 : 디버깅하기위해 표시한다.
INFO 레벨 : 상태의 변경정보를 표시한다.
WARN 레벨 : 경고성 메시지를 표시한다.
ERROR 레벨 : 오류발생한 경우를 표시한다.

- 스프링 부트의 기본 log 레벨이 INFO 이기 때문에 그 하위 log들은 안뜬다.

- INFO 보다 높은 애들은 다 뜬다.

- application.properties에서 log 레벨을 설정할 수 있다.
- 패키지 단위로도 레벨 설정이 가능하다
- 셀렉트 구문 결과가 drivethru에 의해서 표처럼 보여줬는데 그거 싫어! 하면
(customer에 관련된 sql 구문 로그들을 레벨 warn으로 설정하면 표같은게 나타나지않는다.)

- 오호 jdbc.resultsettable 때문에 이렇게 보이는구나

- 더이상 로그인했을 때 표처럼 보이지 않고, sql 문이 나온다.
개발할 때 필요한 로그 / 배포할 때 필요한 로그
개발용 application-dev.properties
- logging.level.root=info
배포용 application.properties
- logging.level.root=warn
개발환경
① application.properties 파일위치
conf > src/config > src/main/resources
conf에 저장하는 application.properties의 우선순위가 가장 높아서 먼저 실행된다.
- 따라서 여기저기 properties파일이 있을 때는 우선순위가 높은 곳에 있는 properties 부터 시작되므로 잘 정해야한다.
② 개발환경(dev, qa...)별 파일이름은 프로필별로 구분한다.
- application.properties
- application-dev.properties (-dev: dev 프로필 -> 보통 개발중인 환경)
- application-qa.properties (-qa: qa 프로필 -> 보통 테스트중인 환경)
③ 프로필 설정
- application.properties 파일의 spring.profiles.active=프로필이름
ex) spring.profiles.active=dev -> application-dev.properties이 실행

- spring.profiles.active=dev을 설정해주면

- 주석을 처리해주면 다시 원래 설정해놓은 warn 레벨부터 나온다.

- 따라서 개발환경일 때, 테스트 환경일 때 적절하게 바꿔가면서 사용한다.
배포후에는
로그를 콘솔로 보는게 아니라, 파일로 관리해야한다.
logging.file.path=
로 로그파일이 저장될 경로 설정

- info로 하면 log가 확늘어나면서 파일사이즈를 넘겨버림
- 파일사이즈를 넘어가면 알아서 0번 idx부터 파일이 만들어진다.


- 로그메시지를 커스텀하고 싶다면
logging.pattern.console=
예) %5level -> 5는 다섯자리라는 뜻, %msg%n -> msg+개행

- 패키지를 표시하거나 할 수도 있음
설정파일을 스프링부트가 지원해주는걸 쓰거나 새로 만들어 써도 된다.
default을 안쓰고 콘솔에 보여줄 때의 패턴, 파일의 보관주기 등 설정 가능

로그를
- 제일 많이활용하는건 JUnit 단위테스트때!

스프링에서는 이렇게 해줬지만,
스프링부트에서는 @SpringBootTest
만 선언해주면되고,
locations 대신
@Transactional 을 붙이고 JUnit을 해보면

- setAutoCommit(false)가 되어있는것을 볼 수 있다.

위에서 부터 console 내용을 읽어보면

더 내려보면

DB에도 제목XXX, 내용XXX 안들어가있는거 확인가능!

controller는 mocker를 이용해서 단위테스트하는게 까다롭기때문에 포스트맨 추천!!!