Jackson Databind 에서 is, get, set 을 이용하면 자동으로 값으로 인식하는 이유
회사 코드를 작성하다가 DB 에 Json 파일을 업로드 하던 중에 자꾸 'isXXX' 로 적어둔 함수를 Jackson 라이브러리에서 Property 로 만드려고 하는 현상을 목격하였다. 이게 도대체 왜 그런거지? 라는 생각이 들었는데, 기본적으로 get / set / is 의 경우에는 해당 필드가 어떤 값을 나타내는지에 대한 함수라고 생각해서 Jackson 라이브러리가 이렇게 만드는 건가? 라는 생각이 들었다.
하지만 그게 편하다고 보통의 오픈소스 라이브러리에서 그렇게 만들지는 않으므로 무언가 따르는 규칙이 있을거라고 생각했다. 사실 저 위의 문구만 봐도 감이오는 사람이 있을텐데. 바로 자바 빈 규약 (Java Bean notation) 이다. 예전에 한번 본적이 있었는데 한글 블로그에는 대다수가 그렇게 좋은 글이 별로 없어서 그냥 내가 본것 중 제일 정리가 잘된 외국 문서를 달려고 한다.
https://docstore.mik.ua/orelly/java-ent/jnut/ch06_02.htm
그렇다면 이제 심증은 확보됬으니 증거를 찾아야 한다. 이럴때 가장 좋은것은 해당 라이브러리의 깃허브에 들어가서 Issue 를 살펴보는 것이다. 분명 나와 같은 생각을 하고 Issue 에 질문을 한 사람들이 있을 것 이다. 찾아 보니 아래와 같은 Issue 가 있었다.
답변을 보니 이미 DefaultAccessorNamingStrategy 라는 곳에서 동작하고 있다고 하는 것 같다.
한번 해당 클래스를 가서 찾아보자.
코드를 보아하나 is 가 붙은 getter Prefix 를 자동적으로 값으로 잡아주는 것 같다.
여기서 보면 느끼겠지만 참 축약이 많다. rt => returnType 등등.. '_' 는 왜적는거지..? 나도 잘 모르겠지만 그들만의 컨벤션이니 나중에 궁금한점을 물어보고 싶다는 생각이 들었다. 마틴파울러는 (_) 를 지역 변수를 나타낼때 쓰던데.. 홀홀 좋은지는 잘 모르겠다.