๐ก ๋ณธ ๊ธ์ ์คํ๋ง ๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค ๋์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค - RDB(Relational Database)
ํ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Oracle, MySQL, MSSQL)๋ ๊ฑฐ์ ํ์์ ์ด๋ค. ๊ทธ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค.
RDB์ ๋ฌธ์ ์
1. ๋จ์ ๋ฐ๋ณต ์์ ๋ฌธ์
RDB๋ SQL๋ง ์ธ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์ ํ๋ก์ ํธ ๋๋ถ๋ถ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ณด๋ค SQL๋ก ๊ฐ๋ํ๊ฒ ๋์๋ค.
๊ฐ ํ ์ด๋ธ๋ง๋ค ๊ธฐ๋ณธ์ ์ธ CRUD๋ฅผ ๊ณ์ํด์ ์์ฑ ๋ฐ ์ ์ง ๋ณด์ํด์ผํ๋ค. ์๋ฐฑ ๊ฐ์ ํ ์ด๋ธ์ด ์กด์ฌํ๋ค๋ฉด, ์ด๋ฌํ ๋จ์ ๋ฐ๋ณต ์์ ์ ์๋ฐฑ ๋ฒ ํด์ผํ๋ค.
2. ํจ๋ฌ๋ค์์ ๋ถ์ผ์น
- RDB : ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ง์ ์ด์ ์ด ๋ง์ถฐ์ง ๊ธฐ์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด : ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ๋ฅ๊ณผ ์์ฑ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ๋ ๊ธฐ์
RDB์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์ ์ด์ ์ฌ์๋ถํฐ ๋ค๋ฅธ ์์์ ์์ ์ถ๋ฐํ๋ค. ๋ฐ๋ผ์ ์๋ก ํจ๋ฌ๋ค์์ด ๋ค๋ฅธ๋ฐ, ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ค๊ณ ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. (ํจ๋ฌ๋ค์ ๋ถ์ผ์น)
JPA์ ๋ฑ์ฅ
์์, 1:N ๋ฑ ๋ค์ํ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋, ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง์๋ง ์ง์คํ๊ฒ ๋๋ค. JPA๊ฐ ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ!!
JPA๋?
JPA(Java Persistence API)๋, ์๋ก ์งํฅํ๋ ๋ฐ๊ฐ ๋ค๋ฅธ RDB์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ค๊ฐ์ ์กด์ฌํ์ฌ ํจ๋ฌ๋ค์ ์ผ์น๋ฅผ ์์ผ์ฃผ๊ธฐ ์ํ ๊ธฐ์ ์ด๋ค.
๊ฐ๋ฐ์๋ ๊ทธ๋ฅ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด, JPA๊ฐ ์ด๋ฅผ RDB์ ๋ง๊ฒ SQL์ ๋์ ์์ฑํด์ ์คํํด ์ฃผ๋ ๊ฒ์ด๋ค. ์ด๋ก์จ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก๋ง ์ฝ๋๋ฅผ ํํํ ์ ์๊ฒ ๋๊ณ , ๋์ด์ SQL์ ์ข ์์ ์ธ ๊ฐ๋ฐ์ ํ์ง ์์๋ ๋๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด ์ค์ฌ์ผ๋ก๋ง ๊ฐ๋ฐํ ์ ์๋ค๋ ๊ฒ์ ์์ฐ์ฑ์ ํฅ์์ํฌ ๋ฟ๋ง ์๋๋ผ, ์ ์ง ๋ณด์ํ๊ธฐ์๋ ํจ์ฌ ํธ๋ฆฌํ๋ค.
JPA๋ Java ORM(Object Relational Mapping) ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช ์ธ์ด๋ค. ํน์ ๊ธฐ๋ฅ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ, ORM์ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ์๋ ๊ฒ์ด๋ค. ์ฆ, Java์์ RDB๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํ์ฌ ์ ์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ ๊ฒ์ด๋ค.
Hibernate
JPA๋ ์ธํฐํ์ด์ค๋ก์, ์๋ฐ ํ์ค๋ช ์ธ์์ด๋ค. ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ค๋ฉด ๊ตฌํ์ฒด๊ฐ ํ์ํ๋ค.
JPA๋ฅผ ๊ตฌํํ ORM ํ๋ ์์ํฌ๋ก๋ Hibernate, EclipseLink๊ฐ ๊ฐ์ฅ ๋ํ์ ์ด๋ค. ๊ทธ์ค, Hibernate๊ฐ ๋ฒ์ฉ์ ์ผ๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ค.
JPA์ Hibernate์ ๊ด๊ณ๋, Java์์ interface์ ํด๋น interface๋ฅผ ๊ตฌํํ class์ ๊ฐ์ ๊ด๊ณ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ ๊ทธ๋ฆผ์ JPA์ Hibernate์ ์์ ๋ฐ ๊ตฌํ ๊ด๊ณ๋ฅผ ๋์ํํ ๊ฒ์ด๋ค.
JPA์ ํต์ฌ ์ธํฐํ์ด์ค์ธ EntityManagerFactory, EntityManager, EntityTransaction์ Hibernate์์ ๊ฐ๊ฐ SesseionFactory, Session, Transaction์ผ๋ก ์์๋ฐ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ฐ๊ฐ SessionFactoryImpl, SessionImpl, TransactionImpl๋ก ๊ตฌํํ๊ณ ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์, JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฐ๋์ Hibernate๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ์ธ์ ๋ ์ง EclipseLink ๋ฑ์ ๋ค๋ฅธ JPA ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
Spring Data JPA
Spring์์ JPA๋ฅผ ์ฌ์ฉํ ๋๋ Hibernate ๋ฑ์ ๊ตฌํ์ฒด๋ค์ ์ง์ ๋ค๋ฃจ์ง ์๋๋ค. ๊ตฌํ์ฒด๋ค์ ์ข ๋ ์ฝ๊ฒ ์ฌ์ฉํ๊ณ ์ ์ถ์ํ ์ํจ Spring Data JPA๋ผ๋ ๋ชจ๋์ ์ด์ฉํ๋ค.
Spring Data JPA๋ JPA๋ฅผ ํ ๋จ๊ณ ์ถ์ํ์ํจ Repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋ค. ์ฌ์ฉ์๊ฐ Reopository์ ์ ํด์ง ๊ท์น๋๋ก ๋ฉ์๋๋ฅผ ์ ๋ ฅํ๋ฉด, Spring์ด ์๋์ผ๋ก ํด๋น ๋ฉ์๋ ์ด๋ฆ์ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด์ Bean์ผ๋ก ๋ฑ๋กํด์ค๋ค.
Spring Data JPA๊ฐ JPA๋ฅผ ์ถ์ํํ๋ค๋ ๋ง์, Spring Data JPA์ Repository๋ฅผ ๊ตฌํํ ๋, JPA๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค. ์๋ฅผ ๋ค์ด, Repository ์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ฒด์ธ SimpleJpaRepository์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ๋ด๋ถ์ ์ผ๋ก EntityManager(JPA์ ํต์ฌ ์ธํฐํ์ด์ค)์ ์ฌ์ฉํ๊ณ ์๋ค.
package org.springframework.data.jpa.repository.support;
import ...
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
private final EntityManager em;
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
// Other methods...
}
Spring Data JPA ๋ฅผ ์ ์ฌ์ฉํ๋๊ฐ?
Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์๋ ํฐ ์ฐจ์ด๊ฐ ์๋ค. ํ์ง๋ง Spring ์ง์์์๋ Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๊ตฌํ์ฒด ๊ต์ฒด์ ์ฉ์ด์ฑ
Hibernate ์ธ์ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ์ฝ๊ฒ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ค. Spring Data JPA ๋ด๋ถ์์ ๊ตฌํ์ฒด ๋งคํ์ ์ง์ํด์ฃผ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ JPA ๊ตฌํ์ฒด๋ก ์ฝ๊ฒ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
๋ง์ฝ Hibernate๊ฐ ์๋ช ์ ๋คํด์ ์๋ก์ด JPA ๊ตฌํ์ฒด๊ฐ ๋์ธ๋ก ๋ ์ค๋ฅด๊ฒ ๋๋ฉด, Spring Data JPA๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋๋ค์ ๋งค์ฐ ์ฝ๊ฒ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
2. ์ ์ฅ์ ๊ต์ฒด์ ์ฉ์ด์ฑ
RDB(๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค) ์ธ์ ๋ค๋ฅธ ์ ์ฅ์๋ก ์ฝ๊ฒ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ค.
์๋น์ค ์ด๊ธฐ์๋ RDB๋ก ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ์ง๋ง, ์ ์ ํธ๋ํฝ์ด ๋ง์์ ธ RDB๋ก๋ ๋์ ํ ๊ฐ๋น์ด ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ MongoDB๋ก ๊ต์ฒด๋ฅผ ์ํ๋ค๋ฉด, ๊ฐ๋ฐ์๋ Spring Data JPA์์ Spring Data MongoDB๋ก ์์กด์ฑ๋ง ๊ต์ฒดํ๋ฉด ๋๋ค.
Spring Data์ ํ์ ํ๋ก์ ํธ๋ค์ ๊ธฐ๋ณธ์ ์ธ CRUD ์ธํฐํ์ด์ค๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์, ์ ์ฅ์๊ฐ ๊ต์ฒด๋์ด๋ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
๐ฉ๐ป ์ ๋ฆฌ
- JPA๋ ๊ธฐ์ ๋ช
์ธ์ด๊ณ , ์ธํฐํ์ด์ค์ด๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ค!!
- Hibernate๋ JPA์ ๊ตฌํ์ฒด์ด๋ค.
- SpringData JPA๋ JPA๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ชจ๋์ด๋ค.
์ ๊ทธ๋ฆผ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, Hibernate, JPA, Spring Data JPA์ ๊ด๊ณ๋ฅผ ๊ฐ์ฅ ์ ํํํ๋ค๊ณ ์๊ฐํ๋ค.
+) JDBC - Java DataBase Connectivity
์์ ๊ทธ๋ฆผ์ ๊ธ์์ ๋ค๋ฃจ์ง ์์ JDBC๊ฐ ์์ด์ ์ ๊น ์ธ๊ธํ๊ณ ๊ธ์ ๋ง์น๊ฒ ๋ค.
JDBC(Java DataBase Connectivity)๋ Java API์ด๋ค. Java ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅ ๋ฐ ์ ๋ฐ์ดํธํ๊ฑฐ๋, DB์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Java์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค. ์ฆ, Java์ DB ์ฌ์ด์ ์กด์ฌํ์ฌ ๋์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ!
์ด ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ ์๋ฟ์ ๊ฒ์ด๋ค.
์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ค๋ฉด ์๋ ๊ธ์ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค. ์ ๋ง ์์ธํ๊ฒ ์ ๋ฆฌ๋์ด ์๋ค.
[Java] JDBC๋ ๋ฌด์์ธ๊ฐ? - Java Database Connectivity
Reference
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] AOP (0) | 2024.01.22 |
---|---|
[Spring] welcome page ๋ง๋ค๊ธฐ (2) | 2024.01.03 |