- JDBCTemplate
- AOP advice
- Hibernate
- @MockBean๊ณผ @Mock
- JPA
- 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 ํ์ค์ ๋ฐ๋ฅด๋ฉด์, ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.