๐Ÿ› ๏ธBackend/๐ŸŒณSpring

[Spring Data JPA] JPA Entity ํด๋ž˜์Šค์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

junbin2 2024. 12. 30. 19:29

JPA ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜ Entity ๊ฐ์ฒด

@PersistenceContext
private EntityManager entityManager;

public User getUser(Long userId) {
    User user = entityManager.find(User.class, userId);
    return user;  // JPA๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ํ•„๋“œ ๊ฐ’์„ ์„ค์ •
}

ํ•ด๋‹น ๊ณผ์ •์„ ์‚ดํŽด ๋ณด๋ฉด entityManager.find ์ฆ‰, ์กฐํšŒ ๊ณผ์ •์—์„œ User.class ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์žˆ๋‹ค.

์ด User.class ์ด ํด๋ž˜์Šค ์ •๋ณด๋กœ ๋‚ด๋ถ€์— ์• ๋„ˆํ…Œ์ด์…˜์ด๋‚˜ ํ•„๋“œ ์ƒ์„ฑ์ž ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, ๋Œ์•„์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์ฃผ๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๊ฐ’์„ ๋‹ด์•„์ฃผ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ ์ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฐ€? ๊ทธ๊ฑด class์ •๋ณด๋ฅผ ๋„˜๊ธฐ๋ฉด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์˜ ์ •๋ณด ๋˜ํ•œ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

๊ฒฐ๋ก ์€, ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ™œ์šฉํ•ด ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ฒด๋กœ ๋‹ด์•„์„œ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•จ.

 

์ฐธ๊ณ ๋กœ ํ•ด๋‹น ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” public ๋˜๋Š” protected ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์ด ๋˜ํ•œ, 

 

Spring Data JPA ์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

Spring Data JPA์—์„œ๋Š” ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด EntityManager๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์คŒ.

์ฆ‰, ์œ„์˜ ์ฝ”๋“œ๋“ค์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณต์„ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•˜๊ฒŒ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

์ฐธ๊ณ ๋กœ JPA๋‚˜ Spring Data JPA์—์„œ๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ EntityManager๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณต์„ ํ•ด์ค€๋‹ค.

 

 

๋‚ด๊ฐ€ ์™œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‚˜ ๋ณด๋ฉด

 

๋‚˜๋Š” ํ”„๋กœ์ ํŠธ ๋‹น์‹œ JPA๋ฅผ ํ™œ์šฉํ•˜์—ฌ Entityํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค์— ๊ฐ’์„ ๋„ฃ์–ด DB์— insert๋ฅผ ํ•ด์ฃผ๋Š” ๋กœ์ง์„ ์งฐ์—ˆ๋‹ค. ์ด๋•Œ, ๋‚˜๋Š” Entity์— ํ•„๋“œ๊ฐ€ ๋งŽ์•„ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ์—๋Š” ๋ฐ์ดํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋Œ€ํ•œ ๋ช…ํ™•ํ•จ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ์ด ๋˜์–ด Builder ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

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

 

Builder ํŒจํ„ด์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ด์œ 

์• ์ดˆ์— builderํŒจํ„ด์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ํ™œ์šฉ์„ ํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” private์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  public์œผ๋กœ ์—ด์–ด๋‘”๋‹ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ์„ฑ์ž ๋ฐ Builder ๋ฐฉ์‹ ์ด 2๊ฐ€์ง€๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ผ๊ด€์„ฑ๊ณผ Builder ํŒจํ„ด์˜ ์˜๋„๊ฐ€ ์ƒ์‹ค์ด ๋  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ฒฐ๊ตญ JPA Entity ํด๋ž˜์Šค์—์„œ BuilderํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ๋„ฃ์–ด์•ผํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Builder ๋ฐ ์ƒ์„ฑ์ž ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๊ณต์กดํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

์ด ๋ถ€๋ถ„์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ต์€ JPA Entity ํด๋ž˜์Šค์—์„œ๋Š” public ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ™œ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

 

๊ฒฐ๋ก ์€ JPA Entity ํด๋ž˜์Šค์—์„œ๋Š” Builder ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฉ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. ์ง€ํ–ฅํ•˜๋Š”๊ฒŒ ์ข‹์„๋“ฏ