728x90

๐Ÿง‘๐Ÿป‍๐Ÿ’ป์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„(๋ฌดํ•œ ๋ฃจํ”„)

JPA๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋ธ๋“ค์ด ์ข…์ข… ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌดํ•œ์œผ๋กœ ์ฐธ์กฐ๊ฐ€ ๋˜์–ด StackOverFlow๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  JPA๊ฐ€ ๊ฐ€์ง„ ์žฅ์ ์„ ํฌ๊ธฐํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด  ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


์˜ˆ์‹œ ์—”ํ‹ฐํ‹ฐ

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int age;

    @ManyToOne
    private Team team;
}
@Entity
public class Team {

    @Id@GeneratedValue
    @Column(name = "team_id")
    private Long id;

    private String name;

    @OneToMany
    private List<User> members = new ArrayList<>();
}

์˜ˆ์‹œ๋กœ ์œ„ ๋‘๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค.

User์™€ Team์€ ManyToOne์˜ ๊ด€๊ณ„์ด๊ณ  Team๊ณผ User๋Š” OneToMany์ด๋‹ค.

OneToMany์˜ ๊ด€๊ณ„์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฑด์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๊ธฐ ์œ„ํ•ด Collection์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

OneToMany๋Š” @OneToMany ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ณ  ManyToOne์€ @ManyToOne์„ ๋ถ™์—ฌ์ฃผ๋ฉด๋œ๋‹ค.

์ด์ œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋˜์—ˆ๋‹ค๋ฉด ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์„ค์ •์„ ์•ˆ ํ•ด์ค€๋‹ค๋ฉด ์œ„ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด User๋ฅผ ์กฐํšŒํ•˜๋ฉด Team์ด ์กฐํšŒ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Team์—์„œ User๋ฅผ ์กฐํšŒํ•œ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฌดํ•œ๋ฃจํ”„์— ๊ฐ‡ํžŒ๋‹ค.

๋ฌดํ•œ๋ฃจํ”„์— ๊ฐ‡ํžˆ๋ฉด์„œ ์ œ์ผ ์ฒ˜์Œ ๋งํ–ˆ๋˜ StackOverFlow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์ •ํ•ด์คŒ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ ์„ค์ •

์ผ๋ฐ˜์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋ฅผ ๋งบ์œผ๋ฉด ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์ฃผ๋กœ ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ €์žฅ๋˜๋Š” ์ธก์„ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

์™ธ๋ž˜ํ‚ค๊ฐ€ ์ €์žฅ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ์—์„œ๋Š” @JoinColumn์œผ๋กœ ์ €์žฅํ•  ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ํ‚ค๋ฅผ name์†์„ฑ์œผ๋กœ ์™ธ๋ž˜ ํ‚ค๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค

@Entity
public class User {
	.
	.
    .
    
    @ManyToOne
    @JoinColumn(name = "team_id")
    private Team team;
}

์ด๋Ÿฐ ์‹์œผ๋กœ ์™ธ๋ž˜ํ‚ค ์†์„ฑ์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์ฃผ์ธ์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์—๋Š” mappedBy๋ฅผ ํ†ตํ•ด ์ฃผ์ธ์ด ์„ค์ •ํ•œ ํ•„๋“œ๋ช…์„ ํ†ตํ•ด ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์„ค์ •ํ•œ๋‹ค.

@Entity
public class Team {
	.
	.
    .
    @OneToMany(mappedBy = "team")
    private List<User> Users = new ArrayList<>();
}

์ฃผ์ธ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด User ์—”ํ‹ฐํ‹ฐ์— ์™ธ๋ž˜ํ‚ค๋กœ ์„ค์ •๋œ ํ•„๋“œ๋ช…์„  ๊ฐ€์ ธ์™€์„œ ์ฃผ์ธ์„ ์ง€์ •ํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์„  User ์—”ํ‹ฐํ‹ฐ์˜ team์ด ์™ธ๋ž˜ํ‚ค๋กœ ์„ค์ •๋œ ํ•„๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— mappedBy = "team"์œผ๋กœ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

@ManyToOne์€ ํ•ญ์ƒ ์™ธ๋ž˜ํ‚ค๊ฐ€ ์ €์žฅ๋˜์–ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— mappedBy ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์—†๋‹ค. 

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ์ •๋ฆฌ

  • ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์€ ๋‘ ํ…Œ์ด๋ธ” ์ค‘ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ชฝ์„ ์ฃผ์ธ์ด๋ผ ํ•œ๋‹ค.(๋ณดํ†ต ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ €์žฅ๋˜๋Š” ํ…Œ์ด๋ธ”)
  • ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์€ mappedBy์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฃผ์ธ์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋งŒ mappedBy๋กœ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ๋งŒ์ด DB ์—ฐ๊ด€๊ด€๊ณ„์™€ ๋งคํ•‘๋˜๊ณ , ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • @ManyToOne์€ ํ•ญ์ƒ ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์ด๋‹ค.

๐Ÿง‘๐Ÿป‍๐Ÿ’ป์˜ˆ์ œ ์ฝ”๋“œ : https://github.com/ryudongjae/blog-ex

 

GitHub - ryudongjae/blog-ex: ๐Ÿ“๋ธ”๋กœ๊ทธ ์˜ˆ์ œ ์ฝ”๋“œ

๐Ÿ“๋ธ”๋กœ๊ทธ ์˜ˆ์ œ ์ฝ”๋“œ . Contribute to ryudongjae/blog-ex development by creating an account on GitHub.

github.com

 

728x90