1. JDBCTemplate
  2. AOP advice
  3. Hibernate
  4. @MockBean๊ณผ @Mock
  5. JPA
  6. N+1๋ฌธ์ œ

1. JDBCTemplate

์Šคํ”„๋ง์—์„œ JdbcTemplate์ด ๋ฌด์—‡์ด๊ณ  JdbcTemplate์„ ์‚ฌ์šฉํ•  ๋•Œ, ์ง์ ‘ Connection, PreparedStatement, ResultSet์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

JDBCTemplate

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ(Connection, PreparedStatement)๋ฅผ ์ค„์—ฌ์คŒ

  • ์„ธ๋ถ€์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์›€

  • JDBC๊ฐ€ ์—†๋‹ค๋ฉด DB์— ์ ‘๊ทผํ•˜๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ Connection์„ ๊ฐ€์ ธ์˜ค๊ณ , PreparedStatement๋ฅผ ๊ฐ€์ ธ์™€์„œ sql์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ž์›์„ ํ•ด์ œํ•ด์ฃผ๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•ด์•ผ ํ•จ โ†’ ์ค‘๋ณต์ฝ”๋“œ, ๋ณต์žก์„ฑ ์ฆ๊ฐ€

์žฅ์ 

  • ์„ค์ • ํŽธ๋ฆฌ
  • ๋ฐ˜๋ณต ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๊ฐœ๋ฐœ์ž๋Š” sql์€ ์ž‘์„ฑํ•˜๊ณ , ์ „๋‹ฌํ•  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ , ์‘๋‹ต ๊ฐ’์„ ๋งคํ•‘ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ

๋‹จ์ 

  • ๋™์  SQL์„ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์›€ โ†’ Mybatis / QueryDSL์„ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌ

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ด€๋ฆฌ

  • JDBCTemplate์€ ์Šคํ”„๋ง์˜ Datasource์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ปค๋„ฅ์…˜ ํ’€ ์ œ๊ณต
  • ์ด๋ฅผํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ

ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ

  • JdbcTemplate์€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ
  • ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ํŠธ๋žœ์žญ์…˜์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•ด ๋ณ„๋„ ์ปค๋„ฅ์…˜์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์Œ

๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

  • Connection, PreparedStatement, ResultSet๊ณผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์—ด๊ณ  ๋‹ซ์Œ
  • ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ

์˜ˆ์™ธ์ฒ˜๋ฆฌ

  • JDBC ์˜ˆ์™ธ๋ฅผ DataAccessException์œผ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ฐœ์ƒ
  • sql ์˜ˆ์™ธ๋‚˜ ์ž์› ๊ด€๋ฆฌ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง ์ ์šฉ ๊ฐ€๋Šฅ

Question

JdbcTemplate์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ Connection, PreparedStatement, ResultSet์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋‚˜์š”?

๋‚ด๋ถ€์ ์œผ๋กœ DataSource๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๊ณ , Connection, PreparedStatement, ResultSet ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด JdbcTemplate์ด ๊ด€๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.

Question

JDBCTemplate์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์™€ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

JDBCTemplate์„ ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  JDBCTemplate์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐฐ์น˜์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•ด ํฐ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•œ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

2. AOP advice

์Šคํ”„๋ง AOP์—์„œ ์–ด๋“œ๋ฐ”์ด์Šค(advice)๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

AOP advice

  • ํŠน์ • ์ง€์ ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
  • Aspect์˜ ํ•ต์‹ฌ์œผ๋กœ์„œ ํŠน์ • JoinPoint์—์„œ ์‹คํ–‰๋  ๋กœ์ง์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„
  • ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „, ํ›„, ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์‹คํ–‰

Question

์Šคํ”„๋ง AOP์—์„œ ์–ด๋“œ๋ฐ”์ด์Šค(advice)๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

advice๋Š” joinpoint๋ผ๋Š” ํŠน์ • ์ง€์ ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‚˜ ์‹คํ–‰์ด joinpoint๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ advice๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์€ ์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

BeforeAdvice๋Š” ๋Œ€์ƒ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „์— ์‹คํ–‰๋˜์–ด ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ๋กœ๊ทธ ๊ธฐ๋ก ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. AfterAdvice๋Š” ๋Œ€์ƒ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ ์‹คํ–‰๋˜์–ด ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฐœ์ƒ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. AroundAdvice๋Š” ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์‹คํ–‰์„ ์ „ํ›„๋กœ ๊ฐ์‹ธ์„œ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. FinallyAdvice๋Š” ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ›„ ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ advice๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์€ ๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Question

Join Point์™€ Advice์˜ ์ฐจ์ด์ ?

JoinPoint๋Š” AOP์—์„œ ํŠน์ •ํ•œ ์‹คํ–‰ ์ง€์ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฉ”์†Œ๋“œ ์‹คํ–‰์ด Join Point๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Advice๋Š” JoinPoint์—์„œ ์‹คํ–‰๋  ๊ตฌ์ฒด์ ์ธ ๋กœ์ง์ž…๋‹ˆ๋‹ค. ์–ธ์ œ, ์–ด๋–ค ์ž‘์—…์„ ํ• ์ง€ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Question

์Šคํ”„๋ง AOP์—์„œ Advice๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

AOP์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ Advice๊ฐ€ ํ•˜๋‚˜์˜ JoinPoint์— ์ ์šฉ๋  ๋•Œ ์‹คํ–‰์ˆœ์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„  @Order ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ @Aspect ํด๋ž˜์Šค์— ์„ค์ •๋œ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Hibernate

ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์—์„œ Lazy Loading๊ณผ Eager Loading์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด๋ฉฐ, ์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

Hibernate

  • ์ž๋ฐ”์™€ RDBMS๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ sql์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

Lazy Loading๊ณผ Eager Loading์˜ ์ฐจ์ด์ 

Lazy Loading

  • ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๋กœ๋”ฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹
  • ์ฒ˜์Œ์—๋Š” ๊ด€๋ จ ๊ฐ์ฒด์˜ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ๋•Œ ๋กœ๋”ฉ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ, ์ดˆ๊ธฐ ๋กœ๋”ฉ์‹œ์—๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋”ฉํ•˜๊ณ  ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋Š” ํ•„์š”ํ•  ๋•Œ ์กฐํšŒ
  • ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋Š” ๋กœ๋”ฉํ•˜์ง€ ์•Š์Œ

Eager Loading

  • ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฆ‰์‹œ ๋กœ๋”ฉํ•˜๋Š” ๋ฐฉ์‹
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋”ฉํ•ด ์กฐํšŒ ์‹œ์ ์— ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ ธ์™€ ์ฟผ๋ฆฌ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Œ
  • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์ฆ‰์‹œ ๋กœ๋”ฉ

Lazy Loading๊ณผ Eager Loading์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

Lazy Loading

  • N+1 ๋ฌธ์ œ : ์ž์‹ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๋ณ„๋„์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋งŽ์€ ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•  ๋•Œ N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ โ†’ Join์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
  • 10๊ฐœ์˜ ๋ถ€๋ชจ ๊ฐ์ฒด ์กฐํšŒ โ†’ ๋ถ€๋ชจ ๊ฐ์ฒด ์กฐํšŒ ์ฟผ๋ฆฌ 1๋ฒˆ + ๊ฐ ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์ž์‹ ๊ฐ์ฒด ์กฐํšŒ ์ฟผ๋ฆฌ 10๋ฒˆ = 11๋ฒˆ

Eager Loading

  • ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ, ๋ถ€๋ชจ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์ž์‹ ๊ฐ์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•  ์ˆ˜๋ก ์„ฑ๋Šฅ์ €ํ•˜ ๋ฐœ์ƒ โ†’ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก @Query ์—์„œ ๋กœ๋”ฉํ•  ๋ฐ์ดํ„ฐ ์„ ํƒ์ ์œผ๋กœ ์ง€์ •

Question

Lazy Loading์„ ์‚ฌ์šฉํ•  ๋•Œ N+1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ Eager Loading์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, Fetch Join์„ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ ๊ฐ์ฒด์™€ ์ž์‹ ๊ฐ์ฒด๋ฅผ ํ•œ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. @MockBean๊ณผ @Mock

์Šคํ”„๋ง์—์„œ @MockBean๊ณผ @Mock์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

@MockBean

  • Spring Test์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

  • ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์— mock ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์—ญํ• ๋กœ ์ฃผ๋กœ ํ†ตํ•ฉํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋จ

  • ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ Spring Application Context์— ๋“ฑ๋ก๋˜์–ด ์‹ค์ œ ๋นˆ ๋Œ€์ฒด ๊ฐ€๋Šฅ

  • DI๋ฅผ ํ†ตํ•ด mock ๊ฐ์ฒด ์ฃผ์ž…

  • Spring์˜ ApplicationContext์— mock ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํ•ด๋‹น Mock ๊ฐ์ฒด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›๋„๋ก ํ•จ

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ

  • ์„œ๋น„์Šค, ๋ ˆํฌ์ง€ํ† ๋ฆฌ, ์ปดํฌ๋„ŒํŠธ ๋“ฑ์˜ ๋นˆ์„ mock์œผ๋กœ ๋Œ€์ฒดํ•  ๋•Œ ์‚ฌ์šฉ

@SpringBootTest
public class SomeServiceTest {
    
    @MockBean
    private SomeRepository someRepository;  // ์‹ค์ œ ๋นˆ์„ mock์œผ๋กœ ๋Œ€์ฒด
 
    @Autowired
    private SomeService someService;
 
    @Test
    public void testSomeMethod() {
        // Mock behavior ์„ค์ •
        when(someRepository.someMethod()).thenReturn("someValue");
 
        // ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰
        assertEquals("someValue", someService.someMethod());
    }
}

@Mock

  • Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ mock ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ

  • Spring Context์™€ ๋ฌด๊ด€ํ•˜๋ฉฐ, ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ

  • mock ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ Spring์˜ DI๋ฅผ ํ™œ์šฉํ•˜์ง„ ์•Š์Œ

  • ์ง์ ‘ ํ•„๋“œ์ฃผ์ž…์ด๋‚˜ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด mock ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ

Question

์Šคํ”„๋ง์—์„œ @MockBean๊ณผ @Mock์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

@MockBean์€ ๋ณดํ†ต ํ†ตํ•ฉํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋ฉฐ Spring Application Context์— mock ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‹ค์ œ ๋นˆ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•ด mock ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. @Mock์€ Mockito ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ณดํ†ต ๋‹จ์œ„ํ…Œ์ŠคํŠธ์—์„œ mock ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Spring๊ณผ๋Š” ๊ด€๊ณ„์—†์ด mock ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•„๋“œ์ฃผ์ž…์ด๋‚˜ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

Question

@MockBean๊ณผ @Mock์„ ์‚ฌ์šฉํ•  ๋•Œ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

@MockBean์€ Spring์˜ DI ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์— ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. @Mock์€ Spring์˜ DI์™€ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Question

@MockBean์„ ์‚ฌ์šฉํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ApplicationContext๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ํŠน์ • ๋นˆ๋งŒ mock์œผ๋กœ ๋Œ€์ฒดํ•˜๊ณ ์ž ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. application context๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์‹ค์ œ ์‹œ์Šคํ…œ๊ณผ ๋น„์Šทํ™˜ ํ™˜๊ฒฝ์—์„œ ์ƒํ˜ธ์ž‘์šฉ์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

@MockBean๊ณผ @Mock์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Spring context์™€ mockito ์˜ ๊ด€๋ฆฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. JPA

JPA๋ž€ ๋ฌด์—‡์ด๊ณ  JPA์—์„œ Entity ํด๋ž˜์Šค์— @Id ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ์ด ์–ด๋…ธํ…Œ์ด์…˜ ์—†์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

JPA

  • ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ์œ„ํ•œ ์ž๋ฐ” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค
  • sql์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์ด ๊ฐ€๋Šฅ
  • Hibernate, openJPA์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ JPA ๊ตฌํ˜„
  • ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ” ๋งคํ•‘
  • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฟผ๋ฆฌ ์ž‘์„ฑ
  • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•œ ์บ์‹ฑ

@Id

  • JPA ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋ฉฐ, ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ํ‚ค ํ•„์š”
  • ๊ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜

@Id์—†์ด ์—”ํ‹ฐํ‹ฐ์— ์ €์žฅ์‹œ

  • JPA๋Š” ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์—†๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•  ์ˆ˜ ์—†์Œ
  • hibernateException ๋ฐœ์ƒ

Question

JPA์—์„œ ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ์„ ์œ„ํ•œ @GeneratedValue ์ „๋žต ์ค‘ IDENTITY, SEQUENCE, TABLE์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

  • IDENTITY: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ AUTO_INCREMENT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹. ์ƒˆ๋กœ์šด ID๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ.
  • SEQUENCE: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‹œํ€€์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ID๋ฅผ ์ƒ์„ฑ. ์ฃผ๋กœ Oracle, PostgreSQL์—์„œ ์‚ฌ์šฉ.
  • TABLE: ID ์ƒ์„ฑ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์œ  ID๋ฅผ ๊ด€๋ฆฌ. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋‚˜ ์„ฑ๋Šฅ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Œ.

6. N+1๋ฌธ์ œ

JPA์—์„œ N+1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  • JPA์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ, ํ•˜๋‚˜์˜ ์กฐํšŒ๋กœ ์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ ํ›„ ๊ฐ๊ฐ์˜ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐํšŒํ•˜๋Š” ์ƒํ™ฉ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • Fetch Join ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ด
  • fetchType์„ Eager๋กœ ๋ณ€๊ฒฝ โ†’ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋กœ๋”ฉ๋˜์–ด ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐœ์ƒ
  • @EntityGraph ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ FetchType ์„ค์ • ์žฌ์ •์˜
  • Batch Fetch Size : ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐฐ์น˜๋กœ ์กฐํšŒํ•˜์—ฌ ์ฟผ๋ฆฌ์ˆ˜๋ฅผ ์ค„์ž„

Question

Fetch Join๊ณผ Batch Fetch Size์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์–ธ์ œ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•œ๊ฐ€์š”?

Fetch Join์€ ํ•œ ๋ฒˆ์˜ ์กฐ์ธ ์ฟผ๋ฆฌ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ ๊ฐ„๋‹จํ•œ ๊ด€๊ณ„์ผ ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. Batch Fetch Size๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.


Question

ORM๊ณผ JPA, Hibernate์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๋ง์”€ํ•ด์ฃผ์„ธ์š”.

  • ORM(๋ ˆ์‹œํ”ผ):
    • ORM(Object-Relational Mapping)์€ ๊ฐ์ฒด(Object)์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”(Relational)์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ ˆ์‹œํ”ผ)์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๊ณ , ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹คโ€๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
    • ๋ ˆ์‹œํ”ผ์ฒ˜๋Ÿผ โ€œ์–ด๋–ป๊ฒŒ ์š”๋ฆฌํ• ์ง€โ€์— ๋Œ€ํ•œ ํฐ ๊ทธ๋ฆผ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ORM์€ ์ด๋Ÿฐ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด, ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ฃ .
  • JPA(์š”๋ฆฌ์ฑ…):
    • JPA(Java Persistence API)๋Š” ORM์˜ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ž๋ฐ” ์„ธ๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ORM์˜ โ€œ๊ณต์‹ ์š”๋ฆฌ์ฑ…โ€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์š”๋ฆฌ์ฑ…์—๋Š” โ€œ์–ด๋–ค ์žฌ๋ฃŒ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•˜๊ณ , ์–ด๋–ค ์ˆœ์„œ๋กœ ์š”๋ฆฌํ•ด์•ผ ํ•œ๋‹คโ€๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ทœ์น™๋“ค์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • JPA๋Š” ORM์˜ ํ‘œ์ค€์„ ์ •์˜ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด ํ‘œ์ค€์— ๋งž์ถฐ ๊ตฌํ˜„๋˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.
  • Hibernate(์š”๋ฆฌ์‚ฌ):
    • Hibernate๋Š” JPA๋ผ๋Š” ์š”๋ฆฌ์ฑ…์„ ์ฐธ์กฐํ•˜๋ฉฐ ์‹ค์ œ๋กœ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์š”๋ฆฌ์‚ฌ์ž…๋‹ˆ๋‹ค.
    • Hibernate๋Š” JPA์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด์„œ๋„ ์ž์ฒด์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(๋ ˆ์‹œํ”ผ)์„ ์ œ๊ณตํ•˜์—ฌ ๋” ๋ง›์žˆ๊ณ , ํšจ์œจ์ ์ธ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ƒ…๋‹ˆ๋‹ค.
    • ์ฆ‰, JPA๊ฐ€ ํ‘œ์ค€์ด๋ผ๋ฉด Hibernate๋Š” ๊ทธ ํ‘œ์ค€์„ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์‹ค์งˆ์  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • ORM์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • JPA๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์—์„œ ORM์„ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•  ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • Hibernate๋Š” ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. JPA ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด์„œ, ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.