๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒฟ Spring

[Spring boot/RESTful] Response Filtering

by nitronium102 2022. 2. 18.

Response ๋ฐ์ดํ„ฐ ์ œ์–ด๋ฅผ ์œ„ํ•œ Filtering

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ •๋ณด์˜ ๊ฐ’์„ ์ œ์–ด

๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ๊นŒ์ง€ ๊ฐ™์ด ๋ฐ˜ํ™˜๋˜๊ณ  ์žˆ๋‹ค

๋ณดํ†ต 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์˜ค๋Š˜์€ ์ด ์ค‘ 3๋ฒˆ์งธ์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

  1. ๊ฐ’์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ์น˜ํ™˜ํ•˜์—ฌ ์ „๋‹ฌ
  2. null๋กœ ๋ฐ˜ํ™˜
  3. ์•„์˜ˆ ์ œ์™ธํ•˜๊ณ  ๋ฐ˜ํ™˜

 

@JsonIgnore

Response ๋ฐ˜ํ™˜ ์‹œ Json๊ฐ’์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” annotation. ๊ฐœ๋ณ„์ ์œผ๋กœ ํ•„๋“œ ๊ฐ’์„ ์ œ์–ดํ•œ๋‹ค.

@JsonIgnore // ๋ฐ˜ํ™˜ ์‹œ Json๊ฐ’์— ํฌํ•จ๋˜์ง€ ์•Š์Œ ->๋ฐ˜ํ™˜๊ฐ’ ์ œ์–ด
privateString password;

@JsonIgnore
privateString ssn;

 

@JsonIgnoreProperties

ํ•ด๋‹น ํด๋ž˜์Šค ๋ธ”๋ก ๋‹จ์œ„๋กœ ํ•„ํ„ฐ๋ง

@JsonIgnoreProperties(value={"password", "ssn"})
public class User { 
	
    private Integer id; 
   
    @Size(min=2, message = "Name์€ 2๊ธ€์ž ์ด์ƒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.") 
	
    private String name;
    
    @Past private Date joinDate; 
    
    private String password; 
    private String ssn; 
}

 

@JsonFilter

controller๋‚˜ service ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” annotation. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ชจ๋“  ํ•„๋“œ์— ํ•„ํ„ฐ๋ง์„ ๊ฑธ๊ณ , ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ ํ•„ํ„ฐ๋ง์„ ์ œ์™ธํ•  ํŠน์ • ํ•„๋“œ๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.

// domain
@JsonFilter("UserInfo") // ๋ถ€์—ฌ๋œ ํ•„ํ„ฐ๊ฐ’์€ controller๋‚˜ service ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋œ๋‹ค
public class User { ... }
  • setFilters๋‚˜ setSerialView๋ฅผ ์‚ฌ์šฉ ์‹œ์—๋Š” ๊ผญ MappingJacksonValue ํƒ€์ž…์œผ๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • SimpleBeanPropertyFilter : ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์€ ํ•„ํ„ฐ๊ฐ’ ์„ ์–ธ
  • FilterProvider : domain์—์„œ ์ง€์ •ํ•œ ํ•„ํ„ฐ ์ง€์ •
  • MappingJacksonValue์— FilterProvider๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฆฌํ„ด

 

@GetMapping("/users/{id}")
	// setFilters๋‚˜ setSerialView๋ฅผ ์‚ฌ์šฉ ์‹œ ๊ผญ MappingJacksonValue ํƒ€์ž…์œผ๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜
	public MappingJacksonValue retrieveUser(@PathVariable int id) {
		User user = service.findOne(id);
		if (user == null){
			throw new UserNotFoundException(String.format("ID[%s] is not found", id));
		}

		// bean์˜ property๋ฅผ ์ œ์–ด
		SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
			.filterOutAllExcept("id", "name", "joinDate", "ssn");

		// User์— @JsonFilter("UserInfo") ์ง€์ •
		FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter);

		MappingJacksonValue mapping = new MappingJacksonValue(user); // ์œ ์ € ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
		mapping.setFilters(filters); // ํ•„ํ„ฐ ์ ์šฉ

		return mapping;
	}

filterOutAllExcept์— ์•„๋ฌด ๊ฐ’๋„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

์ •๋ฆฌ

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ •๋ณด์˜ ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•

(1) ๊ฐ’์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ์น˜ํ™˜ํ•˜์—ฌ ์ „๋‹ฌ

(2) null์„ ๋„ฃ์–ด ์ „๋‹ฌ

(3) ํŠน์ • ํ•„๋“œ ํ•„ํ„ฐ๋ง -> @JsonIgnore, @JsonIgnoreProperties๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ œ์–ดํ•œ๋‹ค

  1. @JsonIgnore : ๋‹จ์œ„ ํ•„๋“œ ๊ฐ’์„ ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉ. ๋ฐ˜ํ™˜ ์‹œ json ๊ฐ’์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค
  2. @JsonIgnoreProperties(value={"ํ•„๋“œ๊ฐ’"}) : ํด๋ž˜์Šค๋ฅผ ๋ธ”๋ก ๋‹จ์œ„๋กœ ํ•„ํ„ฐ๋ง -> ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• :@JsonFilter ์‚ฌ์šฉ
  3. domain์— @JsonFilter("ํ•„ํ„ฐ๋ช…") ์‚ฌ์šฉ : ๋ถ€์—ฌ๋œ ํ•„ํ„ฐ๊ฐ’์€ controller๋‚˜ service ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ
  4. controller์—์„œ return๊ฐ’์„ MappingJacksonValue๋กœ ์„ ์–ธ
  • SimpleBeanPropertyFilter๋ฅผ ์ด์šฉํ•˜์—ฌ ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์€ ํ•„ํ„ฐ๊ฐ’ ์„ ์–ธ
  • FilterProvider์— domain์—์„œ ์ง€์ •ํ•œ ํ•„ํ„ฐ ์ง€์ •
  • MappingJacksonValue์— FilterProvider๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฆฌํ„ด
  •  

๋Œ“๊ธ€