Home > Backend Development > ๐Ÿ“š[Backend Development] ๋‹จ๋ฐฉํ–ฅ๊ณผ @OneToOne์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

๐Ÿ“š[Backend Development] ๋‹จ๋ฐฉํ–ฅ๊ณผ @OneToOne์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?
Backend Ddevelopment

โ€œ๐Ÿ“š[Backend Development] ๋‹จ๋ฐฉํ–ฅ๊ณผ @OneToOne์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?โ€

๐ŸŽ Intro.

  • ๋‹จ๋ฐฉํ–ฅ @OneToOne ๊ด€๊ณ„๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ 1:1 ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ๋•Œ, ํ•œ์ชฝ ์—”ํ‹ฐํ‹ฐ์—์„œ๋งŒ ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, ํ•œ ์—”ํ‹ฐํ‹ฐ์—์„œ๋งŒ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ๋ฐ˜๋Œ€์ชฝ์—์„œ๋Š” ์ด๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

โœ…1๏ธโƒฃ ์˜ˆ์ œ ์ฝ”๋“œ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, User ์—”ํ‹ฐํ‹ฐ์™€ UserProfile ์—”ํ‹ฐํ‹ฐ๊ฐ€ 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

๐Ÿ“ User ์—”ํ‹ฐํ‹ฐ์—์„œ UserProfile ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    
    @OneToOne
    @JoinColumn(name = "profile_id") // User ํ…Œ์ด๋ธ”์˜ profile_id ์ปฌ๋Ÿผ์ด UserProfile์˜ id๋ฅผ ์ฐธ์กฐ
    private UserProfile profile;
    
    // Getter, Setter
}

๐Ÿ“ UserProfile ์—”ํ‹ฐํ‹ฐ:

@Entity
public class UserProfile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String bio;
    private String website;
    
    // Getter, Setter
}

โœ… ์„ค๋ช…:

    1. @OneToOne์„ ์‚ฌ์šฉํ•˜์—ฌ User ์—”ํ‹ฐํ‹ฐ๊ฐ€ UserProfile ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
    1. @JoinColumn(name = โ€œprofile_idโ€)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ User ํ…Œ์ด๋ธ”์— profile_id ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
      • User ํ…Œ์ด๋ธ”์— profile_id๋ผ๋Š” ์™ธ๋ž˜ ํ‚ค(FK) ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด ์ปฌ๋Ÿผ์ด UserProfile ํ…Œ์ด๋ธ”์˜ id(PK)๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      • ์ฆ‰, User ํ…Œ์ด๋ธ”์˜ profile_id๊ฐ€ UserProfile ํ…Œ์ด๋ธ”์˜ id๋ฅผ ์ฐธ์กฐํ•˜๋Š” FK์ด๋‹ค.
    1. ํ•˜์ง€๋งŒ UserProfile ์—”ํ‹ฐํ‹ฐ์—๋Š” User์™€์˜ ๊ด€๊ณ„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. โžž ์ด๊ฒƒ์ด ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค.

โœ… ์‚ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์˜ˆ์‹œ:

  • ์ด ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ JPA๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š user ํ…Œ์ด๋ธ”

id username profile_id(FK)
1 Alice 101
2 Bob 102

๐Ÿ“Š user_profile ํ…Œ์ด๋ธ”

id bio website
101 โ€œGamerโ€ โ€œalice.comโ€
102 โ€œDeveloperโ€ โ€œbob.devโ€
  • ๐Ÿ“Œ ์ฆ‰, user.profile_id๋Š” user_profile.id๋ฅผ ์ฐธ์กฐ(FK)ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ UserProfile ์—”ํ‹ฐํ‹ฐ์—๋Š” profile_id๊ฐ€ ๋”ฐ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋Œ€์‹  ๊ธฐ๋ณธ ํ‚ค(id)๊ฐ€ User ์—”ํ‹ฐํ‹ฐ์˜ ์™ธ๋ž˜ ํ‚ค(profile_id)๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โœ…2๏ธโƒฃ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„์˜ ํŠน์ง•.

โœ… ์žฅ์ .

  • ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ํ•œ์ชฝ์—์„œ๋งŒ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ์—ฐ๊ด€๊ด€๊ณ„ ๋กœ๋”ฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โŒ ๋‹จ์ .

  • ๋ฐ˜๋Œ€์ชฝ(UserProfile)์—์„œ User๋ฅผ ์กฐํšŒํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.
  • UserProfile์ด ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” User๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ„๋„์˜ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

โœ…3๏ธโƒฃ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„ ์กฐํšŒ.

  • ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
User user = entityManager.find(User.class, 1L);
UserProfile profile = user.getProfile(); // User -> UserProfile ์กฐํšŒ ๊ฐ€๋Šฅ.