๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[JAVA]/JPA

๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž… - @Embedded์™€ private static inner class๋ฅผ ๋น„๊ตํ•ด๋ณด์ž.

by ํŒกํŽ‘ํ 2023. 8. 14.
728x90
๐Ÿ’ก
 Java์—์„œ ์ฃผ์†Œ ์ •๋ณด์™€ ๊ฐ™์€ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ณดํ†ต @Embedded ์• ๋„ˆํ…Œ์ด์…˜ ๋˜๋Š” private static ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
์ด ๊ธ€์—์„œ๋Š” ๊ฐ ๋ฐฉ์‹์˜ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด๋ณด๊ฒ ๋‹ค.

 

 

@Embedded ์• ๋„ˆํ…Œ์ด์…˜ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

  • @Embedded ์• ๋„ˆํ…Œ์ด์…˜์€ ์ฃผ๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ JPA ๊ธฐ๋ฐ˜์˜ ๊ตฌํ˜„์ฒด์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ฃผ์†Œ, ์ด๋ฆ„ ๋“ฑ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์„ ๋ณ„๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๋ชจ๋“ˆํ™”๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

// Member

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Document(collection = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private int age;

    private String phoneNumber;

    private String hobby;

    @Embedded
    private Address address;
    
    // ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ
    public Member(String name, int age, String phoneNumber, String hobby, Address address) {
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
        this.hobby = hobby;
        this.address = address;
    }
}

 

// Address

@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Address {

    private String city;

    private String street;

    private String zipcode;

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

 

์žฅ์ 

์ฝ”๋“œ ๋ชจ๋“ˆํ™” & ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

  • ๊ณตํ†ต ์†์„ฑ์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋˜๋ฉฐ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌ

  • @Embedded ์• ๋„ˆํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด ํด๋ž˜์Šค ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉ ๊ธฐ๋ฐ˜์œผ๋กœ ์‰ฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹จ์ 

๊ฒฐํ•ฉ๋„ ์ฆ๊ฐ€

  • ๋‹น์—ฐํ•œ ์–˜๊ธฐ์ง€๋งŒ ๊ด€๋ จ๋œ ํด๋ž˜์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์•„์ง„๋‹ค.

์˜์กด์„ฑ ์ฆ๊ฐ€

  • @Embedded ์• ๋„ˆํ…Œ์ด์…˜์€ JPA ๊ธฐ๋ฐ˜์˜ ๊ตฌํ˜„์ฒด์— ์˜์กด์ ์ด๋‹ค.
    • @Embedded ์• ๋„ˆํ…Œ์ด์…˜์€ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๊ตฌํ˜„์ฒด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

@Embedded ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต ์†์„ฑ(๊ทธ๋ฃนํ™” ๊ฐ€๋Šฅํ•œ ํ•„๋“œ)์„ ๋ชจ๋“ˆํ™” ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ

 

 

private static ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

  • private static ํด๋ž˜์Šค๋Š” ์ฃผ๋กœ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
  • ์ด ๊ฒฝ์šฐ์—๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ ์ฝ”๋“œ

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Document(collection = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private int age;

    private String phoneNumber;

    private String hobby;

    private Address address;
    
    // ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ
    public Member(String name, int age, String phoneNumber, String hobby, Address address) {
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
        this.hobby = hobby;
        this.address = address;
    }

    // static inner class
    private static class Address {
        private final String city;
        private final String state;
        private final String country;

        // ์ƒ์„ฑ์ž๋Š” private์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ชปํ•˜๊ฒŒ ๋ง‰์Œ
        private Address(String city, String state, String country) {
            this.city = city;
            this.state = state;
            this.country = country;
        }

        // ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
        public static Address AddAddress(String city, String state, String country) {
            return new Address(city, state, country);
        }
    }
}

 

์žฅ์ 

๋†’์€ ์บก์Аํ™”

  • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ

  • ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ€๋…์„ฑ ์—ญ์‹œ ์˜ฌ๋ผ๊ฐ„๋‹ค.

 

๋‹จ์ 

ํ™•์žฅ์„ฑ ์ œํ•œ

  • private static ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

์žฌ์‚ฌ์šฉ์„ฑ ๊ฐ์†Œ

  • ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ž์นซํ•˜๋‹ค๊ฐ€๋Š” ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

private static ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ผ๋ถ€ ์†์„ฑ์ด ์žˆ์„ ๋•Œ
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ  ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜๋ ค๊ณ  ํ•  ๋•Œ

 

 

๊ฒฐ๋ก 

  • ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ƒํ™ฉ๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.
  • JPA ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋“ฑ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ @Embedded ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๊ณตํ†ต ์†์„ฑ์„ ๋ชจ๋“ˆํ™” ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค.
    • ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋งŒ์•ฝ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์„ ์บก์Аํ™”ํ•˜๋Š” ๋ฐ์— ์ง‘์ค‘ํ•˜๊ฑฐ๋‚˜ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ด๋‚˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋“ฑ์˜ ์ž‘์—…์—์„œ๋Š” private static ํด๋ž˜์Šค๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค. 

 

 

 

์ฐธ๊ณ 

๋คผํŠผ

728x90