[Java/Jackson] JSON ๋ณ€ํ™˜์‹œ boolean ํ•„๋“œ์˜ ‘is’๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ๋ฒ•

Spring Boot๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์˜๋„์น˜ ์•Š๊ฒŒ JSON ์‘๋‹ต ํ•„๋“œ๋ช…์ด ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํŠนํžˆ boolean ํƒ€์ž… ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งŽ์ด ๊ฒช๋Š” ๋ฌธ์ œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด

@Getter
public class UserDto {
    private boolean isActive; // ํ™œ์„ฑ ์ƒํƒœ
}
Java

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ UserDto๋ฅผ ์ „์†กํ•  ๋•Œ {“isActive”: true} ๊ฐ€ ์‘๋‹ตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ์„ ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•œ๋‹ค.

{
    "active": true
}
JSON

์–ด๋ผ? ‘is’๋Š” ๋Œ€์ฒด ์–ด๋””๋กœ ์‚ฌ๋ผ์กŒ๋‹จ ๋ง์ธ๊ฐ€? ์ด ํ˜„์ƒ์„ ๋ชจ๋ฅด๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ํ”„๋ŸฐํŠธ์—”๋“œ์™€์˜ ์—ฐ๋™ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” boolean ํ•„๋“œ์˜ ‘is’๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐ๋ฒ•์„ ์•Œ์•„๋ณด๊ณ  Primitive Type(boolean)๊ณผ Wrapper Class(Boolean)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

boolean ํ•„๋“œ์˜ ‘is’๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ด์œ 

Jackson ์ด๋‚˜ Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ‘JavaBeans ๊ทœ์•ฝ’์„ ๋”ฐ๋ฅด๋Š”๋ฐ ์ด ๊ทœ์•ฝ์ด booleanํƒ€์ž…์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋…ํŠนํ•˜๋‹ค. Jackson์€ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•  ๋•Œ ํ•„๋“œ ์ž์ฒด๊ฐ€ ์•„๋‹Œ Getter๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•œ๋‹ค. ‘JavaBeans ๊ทœ์•ฝ’์— ๋”ฐ๋ฅด๋ฉด boolean ํƒ€์ž…์˜ Getter๋Š” is๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ Jackson์€ ์ด is๋ฅผ ํ•„๋“œ ์ด๋ฆ„์ด ์•„๋‹Œ ๊ทœ์•ฝ์ƒ์˜ ์ ‘๋‘์‚ฌ๋กœ ํŒ๋‹จํ•˜์—ฌ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์ด๋ฆ„์ธ ‘active’๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
๋งŒ์•ฝ Lombok์„ ์‚ฌ์šฉํ•˜์—ฌ @Getter๋ฅผ ์ง€์ •ํ–ˆ์„ ๋•Œ boolean ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด isXXX()์™€ ๊ฐ™์ด ‘is’๊ฐ€ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™๊ฒŒ ๋œ๋‹ค.
ํ•˜์ง€๋งŒ Primitive Type์ธ boolean๊ณผ Wrapper Class์ธ Boolean ์ค‘์— ์–ด๋–ค ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

ํƒ€์ž…ํ•„๋“œ๋ช…์ƒ์„ฑ๋˜๋Š” GetterJSON ๊ฒฐ๊ณผ
boolean (primitive)isActiveisActive()active
Boolean (wrapper)isActivegetIsActive()isActive

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Wrapper ํด๋ž˜์Šค ํƒ€์ž… (Boolean) ์‚ฌ์šฉ
    • ๊ธฐ๋ณธํ˜•์ธ boolean ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ์— Boolean์„ ์‚ฌ์šฉํ•˜๋ฉด lombok์€ getIsActive()๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Jackson์€ isActive๋ผ๋Š” ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  Boolean์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ null ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
private Boolean isActive;
Java
  • @JsonProperty ์–ด๋…ธํ…Œ์ด์…˜ ํ™œ์šฉ
    • ํƒ€์ž…๊ณผ ์ƒ๊ด€์—†์ด JSON ํ‚ค ๊ฐ’์„ ๊ฐ•์ œ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ๋ƒฅ ์ด๊ฒƒ์ €๊ฒƒ ์ƒ๊ฐํ•  ๊ฒƒ์ด ๊ฐ€์žฅ ๊น”๋”ํ•˜๋‹ค.
@JsonProperty("isActive")
private boolean isActive;
Java
  • ํ•„๋“œ๋ช…์—์„œ ‘is’ ์ œ๊ฑฐํ•˜๊ธฐ
    • ์• ์ดˆ์— ํ•„๋“œ๋ช…์„ ‘active’๋กœ ์ง“๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ is๋ฅผ ๋ถ™์—ฌ์„œ ์ฝ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ž๋ฐ” ํ‘œ์ค€์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๊น”๋”ํ•œ ๋„ค์ด๋ฐ ๋ฐฉ์‹์ด๋‹ค.
private boolean active;
// Getter๋Š” isActive()๊ฐ€ ๋˜๋ฉด JSON์€ {"active": true}
Java
  • Gson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ (์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋น„์ถ”!!!)
    • Gson์€ ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฐฉ์‹์œผ๋กœ DTO์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ‘is’๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ํ•˜์ง€๋งŒ DTO๋ฅผ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์—์„œ jackson -> gson์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์€ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํฐ ํ˜•๊ตญ์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
Jackson(Default)Gson
๊ธฐ๋ณธ์ ‘๊ทผ ๋ฐฉ์‹Getter ๋ฉ”์„œ๋“œ ๊ธฐ์ค€ํ•„๋“œ(๋ณ€์ˆ˜๋ช…) ๊ธฐ์ค€
JavaBeans ๊ทœ์•ฝ์—„๊ฒฉํžˆ ๋”ฐ๋ฆ„ (is ์ œ๊ฑฐ)๋”ฐ๋ฅด์ง€ ์•Š์Œ
isActive ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผactiveisActive

DTO ์—์„œ boolean ํƒ€์ž…์˜ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ‘is’๋ฅผ ๋ถ™์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ž๋ฐ” ํ‘œ์ค€์— ๋ถ€ํ•ฉํ•˜๋Š” ๋„ค์ด๋ฐ ๋ฐฉ์‹์ด๊ณ  ์ด๋Ÿฌํ•œ is๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ด์Šˆ๋„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๋ถ€๋“์ด ํ•˜๊ฒŒ isActive์™€ ๊ฐ™์ด ๋ถ™์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด @JsonProperty ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ™•์‹คํžˆ ์ด๋ฆ„์„ ์ •ํ•ด ์ฃผ๋„๋ก ํ•˜์ž.

boolean ํ•„๋“œ์˜ is๊ฐ€ ์™œ ์‚ฌ๋ผ์ง€๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜๋Š”์ง€ ์ •๋ฆฌํ•ด ๋ณด์•˜๋Š”๋ฐ, ๋‚ด์šฉ์€ ์•„์ฃผ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ž์นซํ•˜๋ฉด ์‚ฝ์งˆ์˜ ๊ธธ๋กœ ๊ฐˆ ์ˆ˜๋„ ์žˆ๋Š” ํฌ์ธํŠธ์ด๋‹ˆ ์•Œ์•„๋‘ฌ์„œ ๋‚˜์ ๊ฑด ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ถ”๊ฐ€)

mongodb์— ์ €์žฅ๋  Document์— boolean ํƒ€์ž…์œผ๋กœ isXXX ํ•„๋“œ๋ฅผ ์ง€์ •ํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•ด ๋ณด์•˜๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ •์ƒ์ ์œผ๋กœ isXXX ํ•„๋“œ๋ช…์œผ๋กœ ์ž…๋ ฅ๋˜์—ˆ๋‹ค. ์ด์œ ๋Š” mongodb์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ Spring Data MongoDB์˜ ์˜์—ญ์ด๋ผ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
Spring Data MongoDB๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Getter๊ฐ€ ์•„๋‹Œ Reflection์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ์ž์ฒด์— ์ ‘๊ทผํ•˜์—ฌ ์ง๋ ฌํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ isXXX์™€ ๊ฐ™์ด ๊ผญ ‘is’๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๋ƒฅ ๊ณ ๋ฏผ์—†์ด is๋ฅผ ๋–ผ๊ณ  ์ด๋ฆ„์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด๋‹ค.