๐ŸŒ WEB/JPA

4. ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์—ฐ๊ด€๊ด€๊ณ„

์• ์ •์“ฐ 2021. 5. 14. 14:11

๋ชฉํ‘œ

- ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฐจ์ด๋ฅผ ์ดํ•ด

- ๊ฐ์ฒด์˜ ์ฐธ์กฐ์™€ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘


๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฐจ์ด๋ฅผ ์ดํ•ด

๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ๋งž์ถ”์–ด ๋ชจ๋ธ๋ง ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ์  (์ฐธ์กฐ ๋Œ€์‹ ์— ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ)

ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. 

ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค๋กœ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ด€๋œ ํ…Œ์ด๋ธ”์„ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฒˆ๊ฑฐ๋กœ์šด ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.

      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);

      Member member = new Member();
      member.setUsername("member1");
      // ์™ธ๋ž˜ํ‚ค ์‹๋ณ„์ž๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฌ๋‹ค.
      member.setTeamId(team.getId());
      em.persist(member);
      // ๋ฉค๋ฒ„์˜  ํŒ€์„ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ ๋ฒˆ๊ฑฐ๋กœ์›€
      Member findMember = em.find(Member.class,member.getId());
      Long findTeamId = findMember.getTeamId();
      Team findTeam = em.find(Team.class,findTeamId);

 

 

๊ฐ์ฒด์˜ ์ฐธ์กฐ์™€ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘

๋‹จ๋ฐ˜ํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„

๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ๋ง (๊ฐ์ฒด ์—ฐ๊ด€๊ด€๊ณ„ ์‚ฌ์šฉ)

์•„๋ž˜์™€ ๊ฐ™์ด Member์—์„œ Team์„ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  @ManyToOne
  @JoinColumn(name = "TEAM_ID")
  private Team team;
      member.setTeam(team);
      em.persist(member);

      Member findMember = em.find(Member.class, member.getId());
      Team findTeam = findMember.getTeam();

      tx.commit();

 

์–‘๋ฐ˜ํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์™€ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ

์–‘์ชฝ์—์„œ ์ฐธ์กฐํ•ด์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๊ฒƒ

ํ…Œ์ด๋ธ” ๊ด€๊ณ„๋Š” ๋ณ€ํ•จ์ด ์—†๋‹ค ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค๋กœ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋กœ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ฐฉํ–ฅ์ด ์—†๋‹ค) 

Team ํด๋ž˜์Šค์— ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•ด์ฃผ์—ˆ๋‹ค. mappedBy ์—์„œ ์‚ฌ์šฉํ•œ team์€ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์žˆ๋Š” Member ํด๋ž˜์Šค์—์„œ @ManyToOne์„ ๊ฑธ์–ด์ค€ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด์„œ JPA์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

    @OneToMany(mappedBy = "team")
    private List<Member> memberList = new ArrayList<>();
	Member findMember = em.find(Member.class, member.getId());
	List<Member> memberList = findMember.getTeam().getMemberList();
	for(Member mem : memberList){
		System.out.println(mem.getUsername());
	}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด findMember.getTeam ์„ ์ฐพ์•„ ํ•ด๋‹น Team์— MemberList๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์„œ๋กœ์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์–‘๋ฐ˜ํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ ์ด๋‹ค.

 

์—ฐ๊ด€๊ด€๊ณ„์™€ ์ฃผ์ธ๊ณผ mappedBy

๊ฐ์ฒด์˜ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„ 2๊ฐœ์ด๋‹ค. -> ๊ฐœ์ฒด๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฐธ์กฐํ•˜๋ ค๋ฉด ๋‹จ๋ฑกํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ 2๊ฐœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค ํ•˜๋‚˜๋กœ ๋‘ ํ…Œ์ด๋ธ”์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. (ํ‚ค ํ•˜๋‚˜๋กœ ์–‘์ชฝ ์กฐ์ธ)

 

์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ๊ทœ์น™

- ๊ฐ์ฒด์˜ ๋‘ ๊ด€๊ณ„์ค‘ ํ•˜๋‚˜๋ฅผ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ง€์ •

- ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌ( ๋“ฑ๋ก, ์ˆ˜์ • )

- ์ฃผ์ธ์ด ์•„๋‹Œ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ ํ•˜๊ณ  mappedBy ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์ธ์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฌ๋ฅผ ์ฃผ์ธ์œผ๋กœ ์ •ํ•ด์•ผ ํ• ๊นŒ?

์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์ฃผ์ธ์œผ๋กœ ์ •ํ•ด๋ผ!

Member - Team ์ด ์žˆ๋‹ค๋ฉด ๋‹ค ์ธ Member๋ฅผ ์ฃผ์ธ์œผ๋กœ ํ•œ๋‹ค.

Team์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฐ€์งœ ๋งคํ•‘์ด๋‹ค.

๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ธ์„ ์„ ํƒํ•˜๋ฉด ์•ˆ๋œ๋‹ค. [๋‹ค] ์ชฝ์— ์ฃผ์ธ์„ ๊ฑธ์–ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.

 

์–‘๋ฐฉํ–ฅ ๋งคํ•‘์‹œ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ์‹ค์ˆ˜

-> ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์Œ

 

์˜ˆ๋ฅผ๋“ค์–ด team.getMembers().add(member) ๋กœ ์ฃผ์ธ์ด ์•„๋‹Œ ๊ณณ์—๋งŒ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด

์•„๋ž˜์™€ ๊ฐ™์ด Memberํ…Œ์ด๋ธ”์— TEAM_ID ๊ฐ€ ๋งคํ•‘๋˜์ง€ ์•Š๋Š”๋‹ค.

 

	Team team = new Team();
	team.setName("TeamA");
	em.persist(team);

	Member member = new Member();
	member.setName("aejeong");

	team.getMembers().add(member);

	// ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์— ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
	member.setTeam(team);

	em.persist(member);

 

ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ ๊ฐ์ฒด ๊ด€๊ณ„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ํ•ญ์ƒ ์–‘์ชฝ๋‹ค ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

 

์•„๋‹ˆ๋ฉด ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์–ด๋””์„œ ๋„ฃ๋“  ์ƒ๊ด€์—†๋‹ค. ํ•œ์ชฝ์—์„œ๋งŒ ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค ์–‘์ชฝ์—์„œ ํ•ด์ฃผ๋ฉด ๋ฌดํ•œ๋ฃจํ”„์˜ ์œ„ํ—˜์ด ์žˆ๋‹ค.

	private List<Member> members = new ArrayList<>();
    
	public void addMember(Member member){
	member.setSteam(this);
	member.add(member);
   	}

 

toString(), lombok, JSON ์ƒ์„ฑ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฅผ ์‚ฌ์šฉ์‹œ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ์กฐ์‹ฌํ•˜์ž.

 

 

๋‹จ๋ฐ˜ํ–ฅ ๋งคํ•‘๋งŒ์œผ๋กœ๋„ ์ด๋ฏธ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์€ ์™„๋ฃŒ๋œ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ ์„ค๊ณ„ํ•  ๋•Œ ์šฐ์„  ๋‹จ๋ฐ˜ํ–ฅ๊ด€๊ณ„๋กœ ํ•œ๋‹ค. ์–‘๋ฐฉํ–ฅ์€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ ๋ฟ์ด๋‹ค.

JPQL์—์„œ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ผ์ด ๋งŽ์•„์„œ ํ•„์š”ํ•  ๋•Œ ์ถ”๊ฐ€ํ•ด๋„ ๋œ๋‹ค. ํ…Œ์ด๋ธ”์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ!

 

 

๋ฐ˜์‘ํ˜•