๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/๊ฐœ๋…

[Spring][JPA] @Embeddable์™€ @Embedded๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด์ž!

by hyeong._.ing 2026. 6. 6.

 

์–ด๋–ค ํ•„๋“œ๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด๋กœ ๋‘๋Š” ๊ฒƒ์ด ์•„๋‹Œ
์˜๋ฏธ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
@Embeddable๊ณผ @Embedded๋ฅผ ๋ถ™์ธ๋‹ค.
๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

 

 

 

 

1. @Embeddable๊ณผ @Embedded

  • @Embeddable์€ ๊ฐ’ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค.
  • @Embedded๋Š” ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค.
  • ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ๋ถˆ๋ฆฌ๋ฉฐ ์ƒˆ๋กœ์šด ๊ฐ’ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” JPA์˜ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด์„œ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

  • @Embedded X
import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // ์ž„๋ฒ ๋””๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ ‡๊ฒŒ 3๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค.
    private String city; 
    private String street; 
    private String zipcode;
    
}
๋ฐฐ์†ก์ง€๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๋ณดํ†ต ์ฃผ์†Œ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์‹œ + ๋„๋กœ๋ช… ์ฃผ์†Œ + ์šฐํŽธ๋ฒˆํ˜ธ๊ฐ€ ํ•ฉ์ณ์ ธ ์žˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์ด ๊ฐ’๋“ค์„ ์ „๋ถ€ User ์—”ํ‹ฐํ‹ฐ ์•ˆ์— ์ง์ ‘ ๋„ฃ์€ ๊ฒƒ์ด๋‹ค.

 

 

  • @Embedded O
import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด๋ผ๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ํ•˜๋‚˜์˜ ํ•„๋“œ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
    @Embedded
    private Address address; 
    
}
๊ทธ๋Ÿฐ๋ฐ ๊ฒฐ๊ตญ city, street, zipcode๋Š” ๊ฐ๊ฐ ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹Œ, ๋ชจ๋‘ ํ•ฉ์ณ์ ธ์„œ ํ•˜๋‚˜์˜ ์ฃผ์†Œ๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฐ’๋“ค์ด๋‹ค. ์ฆ‰, User ์ž…์žฅ์—์„œ๋Š” ์ฃผ์†Œ์™€ ๊ด€๋ จ๋˜ ์„ธ๋ถ€ ํ•„๋“œ๋ฅผ ํ•˜๋‚˜ํ•œ ๋“ค๊ณ  ์žˆ๊ธฐ๋ณด๋‹ค, Address๋ผ๋Š” ํƒ€์ž…์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ํŽธ์ด ๋” ๊น”๋”ํ•˜๋‹ค.

๊ทธ๋ž˜์„œ city, street, zipcode๋ฅผ Address ํด๋ž˜์Šค ์•ˆ์— ๋ชจ์•„๋‘๊ณ , User ์—”ํ‹ฐํ‹ฐ์—์„œ๋Š” ๊ทธ Address๋ฅผ ํ•˜๋‚˜์˜ ํ•„๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.
@Embedded 
private Address address;


์ด๋ ‡๊ฒŒ ํ•˜๋ฉด User ์—”ํ‹ฐํ‹ฐ๋Š” ์ฃผ์†Œ์˜ ์„ธ๋ถ€ ๊ตฌ์กฐ๊นŒ์ง€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ณ  ์ฃผ์†Œ์™€ ๊ด€๋ จ๋œ ๊ฐ’๋“ค์€ Address๋ผ๋Š” ๋ณ„๋„์˜ ํƒ€์ž… ์•ˆ์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ๋ฌถ์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

// ์ด์ œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด ์–ด๋–ค ์‹์ธ์ง€ ์ •์˜ํ•ด์ค˜์•ผํ•  ์ฐจ๋ก€์ด๋‹ค.
@Embeddable
public class Address {

    private String city;
    private String street;
    private String zipcode;

    protected Address() {}

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }

    public String getCity() { return city; }
    public String getStreet() { return street; }
    public String getZipcode() { return zipcode; }
}
์ด์ œ ์ฃผ์†Œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค. ์•„๊นŒ๋„ ๋งํ–ˆ๋“ฏ์ด ์ฃผ์†Œ๋Š” ์‹œ, ๋„๋กœ๋ช…, ์šฐํŽธ๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค. ์ด๊ฑธ User ์—”ํ‹ฐํ‹ฐ์— ๋„ฃ๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์œผ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ์–ด์•ผํ•œ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์‘์ง‘๋ ฅ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ์ฒด์—์„œ๋Š” User์™€ Address๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๊ณ  DB ํ…Œ์ด๋ธ”์—๋Š” ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ํ‰ํ‰ํ•˜๊ฒŒ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ๋“ค์–ด๊ฐ€๊ธธ ์›ํ•˜๋Š” ๊ฒฝ์šฐ @Embeddable์„ ์‚ฌ์šฉํ•œ๋‹ค.

- ์•„๋งˆ๋„ ํ…Œ์ด๋ธ”์— ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋ ๊ฑฐ์ž„ -
id (PK) name city street zipcode
1 ํ™๊ธธ๋™ ์„œ์šธ์‹œ ํ…Œํ—ค๋ž€๋กœ 12345

๊ผญ ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์œผ๋กœ ๋‚˜๋ˆ ์•ผํ•  ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒ€์ฆ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ์ฒด๋กœ ๋”ฐ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์šฐํŽธ ๋ฒˆํ˜ธ๊ฐ€ 5์ž๋ฆฌ์ธ์ง€ ํฌ๋งท ๊ฒ€์ฆ์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋„ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. 

 

 

 

 


 

 

 

 

2. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

  • ๋ณ„๋„์˜ Entity๋กœ ๋งŒ๋“ค๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ
    : Entity๊ฐ€ ๋˜๋ ค๋ฉด ์ž์‹ ๋งŒ์˜ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž(ID, PK)๊ฐ€ ์žˆ์–ด์•ผํ•˜๊ณ  ๊ทธ๊ฒƒ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋…๋ฆฝ์ ์ด์–ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฃผ์†Œ, ๊ธฐ๊ฐ„, ๊ธˆ์•ก ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋“ค์€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. ์™œ๋ƒ๋ฉด ๊ฒฐ๊ตญ ํšŒ์›์ด ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ๋Œ€์ƒ์ด ์ž์‹ ๋งŒ์˜ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ• ์—†๊ณ  ์†Œ์œ ํ•œ Enity์— ์™„์ „ํžˆ ์˜์กด์ ์ผ ๋•Œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ์˜๋ฏธ์žˆ๋Š” ๊ฐ’์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
    : ์•„๊นŒ๋„ ๋งํ–ˆ๋“ฏ์ด, ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐํŽธ ๋ฒˆํ˜ธ๊ฐ€ 5์ž๋ฆฌ๊ฐ€ ๋งž๋Š”์ง€, ์ƒ๋…„์›”์ผ์ด ์ตœ๊ทผ์ด๊ฑฐ๋‚˜ ๋ฏธ๋ž˜๋Š” ์•„๋‹Œ์ง€ ๋“ฑ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด์ด์–ด๋„ ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด ํ•„์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ์šฐํŽธ ๋ฒˆํ˜ธ๋ฅผ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด๋กœ ๋’€๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์šฐํŽธ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉ๊ณณ๋งˆ๋‹ค ์šฐํŽธ ๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐํŽธ ๋ฒˆํ˜ธ์˜ ๊ทœ์น™์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜์—ˆ๋‹ค๋ฉด? ๊ทธ๋ ‡๋‹ค๋ฉด ์ž‘์„ฑํ•ด๋‘” ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‹ค๋‹ˆ๋ฉฐ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์„œ๋น„์Šค์— ๋‘๋ฉด ๊ฒ€์ฆ ๋กœ์ง์ด ํฉ์–ด์ง€๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ์ฃผ์˜) ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ–ฅํ•œ๋‹ค.
    : @Embeddable์€ ๋‹จ์ง€ ์ด ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์˜ ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ๋งคํ•‘ ์„ค์ •๋งŒ ํ•ด์ค„ ๋ฟ, ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค์ง€๋Š” ์•Š๋Š”๋‹ค. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒฝ์šฐ ๋ถˆ๋ณ€์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ๋งŒ์•ฝ Address ๊ฐ์ฒด์— Setter๊ฐ€ ์—ด๋ ค์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ์ƒํƒœ์—์„œ ํšŒ์›1๊ณผ ํšŒ์›2๊ฐ€ ์šฐ์—ฐํžˆ ๊ฐ™์€ ์ฃผ์†Œ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋ฉด ํšŒ์›1์ด ์ฃผ์†Œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๊ฒฝ์šฐ, ํšŒ์›2์˜ ์ฃผ์†Œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ์ž‘์„ฑํ•  ๋•Œ, Setter๋ฅผ ์ ˆ๋Œ€๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„์•ผํ•˜๊ณ  ํ•„๋“œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์•„์˜ˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ†ต์งธ๋กœ ๊ฐˆ์•„๋ผ์›Œ์•ผํ•œ๋‹ค. ๋˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ตœ์ดˆ ๊ฐ’์„ ์„ธํŒ…ํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.