์ด๋ ์ถ์ด ๋ด๋ฐค, ๋๋์ด ๋ ๋ฒจ 33์ ๋๋ฌํ์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ์ ์์ ์ก๊ณ ์ด๋ฏธ JSON ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ ์ ์ฒด ๋ถ์ผ๋ฅผ ์์ฉํ ์ค๋น๋ฅผ ํ๊ณ ์์์ง๋ง ์ํ๊น๊ฒ๋ ์๋ฌด๊ฒ๋ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๊ธฐ์ต๋์ง ์์ง๋ง, ์ด์ฉ์ง ์ง๊ด์ ์ผ๋ก ๋ฌธ์ ๊ฐ ํ๋ ธ์ด์. ์ด๋ฐ ์ ์์ ๋๋ Jackson Framework์ ๋ณธ์ง์ ํ๊ตฌํ๊ณ ์ด JSON์ด ๋ฌด์์ธ์ง ์์๋ด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋๋ ๋ด ๋ชจ๋ ์ง์์ ์นํธ ์ํธ ํ์์ผ๋ก (๋ ์์ ๊ณผ ๋
์ ๋ชจ๋๋ฅผ ์ํด) ์ค์ฉ์ ์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์ํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค. Jackson Annotations๋ก์ ์ฌํ. JSON์ผ๋ก ๊ฐ๋ ๊ธธ์ ๊ฐ์ฅ ๋จผ์ ๋ง๋๋ ๊ฒ์ @JsonAutoDetect ์ฃผ์์
๋๋ค. ์ธ๋ป ๋ณด๋ฉด ๊ฐ๋จํ ๋ด์ฉ์ด์ง๋ง, ์ ์๊ฐ ๊ทธ๊ฒ์ ์์๋ด๋ ๋ฐ ๊ฐ์ฅ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค. ์ด๋ก์๋ ์ฐ๋ฆฌ์๊ฒ ํ์ํ 5๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค:
- fieldVisibility () - ์ง์ ๋ ์ก์ธ์ค ํ์ ์๊ฐ ์๋ ํ๋๋ง ์ง๋ ฌํํฉ๋๋ค.
- getterVisibility()/setterVisibility() - getter/setter์ ์ง์ ๋ ์ก์ธ์ค ์์ ์๊ฐ ์๋ ํ๋๋ฅผ ์ง๋ ฌํํฉ๋๋ค.
- isGetterVisibility() - ๋ถ์ธ ๊ฒํฐ์ ๋ํ ๋ณ๋์ ๊ตฌํ
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
isGetterVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
private Map<String, String> properties;
public Queue<String> queue;
protected List<String> list;
private int age;
private int number;
private boolean isHead;
protected HeadClass(int age) {
this.age = age;
}
public HeadClass() {}
Map<String, String> getProperties() {
return properties;
}
protected boolean isHead() {
return isHead;
}
protected void setProperties(Map<String, String> properties) {
this.properties = properties;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
isGetterVisibility๋ฅผ ์ ๊ฑฐํ๋ฉด ์ด๋ป๊ฒ ๋๋์? ๋์ด๋ ๋ค ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ง๋ ฌํ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ๋ค์ฏ ๋ฒ์งธ๋ ์ญ์ง๋ ฌํ ํ๋ก์ธ์ค๋ฅผ ๊ท์ ํฉ๋๋ค.
- creatorVisibility()๋ ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ฐฉ๋ฒ์ ๋๋ค. ์์ฑ์์ ํฉํ ๋ฆฌ ๋ฉ์๋(ํธ์ถ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฉ์๋)์ ํจ๊ป ์๋ํฉ๋๋ค. ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
public int id;
HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
this.name = name;
this.id = id;
}
protected HeadClass(String name) {
this.name = name;
this.id = 123;
}
protected HeadClass(int id) {
this.id = id;
this.name = "Yes!";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
StringReader reader = new StringReader(forDeserialize);
HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
์ญ์ง๋ ฌํ ๋ฉ์ปค๋์ฆ์ ๋ํ ์ค์ํ ์ฐธ๊ณ ์ฌํญ์
๋๋ค! JSON์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด JSON ๊ฐ์ฒด์ ๋์ผํ ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ํด๋์ค์ ์์ฑ์๋ฅผ ๊ฒ์ํฉ๋๋ค. ์์ ์์์ JSON ๊ฐ์ฒด๋ name, id๋ผ๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด๋ค ์์ฑ์๋ฅผ ํธ์ถํ ์ง ์ถ์ธกํด ๋ณด์ธ์. ๊ทธ๋ ์ต๋๋ค. ์ด ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ๊ทธ๋ด๊น์? ์์ฑ์์ ๊ฐ์์ฑ์ ์ ํํ๊ธฐ ๋๋ฌธ์
๋๋ค(protected, public ํ์ ์๊ฐ ์๋ ์์ฑ์๋ง ํ์๋จ). creatorVisibility๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ํฉ๋๋ค. ์ง๋ฌธ์ด ์๊น๋๋ค. ์์ฑ์์์ @JsonProperty๋ ๋ฌด์์
๋๊น? ์ด ๊ธฐ์ฌ์ ๋ค์ ๋ถ๋ถ์์ ์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. PS ์ฌ๋ฌ๋ถ, ์ ๋ ์ด ๊ธฐ์ฌ์ ๋ํด ์ ์ด๋ ์ด๋ ์ ๋์ ๋ต๋ณ์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ์ด ์ฃผ์ ๊ฐ ์์๊ฐ ์๋์ง, ๊ณ์ํ ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฃผ์ ๊ฐ ๋ง๊ณ ๋ชจ๋ ๋งค์ฐ ํฅ๋ฏธ๋กญ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped ๋ฑ๊ณผ ๊ฐ์ ์ฃผ์๋ ๊ณ ๋ คํ๊ณ ์ถ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค :)
GO TO FULL VERSION