@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
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์กด์ฑ ์ฃผ์ ์ ๋ค์ํ ๋ฐฉ๋ฒ (์์ฑ์ ์ฃผ์ , ํ๋ ์ฃผ์ , ์์ ์ ์ฃผ์ ) (0) | 2023.03.16 |
---|---|
@Transactional ์ ํตํด ๋์์ฑ ๋ฌธ์ ๋ฐฉ์งํ๊ธฐ (0) | 2023.03.13 |
๋๊ธ