๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

@JsonFilter๋กœ ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ๋‚ด๋ ค์ฃผ๊ธฐ

by ์•„๋ฆฌ๊ฐ€๋˜๐Ÿ™‚ 2023. 4. 12.

@JsonFilter

Jackson์€ Java ์ง„์˜์˜ ๋Œ€ํ‘œ์ ์ธ POJO-JSON ์ƒํ˜ธ ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” @JsonFilter๋ฅผ ์ด์šฉํ•˜์—ฌ POJO ์˜ค๋ธŒ์ ํŠธ์˜ ํ•„๋“œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด์— ๋งž๋Š” ํ•„๋“œ๋งŒ ์„ ํƒ์ ์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ˆ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ ์ถ”๊ฐ€

dependencies {
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.8.1'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.1'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.8.1'
    compile group: 'org.projectlombok', name: 'lombok', version: '1.16.10'
}
 
  • Spring Boot(1.4.0) ๊ธฐ๋ฐ˜์˜ ์›น ํ”„๋กœ์ ํŠธ๋ผ๋ฉด Jackson์ด ์ด๋ฏธ ์ถ”๊ฐ€๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

2. POJO ํด๋ž˜์Šค ์ž‘์„ฑ

package com.jsonobject.example;

import com.fasterxml.jackson.annotation.JsonFilter;
import lombok.Data;

@JsonFilter("userJsonFilter")
@Data
public class User {

    private int id;

    private String email;

    private String password;

    private boolean hasProfileImage;

    private String profileImageUrl;
}
 
  • ๊ฐ„๋‹จํ•œ ํšŒ์› ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชฉ์ ์˜ ์ผ๋ฐ˜์ ์ธ POJO ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • @JsonFilter ํด๋ž˜์Šค ๋ ˆ๋ฒจ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ JSON ๋ณ€ํ™˜์‹œ ์‚ฌ์šฉํ•  ํ•„ํ„ฐ๋ฅผ ๋ช…์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

3. JsonFilter ํด๋ž˜์Šค ์ž‘์„ฑ

package com.jsonobject.example;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

public class UserJsonFilter extends SimpleBeanPropertyFilter {

    @Override
    public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception {

        if (pojo instanceof User) {
            if (canSerializeAsField((User) pojo, writer.getName())) {
                super.serializeAsField(pojo, jgen, provider, writer);
            }
        } else {
            super.serializeAsField(pojo, jgen, provider, writer);
        }
    }

    private boolean canSerializeAsField(User user, String fieldName) {

        if (fieldName.equals("password")) {
            return false;
        }
        if (fieldName.equals("profileImageUrl") && !user.isHasProfileImage()) {
            return false;
        }

        return true;
    }
}
  • SimpleBeanPropertyFilter.serializeAsField() ๋ฉ”์„œ๋“œ๋Š” JSON ๋ณ€ํ™˜ ์‹œ์ ์— ๋Œ€์ƒ POJO์˜ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•ด ์‹คํ–‰๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•„๋“œ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • POJO ๋‹จ์œ„๋กœ ๋Œ€์‘ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ JSON ๋ณ€ํ™˜ ์ •์ฑ…์„ ์„ธ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ ํšŒ์› ์ •๋ณด๋ฅผ ๋‹ด๋Š” User ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•„๋ž˜ ์ •์ฑ…์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
1. password ํ•„๋“œ๋Š” JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
2. hasProfileImage ํ•„๋“œ์˜ ๊ฐ’์ด true์ผ ๊ฒฝ์šฐ์—๋งŒ profileImageUrl์„ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
 

4. ObjectMapper ํ•„ํ„ฐ ๋“ฑ๋ก ๋ฐ ๋ณ€ํ™˜

User user = new User();
user.setId(1);
user.setEmail("someone@gmail.com");
user.setPassword("secret");
user.setHasProfileImage(false);
user.setProfileImageUrl(null);

ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(new SimpleFilterProvider().addFilter("userJsonFilter", new UserJsonFilter()));
mapper.writeValueAsString(user));

-> ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์œผ๋ฉฐ, ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "id" : 1,
  "email" : "someone@gmail.com",
  "hasProfileImage" : false
}

 

๋Œ“๊ธ€