안녕하세요. 오늘은 Java를 이용하여, OS에 호환 되는 파일 경로 구성 방법과 웹 경로에 사용되는 / 문자열을 OS에 맞게, 파일 구분자로 변환하는 방법을 간단하게 포스팅 합니다.

OS마다 서로 다른 파일 구분자

파일 구분자는 OS마다 서로 다릅니다. 예를들어, 윈도우 운영체제는 파일 구분자로 \\ 역슬래쉬 두개를 사용합니다. 리눅스 운영체제는 웹 경로 문자열과 똑같이 파일 구분자로 /를 사용합니다.

Java는 이러한 서로 다른 파일 구분자를 처리하기 위해 JVM이 실행되는 OS 환경에 맞는 파일 구분자를 제공하는 API가 존재합니다.

String fileSeparator = File.separator;

따라서, 위의 API를 이용하면 OS에 호환되는 파일 경로를 구성할 수 있습니다.

String filePath = "Java" + File.separator + "Mommoo";

만약 Java7이상을 사용 하신다면, OS에 호환되는 파일 경로는 Path API를 사용하면 쉽게 구성할 수 있습니다.

String filePath = Paths.get("Java", "Mommoo");

OS 파일 구분자와 / 구분자 변환 처리하기

때때로, / 구분자를 파일 저장을 하기 위해 OS에 호환되는 파일 경로를 구성하고 싶을때가 있습니다. 단순히, / 구분자를 File.separator로 바꿔주면 됩니다만, Java API에 특정처리를 해줘야 합니다.

우리는 어떤 문자를 다른 문자로 바꾸고 싶을 때, Java String API의 replace API를 사용하곤 합니다. replace API는 바꿀 기준을 정할 때, 문자열이 아닌 정규식으로도 구성 할 수 있습니다. 문제는 여기서 생깁니다. 우리가 파라미터로 넣어준 것이 문자열 인지, 정규식 인지 구분이 안가는 상황이면, API는 정규식으로 처리합니다. 즉, 아래와 같이 구분자 처리를 한다면,

String testPath = "Java/Mommoo";
String filePath = testPath.replaceAll("/", File.separator);

윈도우 OS 에서는 오류가 발생합니다.

그 이유는, 윈도우 OS의 File.separator"\\"로 나오는데, 이 문자열을 정말 문자열로 해석하는 것이 아닌 정규식으로 해석합니다.

그러한 이유로 제대로 작동 되질 않습니다.

따라서, "\\"를 작동 가능한 문자로 바꿔주어야 합니다.

사실 아스키 코드 92번인'\\' char 문자로 넣어주면 됩니다만, replace API는 문자열을 파라미터로 받는 이유로 char 배열을 다시 String으로 변환 하는과정이 번거롭습니다.

따라서, Matcher API인 quoteReplacement를 사용합니다. 해당 API는 위에서 말한, char 문자 '\\'를 넣어준 문자열로 바꿔주는 역할을 합니다.

최종적으로 아래와 같이 API를 사용하면 정상적으로 작동 합니다.

String testPath = "Java/Mommoo";
String OsFilePath = testPath.replaceAll("/", Matcher.quoteReplacement(File.separator));
String reverseSlashPath = OsFilePath.replaceAll(Matcher.quoteReplacement(File.separator), "/");

오늘 준비한 포스팅은 여기까지 입니다.

읽어주셔서 감사합니다.

'Java' 카테고리의 다른 글

[Java] CheckedException vs UnCheckedException  (0) 2020.09.27
JAVA - JNI 사용하기  (2) 2017.09.02
JAVA - [SWING] LinearLayout 사용하기.  (0) 2017.08.25
JAVA - DownCasting(다운캐스팅)  (25) 2016.08.27
JAVA - HashMap key 구하기.  (1) 2016.08.25

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee



안녕하세요. 오늘은 자바스크립트로 요소의 위치를 구하는 방법에 대해 포스팅 합니다.

요소의 위치를 구할 때, 생각해야할 개념이 있습니다. 이 개념은 자바스크립트 뿐만 아니라, 모든 화면 영역에서 공통으로 쓰이는 개념이라 생각하시면 됩니다.

해당 개념은 크게 절대위치와 상대위치 2가지로 설명 됩니다.

좌표를 처리하는 것은 생각보다 까다로우며, 단순히 API 하나로 처리되지 않습니다. 따라서 좌표를 잘 처리하기 위한 개념을 설명하고, 그 개념을 토대로 좌표를 구하는 방법에 대해 설명 할 예정입니다.

또한 Y값 기준으로 내용을 전개하며, 해당 개념을 그대로 X값을 구하시면 됩니다.

절대위치상대위치란?

절대위치시작점으로 부터 떨어진 크기 값입니다. 중요한건 시작점이 어디인지 아는것이 매우 중요합니다. 따라서, 자바스크립트의 절대위치시작점은 어디서 부터 인지 후에 설명 할 예정입니다.

상대위치어떤 기준으로 부터 떨어진 크기 값입니다. 어떤 기준은 시작점도 될 수 있으며, 시작점이 아닌 다른 곳을 기준으로 삼을 수도 있습니다. 마찬가지로 자바스크립트는 어떤 기준을 어떻게 세우는지를 후에 설명 할 예정입니다.

자바스크립트의 절대위치상대위치의 기준

해당 그림의 회색 네모 부분은 컨텐츠 길이를 의미합니다. 너무 길이서 브라우저에서 스크롤을 하면서 봐야 합니다. 크롬 브라우저의 하얀 네모부분은 Viewport 라고 합니다. 우리가 자주 쓰는 window 객체의 화면 API의 기준이 되는 부분입니다. 또한 그림에서 Hello World!! , Hello JavaScript!! 문자 요소가 존재하며, 크롬 브라우저는 스크롤 되어,컨텐츠의 Hello World!! 요소를 지나 현재 Hello JavaScript!!! 요소를 보여주고 있는 상태입니다. 해당요소의 절대위치상대위치를 구하는 방법을 통해 설명할까 합니다.

해당 그림은 아래 설명에서 전반적으로 계속 사용될 예정입니다.

창을 2개 켜서 해당 그림이랑 같이 읽는걸 강력하게 추천합니다.




자바스크립트의 절대위치시작점은 그림의 컨텐츠의 시작점을 의미 합니다.

따라서, Hello World!!의 요소와 Hello JavaScript!!의 요소의 절대좌표는 컨텐츠 시작점으로 떨어진 거리를 의미 합니다. 즉 그림의 1번 길이라 볼 수 있습니다.

자바스크립트의 상대위치어떤 기준은 누굴 선택하느냐 문제입니다. 여러가지가 있지만, 해당 예시는 그림의 브라우저가 보여주는 스크롤된 컨텐츠 시작 부분 즉, Viewport 의 시작지점을 기준으로 삼는다고 가정하면 그림의 2번 길이라 볼 수 있습니다.

자바스크립트로 상대위치 구하기

상대위치 구하는 방법부터 기술하는 이유는 절대위치를 구하기 위해서는 상대위치를 이용해서 구해야 하기 때문입니다. 또한 절대위치는 콘텐츠의 시작 기준이므로, 음수 값은 잘 나오지 않는 반면 상대위치는 기준이 천차만별이므로, 음수 값이 빈번하게 나올 수 있습니다.

앞서 언급한대로 상대위치어떤 기준이 매우 중요합니다. 준비한 예시는 2가지의 기준으로 설명합니다.

Viewport의 시작지점 기준

해당 자바스크립트 API는 getBoundingClientRect 이며 예시는 아래와 같습니다.

const target = document.getElementById('target'); // 요소의 id 값이 target이라 가정
const clientRect = target.getBoundingClientRect(); // DomRect 구하기 (각종 좌표값이 들어있는 객체)
const relativeTop = clientRect.top; // Viewport의 시작지점을 기준으로한 상대좌표 Y 값.

예시 그림의 2번 길이를 기준으로 만약 Hello World!! 요소라면 음수 값이 나오며 Hello JavaScript!! 요소라면 양수 값이 나올 것 입니다.

프로그래밍에서 화면 좌표값은 화면 왼쪽 끝을 기준으로 (0,0)

X값은 오른쪽 방향이 양의 값, 왼쪽 방향이 음의 값이며

Y값은 아래방향이 양의 값, 위 방향의 음의 값입니다.

부모 요소의 시작지점 기준

조금 복잡합니다. 그 이유는 부모가 포지셔닝 정책이 무엇이냐가 중요합니다. 만약 부모가 position: relative 정책이라면, 부모 요소안의 자식 요소의 상대위치offsetTop API를 사용하면 됩니다. 하지만, 부모의 포지셔닝이 relative가 아니라면, 해당 API는 부모 요소기준이 아닌 상위 요소의 포지셔닝을 계속 탐색하여 relative가 있는 부모를 기준으로 좌표값을 계산합니다. 만약 자식 요소의 상위 요소들이 전부 relative 포지셔닝이 아니라면, 결국 offsetTop API는 컨텐츠의 시작지점 즉, 절대위치의 값을 리턴하게 됩니다.

정리하자면 offset API 시리즈는 부모의 포지셔닝 정책에 따라 절대좌표 or 상대좌표가 나올 수 있으므로, 조심해서 써야 합니다.

offset API 시리즈는 offsetTop, offsetLeft, offsetWidth, offsetHeight 등이 있습니다.

그래서 부모 요소를 기준으로한 상대 위치는 부모 요소의 절대 위치를 구한 후, 자식 요소의 절대위치를 구해 두 값의 연산을 통해, 구하는 것이 가장 안전한 방법이라 할 수 있습니다.

그 방법은 아래의 자바스크립트로 절대좌표 구하기 섹션을 먼저 진행 한 후, 마지막 섹션의 예시로 설명 할 예정입니다.

자바스크립트로 절대좌표 구하기

대부분 offset API로 절대좌표를 구합니다. 하지만, 위에서 설명했드시 해당 요소의 상위 요소중 하나라도 포지셔닝이 relative면 offset API는 절대좌표가 아닌 relative한 부모 요소의 상대좌표값이 구해집니다.

따라서, 안전하게 절대좌표를 구하는 방법을 소개할까 합니다.

어떤 아이디어로?

위에서 소개한 Viewport 의 시작 지점을 통한 상대좌표를 이용할 예정입니다. 만약 Hello World!!절대좌표를 구한다고 한다면, 1번 길이를 구해야 합니다. 1번 길이는 아래와 같이 구할 수 있습니다.

1번 길이 = 3번길이 - 2번길이

즉, 스크롤된 컨텐츠의 길이와 Hello World!!Viewport 상대좌표를 연산하여 구하는 것입니다.

이해를 하셨다면 아래의 코드 예시를 참고해주세요.

const target = document.getElementById('target'); // 요소의 id 값이 target이라 가정

const clientRect = target.getBoundingClientRect(); // DomRect 구하기 (각종 좌표값이 들어있는 객체)
const relativeTop = clientRect.top; // Viewport의 시작지점을 기준으로한 상대좌표 Y 값.

const scrolledTopLength = window.pageYOffset; // 스크롤된 길이
//const scrolledTopLength = pageYOffset; // window 객체 없이 pageYOffset 메서드를 써도 가능하다.
const absoluteTop = scrolledTopLength + relativeTop; // 절대좌표

자바스크립트로 안전하게 절대좌표상대좌표를 구하는 예시

상황마다 값이 다르게 나오는 코드 보다는 추가적인 계산을 좀더 하더라도 안전하게 값을 구할 수 있는 코드를 원할때가 있습니다. 위의 설명을 토대로, 상황에 상관없이 안전하게 값을 구할 수 있는 예시로 정리해봤습니다.

1. 요소의 절대좌표 구하기.
const absoluteTop = window.pageYOffset + element.getBoundingClientRect().top;
2. Viewport의 시작지점을 기준으로한 상대좌표
const relativeTop = element.getBoundingClientRect().top;
3. 부모요소의 시작지점을 기준으로한 상대좌표
// 1번에서 안내한 절대좌표 구하는 방법을 함수로 구현
function getAbsoluteTop(element) {
   return window.pageYOffset + element.getBoundingClientRect().top;
}

const parentElement = element.parentElement;
const parentAbsoluteTop = getAbsoluteTop(parentElement);
const absoulteTop = getAbsoluteTop(element);

const relativeTop = absoluteTop - parentAbsoluteTop;

예시 말고도, 구하고 싶은 좌표값이 있다면 앞서 설명한 개념을 토대로 전부 구할 수 있다고 생각합니다.

생각보다 설명하기가 너무 어려웠으며... 그림 자료도 힘들게 만들었습니다. 저의 능력부족...

도움이 되셨다면, 공감 버튼과 광고 한번씩 만 눌러주시면 감사하겠습니다.

오늘 준비한 포스팅은 여기까지 입니다.

긴 글 읽어주셔서 정말 감사합니다.



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee



안녕하세요.

오늘은 Eclipse IDE에서 매우 편리하게 사용했던, tab 기능을

IntelliJ IDE에 적용하는 방법에 대해 짧게 포스팅 합니다!.

Eclipse IDE 의 Tab 기능

Eclipse IDE를 사용 할 때, 함수의 파라미터를 넣을 때,

String 데이터 같은 경우는 "" 문자열로 감싸주어야 합니다.

보통 IDE" 하나를 작성하면, ""문자열 자동 완성이 되어 커서가 쌍따옴표 안으로 이동하고, 저희는 문자열을 열심히 작성합니다.

그 후, 다른 파라미터를 작성하거나 코드 문장을 완성시키기 위해 ""문자열을 벗어나야 합니다. 따라서 저희는 > 화살표 키보드를 눌러 ""를 탈출하여 작업을 진행하곤 합니다.

해보시면 알겠지만 >화살표 키보드를 눌러가며 코드치는게 생각보다 손 움직임이 많이 발생하게 됩니다.

물론 타자를 잘 치시는 분들은 문제가 없을 수도...타자를 잘 못치는 저로써는, 너무 너무 짜증납니다.

이런 상황에서 Tab 단축키를 사용하면 매우 편리합니다. 화살표 키보드를 누르지 않고, 손위치에 가까운 Tab 단축키를 누르기만 하면, ""문자열을 빠져 나올 수 있습니다. 만약 파라미터를 다 작성 하고 Tab단축키를 누른다면, 메서드의 ()구간을 빠져나가 화살표 키보드를 누를 필요가 없어지죠!

IntelliJ IDE 같은 경우에는 맨 마지막 구간으로 캐럿을 이동 하는 경우의 수 하나는 단축키로 존재합니다. 단축키는 Ctl + Shift + Enter 입니다.

Tab 기능을 말로 설명하려고 하니까 정말 난감하네요... 참 좋은건데.. 정말 좋은건데.. 뭐라 설명할 방법이 없는.. 만약 안써보셨으면 한번 써보시는게 제일 좋습니다.!

아무튼, 이런 Eclipse Tab 기능에 익숙해지다가 IntelliJ IDE에 와서 Tab 단축키를 눌렀을 때는 절망이 였습니다.

그냥 순수한 Tab키의 기능을 수행 하더군요...

Eclipse IDE 처럼, IntelliJ IDE에 Tab 기능을 넣어보자.

사실, 제가 원하던 Tab 기능은 IntelliJ IDE 에는 존재하지 않았습니다.

어쩔 수 없이 화살표 키보드 눌러가며 열심히 작성하다가 우연히 인터넷 서핑 중, 반가운 소식을 접하게 되었습니다.

그 소식은 2018.2 버전 이후로 Eclipse IDE 처럼 IntelliJ IDE 에도 설정을 통해 Tab 기능을 설정 할 수 있다. 는 것 이였습니다.

역시 나만 불편한게 아니였나보다...!

설정 하는 방법은 매우 간단합니다. 아래의 항목대로 따라하시면 됩니다.

  • Settings 창을 켠다. (File -> Settings...) or (Ctrl + Alt + Enter)

  • Editor 탭을 여신 후, General 탭을 열어주세요.

  • Smart Keys 탭을 여신 후, 상단 섹션에 Jump outside closing bracket/quote with tab 체크 박스 항목을 활성화 해주세요.

오늘 준비한 포스팅은 여기까지 입니다.

읽어주셔서 감사합니다...!

'IDE' 카테고리의 다른 글

[IntelliJ] IDEA DB Client 사용하기  (0) 2019.11.07
[Eclipse] 이클립스 폰트 설정  (0) 2016.04.08

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee




안녕하세요.

오늘은 Spring 프레임워크에 빼놓을 수 없는 라이브러리중 하나인 Jackson에 대해 간단하게 포스팅 합니다.

주의!! 해당 포스팅은 Jackson의 라이브러리 2.9.7 버전을 다룹니다.

또한, 프로젝트에 Jackson 라이브러리의 설치 방법에 대해서는설명하지 않습니다.

패키지 매니저를 쓰면 너무 간단하며, 구글에 검색해보면 엄청 많이 나와요우우

Jackson 라이브러리?

Spring 개발을 하다 보면, 컨트롤러 text/html 형식이 아닌 데이터 전달 목적으로 사용하고 싶을 때가 있습니다. 물론, 쌩 문자열인 plain/text 형식으로 보내도 상관은 없습니다만, 보통은 데이터 구조를 표현하는 방식인 XML 또는 JSON 형태로 많이 보냅니다.

데이터의 구조를 표현하는 이유는 데이터 표현도 있지만, 사실상 데이터를 사용하는 대상이 편하게 사용하기 위해서 입니다.

이 두개 중 JacksonJSON 데이터 구조를 처리해주는 라이브러리 입니다.

만약 JSON으로 데이터 구조를 표현 한다면, 아래와 같습니다.

{
   "name": "Mommoo",
   "age": 28,
   "isDeveloper": true,
   "equipment": ["NoteBook", "Mouse", "SmartPhone"],
   "etc": {
       "favoriteFood": 'Coffee'
  }
}

Jackson 라이브러리의 없이, JSON 데이터를 작성해보자.

Java에서 데이터를 저장할 때는, 아래와 같이 인스턴스를 사용합니다.

public class Person {
   private String name;
   private String job;
   
   public Person(String name, String job) {
       this.name = name;
       this.job = job;
  }
   
   public String getName(){
       return name;
  }
   
   public String getJob() {
       return job;
  }
}

public static void main(String[] args) {
   Person person = new Person("Mommoo", "Developer");
}

JSON 데이터를 어떻게 작성할까요? 그냥 작성해야 합니다... 아래와 같이요

미친짓이니 따라하지 마세요

String JSON = "\"{"+
   "\"name\": \"" + person.getName() + "\","+
   "\"job\": \"" + person.getJob() + "\""+
"}\"";

JavaSingle Quotes즉, 쌍따옴표("")를 정말 문자열로 사용하고 싶을때는 위와 같이 \문자를 붙여줘야 합니다. 끔찍한 코딩은 덤

항상 저렇게 코딩 할 순 없으니, JSON 변환용 클래스를 따로 만들고 그 클래스안에 저장된 멤버변수를 이용하여 JSON 데이터를 출력하는 클래스를 생각하게 됩니다.

대표적인 클래스가 Google 이 만든 GSON 또는 SimpleJSON 등이 있습니다.

SimpleJSON을 예로 든다면, 윗 코딩이 아래와 같이 바뀝니다.

JSONObject jsonObject = new JSONObject();
jsonObject.put("name", person.getName());
jsonObject.put("job", person.getJob());
String JSON = jsonObject.toString();

해당 방식은 지금도 많이 쓰입니다.

물론 Spring 컨트롤러에 위와 같이 코딩하여 리턴하더라도, 충분합니다.

그렇다면, Jackson은 무엇을 더 제공하길래 SpringJackson을 더 선호하는 것일까요?

Jackson과 기존 GSON or SimpeJSON과의 차이?

사실 차이는 없습니다.

JacksonObjectMapper API를 사용하여, 여타 GSON or SimpeJSON과 같이 객체에 데이터를 셋팅해줘야 하는건 마찬가지 입니다.

특별한 점은 Spring 프레임워크와 Jackson의 관계로부터 장점이 있습니다.

Spring 3.0 이후로부터, Jacskon과 관련된 API를 제공함으로써, Jackson라이브러리를 사용할때, 자동화 처리가 가능하게 되었습니다.

덕분에, JSON데이터를 직접 만들던가, GSON or SimpleJSON방식과 같이 직접 키와 벨류를 셋팅하는 방식에서 한단계 더 발전한 방식이 가능해졌습니다.

어떤 방식이길래 발전했을까요? 아래의 Jackson의 동작 원리와 함께 설명할까 합니다.

Jackson 은 어떻게 동작하는가?

Spring3.0 이후로 컨트롤러의 리턴 방식이 @RequestBody 형식이라면, SpringMessageConverter API 를 통해, 컨트롤러가 리턴하는 객체를 후킹 할 수 있습니다.

JacksonJSON데이터를 출력하기 위한 MappingJacksonHttpMessageConverter를 제공합니다. 만약 우리가 스프링 MessageConverter를 위의 MappingJacksonHttpMessageConverter으로 등록한다면, 컨트롤러가 리턴하는 객체를 다시 뜯어(자바 리플렉션 사용), JacksonObjectMapper APIJSON 객체를 만들고 난 후, 출력하여 JSON데이터를 완성합니다.

더욱 편리해진 점은, Spring 3.1 이후로 만약 클래스패스에 Jackson 라이브러리가 존재한다면, ( 쉽게 말해Jackson을 설치했느냐 안했느냐 ) 자동적으로 MessageConverter가 등록된다는 점입니다.

덕분에 우리는 아래와 같이 매우 편리하게 사용할 수 있습니다.

@RequestMapping("/json")
@ResponseBody()
public Object printJSON() {
   Person person = new Person("Mommoo", "Developer");
   return person;
}

이제는 그냥 데이터 인스턴스만 리턴 하더라도 JSON 데이터가 출력됩니다. 엄청나죠ㄷㄷ

위에서 설명한 방식보다 매우 진보한 방식인걸 알 수 있습니다.

다만, Jackson을 더 잘쓰기 위해서는 알아야 하는 기본 지식이 몇가지 존재합니다.

Jackson을 사용하기 위해 알아야 하는 기본지식

소개하는 기본 지식은 순전히 제 생각입니다... 의견이 다를 수 있습니다.

Jackson은 기본적으로 프로퍼티로 동작합니다.

Java프로퍼티를 제공하는 문법이 없습니다. ( 멤버변수랑은 다릅니다. )

Java프로퍼티는 보통 GetterSetter의 이름 명명 규칙으로 정해집니다.

문법적으로 정해지는것이 아니다 보니, 개발자가 일일이 신경써줘야 하는게 자바의 단점 중 하나입니다.

Person 같은 경우는 Getter만 존재 하므로, Getter를 기준으로 프로퍼티를 도출 할 수 있습니다. 즉 NameJobPerson 프로퍼티입니다.

Person의 멤버변수 이름도 똑같이 name, job이지만,

앞서 설명했드시 프로퍼티Getter, Setter기준이므로 멤버변수 이름을 변경하더라도 상관 없습니다.

갑자기 프로퍼티를 설명한 이유는 많은 라이브러리가 해당 프로퍼티 개념으로 작동하기 때문입니다.

Jackson라이브러리도 마찬가지 입니다. JSON데이터로 출력되기 위해서는 멤버변수의 유무가 아닌 프로퍼티 즉, Getter, Setter를 기준으로 작동합니다.

예로 아래와 같이 코딩하더라도 전혀 문제가 없습니다.

public class Person {
   public String getName() {
       return "Mommoo";
  }
   
   public String getJob() {
       return "Developer";
  }
}

@RequestMapping("/json")
@ResponseBody()
public Object printJSON() {
   return new Person();
}

결론적으로 Jackson을 사용한다면, Getter에 신경쓰셔야 합니다!!.

Jackson의 데이터 매핑을 Getter가 아닌 멤버변수로 하고 싶다면?

그렇다면, 이번에는 Jackson의 매핑을 프로퍼티가 아닌 멤버변수로 할 수 있는 방법은 무엇일까요? Jackson은 이와 관련하여 @JsonProperty 어노테이션 API를 제공합니다. 아래와 같이 멤버변수 위에 프로퍼티 이름과 함께 선언해준다면, JSON데이터로 출력 됩니다.

public class Person {
@JsonProperty("name")
   private String myName = "Mommoo";
}

위의 예시는 {"name": "Mommoo"}로 출력 됩니다.

그렇다면 JSON 매핑을 멤버변수로 하고 싶다면, 매번 @JsonProperty를 선언 해야 할까요? 귀찮습니다. 애초에 Jackson 매핑 구조를 바꾸면 어떨까 하는 생각이 듭니다.

Jackson의 데이터 매핑 법칙 변경하기

Jackson은 매핑 법칙을 바꿀 수 있는 @JsonAutoDetect API를 제공합니다.

위 예시와 같이 멤버변수로만 Jackson을 구성하고 싶은 경우 @JsonProperty를 일일이 붙이는 것보다 아래와 같이 설정하는 것이 더 편리합니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Person {
   private String myName = "Mommoo";
}

@JsonAutoDetect멤버변수 뿐만 아니라, Getter, Setter의 데이터 매핑 정책도 정할 수 있습니다. 만약 아래의 경우는 멤버변수 뿐만 아니라, 기본정책인 Getter역시 데이터 매핑이 진행됩니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Person {
   private String myName = "Mommoo";
   
   public String getJob() {
       return "Developer";
  }
}

Getter를 제외하고 싶다면, @JsonIgnore API를 쓰셔도 됩니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Person {
   private String myName = "Mommoo";
   
   @JsonIgnore
   public String getJob() {
       return "Developer";
  }
}

하지만, 역시 일일이 붙여야 하는 상황이 온다면 매핑 정책을 바꾸시는게 좋습니다.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NON_PRIVATE)
public class Person {
   private String myName = "Mommoo";
   
   public String getJob() {
       return "Developer";
  }
}

Getter정책으로 private 만 데이터 바인딩에 제외 하였습니다.

이렇듯, 제외 범위를 설정할 수 있습니다. 자세한건 아래를 참고해 주세요.

https://fasterxml.github.io/jackson-annotations/javadoc/2.9/com/fasterxml/jackson/annotation/JsonAutoDetect.Visibility.html

Jackson의 데이터 상태에 따른 포함 관계 설정

만약 Jackson데이터 매핑시 NULL 값 과 같은 특정 데이터 상태인 경우 제외하고 싶다면 어떻게 해야 할까요?

Jackson은 이와 관련하여 @JsonIncludeAPI를 제공합니다.

NULL을 클래스 전반적으로 제외하고 싶다면, 클래스 위에 선언하면 됩니다.

또한 특정 프로퍼티NULL일때 해당 프로퍼티만을 제외하고 싶다면 역시 해당 프로퍼티위에 선언하면 됩니다.

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
   private String myName = "Mommoo";
   
   public String getJob() {
       return "Developer";
  }
}

public class Person {
   private String myName = "Mommoo";
   
   @JsonInclude(JsonInclude.Include.NON_NULL)
   public String getJob() {
       return "Developer";
  }
}

JsonInclude.Include 속성은 NON_NULL뿐만 아니라 몇몇 개가 더 존재합니다.

자세한건 아래를 참고 해주세요.

https://fasterxml.github.io/jackson-annotations/javadoc/2.9/com/fasterxml/jackson/annotation/JsonInclude.Include.html

제가 준비한 Jackson 포스팅은 여기까지 입니다.

간단하게 하려 했는데 쓸때 없이 글이 길어진건 아닌가 싶네요.

긴 글 읽어주셔서 감사합니다.

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts