IT/development

[springBoot] JPA @Entity์—์„œ @NoArgsConstructor, @AllArgsConstructor, @Builder... ์‚ฌ์šฉ ๊ด€๋ จ ์ •๋ฆฌ

์•Œ ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž 2022. 11. 22.

๋ชฉ์ฐจ

     

    ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ์—์„œ ๋‹จ์ˆœ CRUD๋Š” JPA๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๋งŽ์ด ํ•˜๊ณ  ์žˆ๋‹ค.

    ์—ญ์‹œ ๋ฏธ๋ž˜์˜ ๋‚ด๊ฐ€ ๋ณด๊ธฐ์œ„ํ•ด ๊ธฐ๋กํ•œ๋‹ค.

     

    ๋ถ€๋„๋Ÿฝ์ง€๋งŒ java8, JPA๋ฅผ ์ตœ๊ทผ์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด์„œ @Builder ์–ด๋…ธํ…Œ์ด์…˜๋„ ์ฒ˜์Œ ์จ๋ณด๊ณ  ์ด์ œ ๋ง‰ ์ ์‘์ด ์‚ด์ง ๋˜๊ฐ€๋Š” ์ค‘์ด๋‹ค.(JPA์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ์— setter ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•œ๋‹ค.)


     

    @Entity์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ด๊ณ  @Builder์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ „๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒ์„ฑ์ž์ด๋‹ค.(๊ฐ’ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ)

     

    ๋‘˜ ๋‹ค ์ƒ๋žตํ•  ๊ฒฝ์šฐ IDE์—์„œ ์นœ์ ˆํ•˜๊ฒŒ ์•„๋ž˜์ฒ˜๋Ÿผ ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด์ค€๋‹ค.(์—”ํ‹ฐํ‹ฐ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์—†์„ ๊ฒฝ์šฐ์—” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ‘œ์‹œ) ๋นŒ๋”์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ์ž ์—†์„ ๊ฒฝ์šฐ ๋นŒ๋“œ์‹œ ํ‘œ์‹œํ•ด์ค€๋‹ค.

     

    Entity์—์„œ @NoArgsConstructor ์ƒ๋žต ์‹œ ์•„๋ž˜์ฒ˜๋Ÿผ ์—๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

    lombok ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ฑฐ๋‚˜ ์ง์ ‘ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ํ•ด์•ผํ•œ๋‹ค.

     

    @Builder ์‚ฌ์šฉ ์‹œ @AllArgsConstructor ์ƒ๋žต ์‹œ ๋นŒ๋“œ์‹œ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์—๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

     

    JPA์˜ Entity๋Š” ๋ฐ˜๋“œ์‹œ ๋ถˆ๋ณ€ ๊ฐ์ฒด์—ฌ์•ผ ํ•˜๋ฏ€๋กœ Getter๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    JPA์˜ ํ•ต์‹ฌ์€ ์˜์†์„ฑ์ด๋‹ค.

     

    ๊ทธ๋ž˜์„œ ๊ฐ’ ์„ธํŒ…์„ ์œ„ํ•ด ์„ธํ„ฐ๊ฐ€ ์•„๋‹Œ @Builder๋ฅผ ์ด์šฉํ•˜๊ณ  ์ด ๋นŒ๋”๋ž€ ์นœ๊ตฌ๋Š” ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

    JPA์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.

     

    ๊ทธ๋ฆฌ๊ณ  @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ๋ ค์ค„ ๊ฒฝ์šฐ ๊ฐ’์„ JSON๋„ค์ด๋ฐ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

    ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋Š” Camel case๋ฅผ ์“ฐ๊ณ  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ๋Š” Snake case๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    ์•„๋ž˜์ฒ˜๋Ÿผ java์˜ ์นด๋ฉœ์ผ€์ด์Šค ๋„ค์ด๋ฐ์„ ์Šค๋„ค์ดํฌ ๋„ค์ด๋ฐ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

    // java ํ•„๋“œ ๋„ค์ด๋ฐ
    private String memberId;
    // js ํ•„๋“œ ๋„ค์ด๋ฐ
    let member_id

     

    ํ•„๋“œ์— @JsonProperty("๋ณ€ํ™˜ํ•  ํ•„๋“œ๋ช…")์œผ๋กœ ์„ ์–ธํ•ด๋„ ๋˜๋Š”๋ฐ ๋‚˜์ค‘์— ํ˜น์‹œ๋‚˜ ํ•„๋“œ๊ฐ€ ๋” ๋งŽ์•„์งˆ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฏธ๋ฆฌ ํด๋ž˜์Šค๋ ˆ๋ฒจ์— @JsonNaming...๋ฅผ ์„ ์–ธํ–ˆ๋‹ค.(์‚ฌ์‹ค ํ•„๋“œ ๋ช‡๊ฐœ ์•ˆ๋˜์ง€๋งŒ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋žฌ๋‹ค.)

     

    ์–ด๋…ธํ…Œ์ด์…˜์ด ์ฝ”๋“œ ์ˆ˜๋ฅผ ๋งŽ์ด ์ค„์—ฌ์ฃผ์ง€๋งŒ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์—†๋Š” ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ์€ ์—ญ์‹œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค.

    ๋ชฐ๋ž๋˜ ์ƒˆ๋กœ์šด ๊ฑธ ์•Œ์•„๊ฐ€๋Š” ์ด ๊ณผ์ •์ด ์ฆ๊ฒ๋‹ค.

    ๋ญ”๊ฐ€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์›๋ฆฌ๋ฅผ ์•Œ๊ณ  ์“ฐ๋Š”๊ฒŒ ์ข‹์œผ๋‹ˆ ์ฆ๊ฑฐ์šด ๋งˆ์Œ์œผ๋กœ ํฌ์ŠคํŒ…์— ์˜ฌ๋ฆฐ๋‹ค.

     

    ์•„๋ž˜์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์ค€๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋ฅด๋ฉด ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. 

    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    @Entity
    @Builder
    @Table(name = "test")
    @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)

     

    ๊ฐœ์ธ ๊ณต๋ถ€๋ฅผ ์ •๋ฆฌํ•œ ํฌ์ŠคํŒ…์ด๋ผ ํ‹€๋ฆฐ ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ‹€๋ฆฐ ์ ์€ ๋Œ“๊ธ€๋กœ ๋ถ€ํƒ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

    ๋Œ“๊ธ€