๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป๐Ÿ“

[๊ณต๊ณต๋ฐ์ดํ„ฐ] @JsonProperty ํ™œ์šฉ๋ฒ•

_silver 2025. 7. 30. 18:59

์ตœ๊ทผ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ์—์„œ ์ œ๊ณตํ•˜๋Š”  ใ€Ž์‹ํ’ˆ์˜์–‘์„ฑ๋ถ„DB์ •๋ณด APIใ€๋ฅผ ์—ฐ๋™ํ•ด ํ™œ์šฉํ•ด ๋ณด๊ณ  ์žˆ๋‹ค.

 

๐Ÿ“ฉ Postman ์š”์ฒญ ํ…Œ์ŠคํŠธ

๋จผ์ € ํฌ์ŠคํŠธ๋งจ์œผ๋กœ API ์š”์ฒญ์„ ๋ณด๋‚ด๋ดค๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฐ›์€ ์‘๋‹ต์ด ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

 

์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ณ  ์ฒ˜์Œ ๋“  ์ƒ๊ฐ์€ ์ด๋žฌ๋‹ค.

"amtNum1": "75.00", "amtNum2": "83.70"......? ์—ฅ?

 

ํ•„๋“œ๋ช…์ด ์ •ํ™•ํžˆ ์–ด๋–ค ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€ ๋ฐ”๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์•„๋งˆ XML ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋„ค์ด๋ฐ์„ ๊ทธ๋Œ€๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™๋‹ค.

 

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, ์ด๋ ‡๊ฒŒ ์˜๋ฏธ๊ฐ€ ๋ชจํ˜ธํ•œ ํ•„๋“œ๋ช…์„ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋‚˜ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ฐฐ์› ๋‹ค.

๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€, Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Jackson์˜ @JsonProperty๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด key๋ฅผ ๋งคํ•‘ ์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋”๋ณด๊ธฐ

@JsonProperty๋ž€?

@JsonProperty๋Š” Java ๊ฐ์ฒด ํ•„๋“œ์™€ JSON ํ‚ค ๊ฐ’์„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ฆ‰, DTO ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ•„๋“œ๋ช…๊ณผ JSON ์‘๋‹ต์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ํ•„๋“œ๋ช…์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

@JsonProperty("์›ํ•˜๋Š”_ํ•„๋“œ๋ช…")
private String ์‹ค์ œํ•„๋“œ๋ช…;

 

์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด, Java DTO ๋‚ด๋ถ€์—์„œ๋Š” ์‹ค์ œํ•„๋“œ๋ช…์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ,

JSON ์‘๋‹ต์—์„œ๋Š” "์›ํ•˜๋Š”_ํ•„๋“œ๋ช…"์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

ํ˜„์žฌ DTO ํด๋ž˜์Šค์— @JsonProperty์„ ์ ์šฉํ•ด ๋ณด์•˜๋‹ค.

๋”๋ณด๊ธฐ
@Getter
@NoArgsConstructor
public class FoodItemResponseDto {

    private String foodCd;
    private String foodNmKr;
    private String dbGrpNm;
    private String dbClassNm;
    private String servingSize;
    private String amtNum1;
    private String amtNum2;

    public FoodItemResponseDto(String foodCd, String foodNmKr,
                               String dbGrpNm, String dbClassNm,
                               String servingSize, String amtNum1,
                               String amtNum2) {
        this.foodCd = foodCd;
        this.foodNmKr = foodNmKr;
        this.dbGrpNm = dbGrpNm;
        this.dbClassNm = dbClassNm;
        this.servingSize = servingSize;
        this.amtNum1 = amtNum1;
        this.amtNum2 = amtNum2;
    }
}

๋”๋ณด๊ธฐ
@Getter
@NoArgsConstructor
public class FoodItemResponseDto {

    @JsonProperty("์‹ํ’ˆ์ฝ”๋“œ")
    private String foodCd;

    @JsonProperty("์‹ํ’ˆ๋ช…")
    private String foodNmKr;

    @JsonProperty("์‹ํ’ˆ ๊ทธ๋ฃน๋ช…")
    private String dbGrpNm;

    @JsonProperty("์‹ํ’ˆ ๋ถ„๋ฅ˜๋ช…")
    private String dbClassNm;

    @JsonProperty("1ํšŒ ์ œ๊ณต๋Ÿ‰")
    private String servingSize;

    @JsonProperty("์—๋„ˆ์ง€(Kcal)")
    private String amtNum1;

    @JsonProperty("ํƒ„์ˆ˜ํ™”๋ฌผ(g)")
    private String amtNum2;

์ ์šฉ ํ›„ ๋‹ค์‹œ API ์š”์ฒญ์„ ๋ณด๋ƒˆ๋”๋‹ˆ, ๊ฒฐ๊ณผ๋Š”!!

๐Ÿ“ฉ ์‘๋‹ต ๊ฒฐ๊ณผ ํ™•์ธ

 

์ด์ œ API ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ •ํ™•ํžˆ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๋งˆ๋ฌด๋ฆฌ

@JsonProperty ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ˜‘์—…๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ ํฐ ์žฅ์ ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

ํŠนํžˆ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ์ด๋‚˜ ์™ธ๋ถ€ API๋ฅผ ์—ฐ๋™ํ•  ๋•Œ๋Š” ์ด๋Ÿฐ ๋„ค์ด๋ฐ ์ด์Šˆ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋”์šฑ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์•ž์œผ๋กœ๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์–ป์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์œ ์šฉํ•œ ๊ฒฝํ—˜๋“ค์„ ๊พธ์ค€ํžˆ ๊ธฐ๋กํ•ด๋ด์•ผ๊ฒ ๋‹ค!