작성
·
786
0
답변 3
2
안녕하세요! 질문하신 내용 읽고 저도 궁금해서 조금 찾아봤는데요
완벽한 답변은 아니지만 도움이 되실까 싶어 글을 남겨 봅니다.
1. 로거의 동작 원리
org.slf4j.helpers라는 패키지에 보시면 MessageFormatter라는 클래스가 있는데, 그 중 arrayFormat이라는 메소드를 봐보세요.
로깅할 문구를 생성할 때 내부적으로 StringBuilder를 쓰고 있음을 알 수 있습니다.
log.error("test: {}, {}", 1, 2);
위의 코드를 예시로 들자면,
개발자가 적은 메세지 포맷("test: {}, {}")에서
"{}"가 선언된 위치를 찾아 파라미터(1과 2)로 치환해주는 식으로 동작하는 듯 합니다.
형식 지정자를 따로 사용하지 않아도 로거 문구가 알아서 잘 생성되는 이유는 toString()메소드를 이용해 모든 파라미터를 String 형으로 바꿔주기 때문입니다. (MessageFormatter.safeObjectAppend 참고!)
파라미터에 String 타입이 아닌 Map이나 다른 객체가 들어와도 에러가 나지 않는 이유는 모든 Object는 toString() 메서드를 가지고 있기 때문이죠
이외에 logback의 경우 logback.xml에 지정하는
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
이런 패턴이 어떻게 적용되는지 궁금하다면
package ch.qos.logback.classic 아래에 있는 PatternLayout 클래스를 살펴보시면 좋을 것 같고요!
2. errors.properties의 오류 메시지 동작 원리
이런 내용을 errors.properties 파일에 넣었을 때
{0}과 {1}에 어떻게 값이 들어가는지 궁금하시다면
스프링 프레임워크의 MessageSourceSupport 클래스와
java.text 아래에 있는 MessageFormat 클래스를 참고해 보시기 바랍니다
디버깅 도구를 쓸 줄 아시면 공부에 많은 도움이 되실 거에요
덕분에 저도 공부를 하게 되었네요~ 재밌는 질문 감사합니다 :)
0
답변 감사합니다. 자바 format 함수가 있는 것은 확인했는데 질문 좀 정리해서 드리겠습니다!
1. slf4j나 bindingResult에서 arguments를 치환하는 것은 내부적으로 format 함수가 사용되는 건가요??
2. format 함수를 찾아보니 format("%d", a)는 형식 지정자를 사용해야 하는데 slf4j나 bindingResult처럼("{0}", a) 형식 지정자 없이 사용하는 건 어떻게 가능한 건가요??
slf4j가 제공하는 형식, bindingResult 등은 특별한 포멧이 있는 것은 아니고 각자의 방식으로 제공되는 것으로 알고 있습니다.
혹시 관련해서 아시는 분 있으면 말씀해주세요.
감사합니다.
오 감사합니다! 덕분에 디버그 모드로 브레이크 포인트에 진입하는거 처음 해봤습니다! 디버깅 도구도 좀 더 찾아서 공부해보겠습니다.
+ 원래 질문도 시원하게 해결됐습니다 감사합니다 !