JavaRush /Java Blog /Random-KO /Jackson ํ”„๋ ˆ์ž„์›Œํฌ ์†Œ๊ฐœ
Mikhail Fufaev
๋ ˆ๋ฒจ 35
ะœะพัะบะฒะฐ

Jackson ํ”„๋ ˆ์ž„์›Œํฌ ์†Œ๊ฐœ

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์–ด๋Š ์ถ”์šด ๋ด„๋ฐค, ๋“œ๋””์–ด ๋ ˆ๋ฒจ 33์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์†์„ ์žก๊ณ  ์ด๋ฏธ JSON ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ์ „์ฒด ๋ถ„์•ผ๋ฅผ ์ˆ˜์šฉํ•  ์ค€๋น„๋ฅผ ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์•„๋ฌด๊ฒƒ๋„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•์˜ ๋‚ด์šฉ์€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์ง€๋งŒ, ์–ด์ฉ์ง€ ์ง๊ด€์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ํ’€๋ ธ์–ด์š”. ์ด๋Ÿฐ ์ ์—์„œ ๋‚˜๋Š” Jackson Framework์˜ ๋ณธ์งˆ์„ ํƒ๊ตฌํ•˜๊ณ  ์ด JSON์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์žญ์Šจ ํ”„๋ ˆ์ž„์›Œํฌ
๋‚˜๋Š” ๋‚ด ๋ชจ๋“  ์ง€์‹์„ ์น˜ํŠธ ์‹œํŠธ ํ˜•์‹์œผ๋กœ (๋‚˜ ์ž์‹ ๊ณผ ๋…์ž ๋ชจ๋‘๋ฅผ ์œ„ํ•ด) ์‹ค์šฉ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ์‹œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Jackson Annotations๋กœ์˜ ์—ฌํ–‰. JSON์œผ๋กœ ๊ฐ€๋Š” ๊ธธ์— ๊ฐ€์žฅ ๋จผ์ € ๋งŒ๋‚˜๋Š” ๊ฒƒ์€ @JsonAutoDetect ์ฃผ์„์ž…๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๋ฉด ๊ฐ„๋‹จํ•œ ๋‚ด์šฉ์ด์ง€๋งŒ, ์ €์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ๊ฐ€์žฅ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์ดˆ๋ก์—๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:
  • fieldVisibility () - ์ง€์ •๋œ ์•ก์„ธ์Šค ํ•œ์ •์ž๊ฐ€ ์žˆ๋Š” ํ•„๋“œ๋งŒ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • getterVisibility()/setterVisibility() - getter/setter์— ์ง€์ •๋œ ์•ก์„ธ์Šค ์ˆ˜์ •์ž๊ฐ€ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์ง๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • isGetterVisibility() - ๋ถ€์šธ ๊ฒŒํ„ฐ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๊ตฌํ˜„
๋ฐฉ๋ฒ•์ด ๋ถ„๋ฆฌ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ํ•„๋“œ๊ฐ€ ์ฃผ์„์— ์ง€์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ๊ณผ ์ผ์น˜ํ•˜๋ฉด JSON์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ์ถœ๋ ฅํ• ์ง€ ๋‹ตํ•ด ๋ณด์„ธ์š”.
@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 ๋“ฑ๊ณผ ๊ฐ™์€ ์ฃผ์„๋„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION