# [JPA] ํ”„๋ก์‹œ(Proxy)์™€ ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading)
Study Repository

[JPA] ํ”„๋ก์‹œ(Proxy)์™€ ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading)

by rlaehddnd0422

์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ์„ ๋•Œ ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์ด ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. 

 

๋ณธ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด Member์—”ํ‹ฐํ‹ฐ์™€ Team ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋‹ค๋Œ€์ผ๋กœ ๋งคํ•‘๋˜์–ด ์žˆ์„ ๋•Œ, Member Entity๋ฅผ ์กฐํšŒํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ Team Entity๊นŒ์ง€ ์กฐํšŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

JPA๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ง€์—ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์ด

๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์‰ฝ๊ฒŒ ๋งํ•ด team.getName() ์ฒ˜๋Ÿผ Team ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— Team Entity์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋Šฅ์€ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๋Œ€์‹ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก์‹œ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

ํ”„๋ก์‹œ

์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ EntityManager.getReference()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Member member = em.getReference(Member.class,1L);
  • member๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ”„๋ก์‹œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • find() ๋ฉ”์†Œ๋“œ์™€ ๋‹ฌ๋ฆฌ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ JPA๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜์ง€๋„, ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜์†ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ„์ž„ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๋‹ˆ๊นŒ ํ๋ฆ„์„ ํ•œ ๋ฒˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

Member member = em.getReference(Member.class, 1L);

โžก๏ธ Member ํƒ€์ž… Proxy ๊ฐ์ฒด ์ƒ์„ฑ (member)

// ํ”„๋ก์‹œ ๊ฐ์ฒด ์ตœ์ดˆ ์‚ฌ์šฉ -> ํ”„๋ก์‹œ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์š”์ฒญ 
member.getName();

// ์‹๋ณ„์ž์˜ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™”๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋’ค์—์„œ ์„ค๋ช…
member.getId();

ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

โžก๏ธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—๊ฒŒ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. (์ดˆ๊ธฐํ™” ์š”์ฒญ)

 

โžก๏ธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์žˆ๋Š” ๊ฒฝ์šฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” DB๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์‹ค์ œ Entity๋ฅผ   ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ Entity ์‚ฌ์šฉ)

์กฐํšŒ ๋Œ€์ƒ์ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ด๋ฏธ ์žˆ์œผ๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โžก๏ธ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—†๋Š” ๊ฒฝ์šฐ, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” DB๋ฅผ ์กฐํšŒํ•ด์„œ ์‹ค์ œ Entity๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ target์— ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ ๋ฐ ์ฐธ์กฐ๋ฅผ ํ”„๋ก์‹œ์— ๋ณด๊ด€)

 

โžก๏ธ target์˜ getId()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ( target.getId() ํ˜ธ์ถœ ) (ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ -> ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ์‹คํ–‰) 

ํ”„๋ก์‹œ์˜ ํŠน์ง•

ํ”„๋ก์‹œ ํด๋ž˜์Šค๋Š” ์‹ค์ œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ์‹ค์ œ ํด๋ž˜์Šค์™€ ๊ฒ‰๋ชจ์–‘์ด ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ด ๊ฐ์ฒด๊ฐ€ ํ”„๋ก์‹œ ๊ฐ์ฒธ์ง€, ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์•„๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋ก์‹œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์ฒ˜์Œ ์ƒ์„ฑ์‹œ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด (์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋‚ด๋ถ€์— ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์™€ ๋งคํ•‘๋œ target์„ ํ†ตํ•ด) ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋„์›€์„ ๋ฐ›์•„์•ผ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ์™€ ์‹๋ณ„์ž(PK)

์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋ก์‹œ๋กœ ์กฐํšŒํ•  ๋•Œ ์‹๋ณ„์ž(PK) ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์ด ์‹๋ณ„์ž ๊ฐ’์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์‹๋ณ„์ž ๊ฐ’์„ ์กฐํšŒํ•˜๋Š” team.getId()๋ฅผ ํ˜ธ์ถœํ•ด๋„ ํ”„๋ก์‹œ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Team team = em.getReference(Team.class, 1L);
team.getId(); // ์ดˆ๊ธฐํ™” ์š”์ฒญ X
์—”ํ‹ฐํ‹ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ @Access(AccessType.PROPERTY) ๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ดˆ๊ธฐํ™” ์š”์ฒญ X
์—”ํ‹ฐํ‹ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ @Access(AccessType.FIELD) ๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ดˆ๊ธฐํ™” ์š”์ฒญ O
Member member = em.find(Member.class, 1L);
Team team = em.getReference(Team.class, 1L); // SQL ์‹คํ–‰ X
member.setTeam(team);

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

ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” ์—”ํ‹ฐํ‹ฐ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ•„๋“œ๋กœ ์„ค์ •ํ•ด๋„ ํ”„๋ก์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

ํ”„๋ก์‹œ ์ดˆ๊ธฐํ™” ํ™•์ธ 
- JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” PersistenceUnitUtil.isLoaded(Object entity) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐํ™” ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
boolean isLoad = em.getPersistenceUnitUtil().isLoaded(entity);

ํ”„๋ก์‹œ/์‹ค์ œ ๊ฐ์ฒด ํ™•์ธ
System.out.println("memberProxy = " + member.getClass().getName());
-> ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ...javassist..

์ง€์—ฐ๋กœ๋”ฉ, ์ฆ‰์‹œ๋กœ๋”ฉ 

ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์ฃผ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์—ฐ๋กœ๋”ฉ(์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒ)ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ฆ‰์‹œ๋กœ๋”ฉ์€ ์ง€์—ฐ๋กœ๋”ฉ์˜ ๋ฐ˜๋Œ€๊ฐœ๋…์œผ๋กœ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

์ฆ‰์‹œ๋กœ๋”ฉ ์‚ฌ์šฉ : ๋‹ค์ค‘์„ฑ ์–ด๋…ธํ…Œ์ด์…˜์— fetch ์†์„ฑ์„ FetchType.EAGER๋กœ ์„ค์ •

@Entity
public class Member {
	...
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
 	...   
}

์‹ค์ œ ์‹คํ–‰๋˜๋Š” SQL

select
    M.*,
    T.*
from Member M
	left outer join 
    Team T on 
	M.TEAM_ID = T.TEAM_ID 
where M.MEMBER_ID = 1L
  • ์ฆ‰์‹œ ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ ์ฆ‰์‹œ ๋กœ๋”ฉ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ๋“ค์„ Joinํ•˜๋ฉฐ ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰์‹œ ๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ(์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ ๊ต์ง‘ํ•ฉ)์ด ์•„๋‹Œ ์™ธ๋ถ€ ์กฐ์ธ(์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋“ , ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š”๋ฐ์ดํ„ฐ๋“  ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ์ถ”์ถœ)ํ•ฉ๋‹ˆ๋‹ค.
    • ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ null ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ.
  • ๋‚ด๋ถ€ ์กฐ์ธ์ด ์™ธ๋ถ€ ์กฐ์ธ๋ณด๋‹ค ์„ฑ๋Šฅ์ด๋‚˜ ์ตœ์ ํ™”๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ?
    • @JoinColumn์˜ nullable ์†์„ฑ์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ๋‚ด๋ถ€์กฐ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ : ๋‹ค์ค‘์„ฑ ์–ด๋…ธํ…Œ์ด์…˜์— fetch ์†์„ฑ์„ FetcchType.LAZY๋กœ ์„ค์ • 

@Entity
public class Member {
	...
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;
 	...   
}

 

Member member = em.find(Member.class, 1L);
  • Team์€ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— member๋งŒ ์กฐํšŒํ•˜๊ณ  ํŒ€์€ ์กฐํšŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹  team ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด ๋‘ก๋‹ˆ๋‹ค!
Team team = member.getTeam(); // ํ”„๋ก์‹œ ๊ฐ์ฒด!
  • team์€ ํ”„๋ก์‹œ ๊ฐ์ฒด!
team.getName(); // ํ”„๋ก์‹œ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ํ˜ธ์ถœํ•ด์„œ ์‹ค์ œ ํŒ€ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  • ์ด๋ ‡๊ฒŒ ์‹ค์ œ ํ˜ธ์ถœ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ก์‹œ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ select * from team where team_id = ? SQL์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. 

 

+์ง€์—ฐ๋กœ๋”ฉ, ์ฆ‰์‹œ๋กœ๋”ฉ ๊ธฐ๋ณธ ์ „๋žต

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ ( @ManyToOne, @OneToOne ) : ์ฆ‰์‹œ๋กœ๋”ฉ ์‚ฌ์šฉ
์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ( @ManyToMany, @OneToMany ) : ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ

์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ปฌ๋ ‰์…˜์ธ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ €ํ•˜ ์ด์Šˆ๋กœ ์ฆ‰์‹œ ๋กœ๋”ฉ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
+ ์ปฌ๋ ‰์…˜์€ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ '์ปฌ๋ ‰์…˜ ๋ž˜ํผ'๋ผ๋Š” ํ”„๋ก์‹œ๊ฐ€ ์ง€์—ฐ๋กœ๋”ฉ์„ ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

 

<์ •๋ฆฌ>

  • ์ง€์—ฐ๋กœ๋”ฉ : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋ก์‹œ๋กœ ์กฐํšŒ. ํ”„๋ก์‹œ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒ
  • ์ฆ‰์‹œ๋กœ๋”ฉ : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ์กฐํšŒ. (SQL JOIN ์‚ฌ์šฉ)
    • ์ฆ‰์‹œ๋กœ๋”ฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ญ์ƒ ์™ธ๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋–„๋ฌธ์— ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋‚ด๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์œผ๋ฉด ๋‹ค์ค‘์„ฑ ์–ด๋…ธํ…Œ์ด์…˜์— nullable ์†์„ฑ์„ false๋กœ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<์ฐธ๊ณ ์ž๋ฃŒ>

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ