인프런 커뮤니티 질문&답변

code-tree님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

오류 코드와 메시지 처리1

치환 문자(?) 질문 드립니다!

작성

·

786

0

문자열을 반환 시 "hello" + data 처럼 '+' 인자를 사용하면 연산 속도 등의 문제로 {0}, {1} .. 와 같이 치환문자로 arguments를 전달하는 방법을 사용하는 것으로 알고 있는데
치환문자로 arguments를 전달하는 방법이 특정 상황에만 쓰이는 것 같습니다. (로그 작성시나 errors.properties 메시지 작성할때 )
 
이러한 문법(?)을 뭐라 하는지, 언제 사용할 수 있는지 찾아보고 싶은데 검색 키워드 좀 말씀해주시면 감사하겠습니다.
치환 문자에 대해 검색해보니 문자열 치환(replace) 설명만 나오네요 ㅠㅠ
 

답변 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의 오류 메시지 동작 원리

totalPriceMin=가격 * 수량의 합은 {0}원 이상이어야 합니다. 현재 값 = {1}

이런 내용을 errors.properties 파일에 넣었을 때
{0}과 {1}에 어떻게 값이 들어가는지 궁금하시다면
스프링 프레임워크의 MessageSourceSupport 클래스와
java.text 아래에 있는 MessageFormat 클래스를 참고해 보시기 바랍니다

디버깅 도구를 쓸 줄 아시면 공부에 많은 도움이 되실 거에요
덕분에 저도 공부를 하게 되었네요~ 재밌는 질문 감사합니다 :)

 

code-tree님의 프로필 이미지
code-tree
질문자

오 감사합니다! 덕분에 디버그 모드로 브레이크 포인트에 진입하는거 처음 해봤습니다! 디버깅 도구도 좀 더 찾아서 공부해보겠습니다.

+ 원래 질문도 시원하게 해결됐습니다 감사합니다 !

0

code-tree님의 프로필 이미지
code-tree
질문자

답변 감사합니다. 자바 format 함수가 있는 것은 확인했는데 질문 좀 정리해서 드리겠습니다!

1. slf4j나 bindingResult에서 arguments를 치환하는 것은 내부적으로 format 함수가 사용되는 건가요?? 

2. format 함수를 찾아보니 format("%d", a)는 형식 지정자를 사용해야 하는데 slf4j나 bindingResult처럼("{0}", a) 형식 지정자 없이 사용하는 건 어떻게 가능한 건가요?? 

김영한님의 프로필 이미지
김영한
지식공유자

slf4j가 제공하는 형식, bindingResult 등은 특별한 포멧이 있는 것은 아니고 각자의 방식으로 제공되는 것으로 알고 있습니다.

혹시 관련해서 아시는 분 있으면 말씀해주세요.

감사합니다.

0

안녕하세요. code-tree님, 공식 서포터즈 OMG입니다.

해당 기능은 자바가 아닌 파이썬에서 쓰이는 것을 본적이 있어 파이썬으로 찾아보았습니다.

position(al) 혹은 (index)

formatter(formatting)으로 검색해보시면 될 것 같아요.



감사합니다.