JSON์ ๋ฌดํ ์ํ ๊ตฌ์กฐ๋ ์ ๋ฐ์ํ ๊น?
๋๋ง์ ์ท์ฅ ์๋น์ค์ REST API ๊ตฌํํ๋ฉด์ ๊ฐ์ฅ ๊ณ ์ํ ๋ถ๋ถ์ด๋ค.
๊ฐ๋ฐ ์ด๋ฐ์๋ ์๋ฌด ์๊ฐ ์์ด DTO๋ฅผ ํ์ฉํ์ง ์๊ณ Entity๋ฅผ ์ง์ ์ปจํธ๋กค๋ฌ์์ ๋ฐํํ๋๋ฐ ๊ฐ์ฒด๊ฐ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๊ณ ๊ทธ ๊ฐ์ฒด๊ฐ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ ๋ฌดํ ํธ์ถ ํ์์ด ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด ๋ฌดํ ํธ์ถ ํ์์ ๋์ถฉ ํํํ์๋ฉด
a {
b {
c {
}
}
}
์ด๋ฐ ์์ผ๋ก a์์ b๊ฐ ํฌํจ๋์ด b์ ํ๋๊ฐ ์ถ๋ ฅ๋๊ณ , ๋ b์ ํ๋์ c๊ฐ ํฌํจ๋์ด c์ ํ๋๊ฐ ์ถ๋ ฅ๋๊ณ ๋ง์ฝ์ c์ ํ๋์ ๋๋ค์ aํ๋๊ฐ ํฌํจ๋์ด ์๋ค๋ฉด ๋ฌดํ ํธ์ถ ํ์์ ๋ณผ ์ ์๋ค. ๊ฒฐ๊ตญ์ ์๋ฒ๊ฐ ์ฃฝ์ด๋ฒ๋ฆฌ๋ ์ํฉ์ ๋ง์ดํ๊ฒ ๋๋ค.
์์ ๊ฐ์ด ๋ฌดํ ์ํ ๊ตฌ์กฐ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ฅผ ํ์ ํ๊ธฐ ์ํด์๋ ์ฐ์ ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ์ด๋ค์์ผ๋ก ๋ณํ์ํค๋์ง์ ๋ํ ํ์ธ์ด ํ์ํ๋ค. @RestController์ ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด @ResponseBody ์๋ ธํ ์ด์ ์ ํฌํจํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. @ResponseBody ์๋ ธํ ์ด์ ์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ๋ฆฌํด ํ์ ์ ํ์ธํ ํ ์๋ง์ MessageConverter๋ฅผ ์ฐพ์์ ์๋ต ํํ๋ก ๋ณํ์์ผ ์ค๋ค. ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ Spring Boot๋ ๊ธฐ๋ณธ์ ์ผ๋ก Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๊ณ ์์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์๋ MappingJackson2HttpMessageConverter๋ฅผ ์ด์ฉํ์ฌ Json์ผ๋ก Convert ํ๋ค.
๋ฐ๋ผ์! ๋ฌธ์ ์ ์์ธ์ ์ฐพ๊ธฐ ์ํด MappingJackson2HttpMessageConverter์ ๋ณํ ๋์ ๋ฐฉ์์ ์ดํด๋ณด์.
MappingJackson2HttpMessageConverter์ ๋์ ๋ฐฉ์
MappingJackson2HttpMessageConverter๋ JSON์ ํ๋๋ฅผ ์ฐพ์ ๋ Getter(), Setter()๋ฅผ ์ด์ฉํ์ฌ ์ฐพ์๋ธ๋ค. ๊ฒฐ๊ตญ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ์ด๋ค Entity์ Getter(), Setter() ๋ฉ์๋๋ฅผ ํตํด ํ๋๋ฅผ ์ฐพ์๋ด๊ณ , ๋ง์ฝ์ ๊ทธ ํ๋๊ฐ Getter(), Setter()๋ฅผ ํฌํจํ๊ณ ์๋ ๊ฐ์ฒด๋ฉด dfs ์ฒ๋ผ ์์ ๊ณผ์ ์ ๋ ๋ค์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ MappingJackson2HttpMessageConverter์ ๋์ ๋ฐฉ์์ ์ํด์ ๋ฌดํ ํธ์ถ ํ์์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ฌดํ ํธ์ถ ํ์์ ํผํ๊ธฐ ์ํด์๋ DTO ๋ด์ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ๊ฐ์ฒด๋ฅผ ํฌํจ์์ผ์๋ ์๋๋ค. ๋ฌผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ํฌํจ์ํค์ง ๋ง๋ผ๋ ๋ง์ด ์๋๋ผ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ฒด๋ฅผ ํฌํจ์์ผ์๋ ์๋๋ค๋ ์๋ฏธ์ด๋ค.
์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์์ํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ฒด๋ฅผ ํฌํจ์ํค์ง ๋ง์
์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์๋ฒฝํ ๋ฐฉ๋ฒ์ ์๋ค. ์ ์ด์ API๋ฅผ ์ค๊ณํ ๋ ์ด ๋ถ๋ถ์ ์ ๊ฒฝ์จ์ ์ค๊ณํด์ผ ํ๋ค. ์ํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฑด ์ ์ธํ๊ณ Entity๋ฅผ ์ง์ ๋ฐํ์ํค๋ ์ํฉ์ ํผํด์ผ ํ๋ค. (๋ฌผ๋ก JSON์ผ๋ก ๋ณํ์์ ํด๋น ํ๋๋ฅผ ๋ฌด์ํ๋ ๋ฐฉ์์ด ์์ง๋ง Entity์ API๋ ์์กด์ ์ด์ง ์์ ๊ฒ์ด ์ข๋ค)
@Getter
public class ResponseForWardrobe extends Response {
private Long id;
private Integer likeCnt;
private String memberName;
private String email;
private String name;
private String isPublic;
private String imageServerPath;
@Builder
public ResponseForWardrobe(Wardrobe wardrobe) {
this.id = wardrobe.getId();
this.memberName = wardrobe.getMember().getName();
this.email = wardrobe.getMember().getEmail();
this.name = wardrobe.getName();
this.isPublic = wardrobe.getIsPublic();
this.likeCnt = wardrobe.getLikeCnt();
this.imageServerPath = wardrobe.getImage().getImageServerPath();
}
}