๐ ์ด ๊ธ์ CS ์คํฐ๋๋ฅผ ์งํํ๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค.๐โ๏ธ๐
๐JPA (Java Persistence API)
JPA๋ ์๋ฐ์์ ORM(Object-Relational Mapping)์ ๊ตฌํํ๊ธฐ ์ํ ํ์ค ๋ช ์ธ๋ก, ์ธํฐํ์ด์ค์ ์ ๋ ธํ ์ด์ ์ ํตํด ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์์ ์ ์ํ๋ค. JPA๋ ์คํ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ, Hibernate, EclipseLink, DataNucleus, OpenJPA ๋ฑ๊ณผ ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ํ์ํ API์ด๋ค.
ํต์ฌ ์ธํฐํ์ด์ค์ธ EntityManager ๋ฑ์ ํฌํจํ๋ javax.persistence ํจํค์ง๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ด ์ด๋ฃจ์ด์ง๋ค. JPA์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ORM ํ๋ ์์ํฌ ๊ฐ ํธํ์ฑ๊ณผ ์ด์์ฑ์ ๋์ฌ, ๊ตฌํ์ฒด๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋ค๋ ์ ์ด๋ค.
JPA๋ ์์์ฑ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด EntityManager์ EntityManagerFactory์ ์์กดํ๋ค.
EntityManager๋ ์ํฐํฐ์ ์ํ ๋ณํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ด๋ฅผ SQL ์ฟผ๋ฆฌ๋ก ๋ณํํ๋ Persistence Context๋ก ์๋ํ๋ค.
EntityManager์ ์ฃผ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
/*
* Returns an entity by its primary key.
*/
public <T> T find(Class<T> entityClass, Object primaryKey);
/*
* Creates a new transient entity that will be inserted in the databse during
* the next flush()
*/
public void persist(Object entity);
/*
* Transforms a detached entity (an entity that was managed by a Persistence
* Context at some point) into a transient one
*/
public <T> T merge(T entity);
/*
* Removes the entity from database at the next flush() operation
*/
public void remove(Object entity);
/*
* Synchronizes the Persistence Context with the underlying database
*/
public void flush();
- ์กฐํ : find(Member.class, memberId)
- ์ ์ฅ : persist(member)
- ์์ : member.setName("๋ณ๊ฒฝํ ์ด๋ฆ")
- ์ญ์ : remove(member)
- ๋ณํฉ(์ค์์ → ์์) : merge(detachedMember)
- ์ฆ์ DB ๋ฐ์ : flush()
๊ทธ๋ฌ๋ฉด Hibernate๋ ๋ฌด์์ผ๊น ? ๐ค
๐Hibernate
Hibernate๋ JPA (Java Persistence API) ๋ช
์ธ์ ๋ํ์ ์ธ ๊ตฌํ์ฒด ์ค ํ๋์ด๋ค.
javax.persistence.EntityManager์ ๊ฐ์ JPA์ ํต์ฌ ์ธํฐํ์ด์ค๋ค์ ์ง์ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, JPA๊ฐ ์ ์ํ ํ์ค ๋ฐฉ์์ ๋ฐ๋ผ ๋์ํ๋ค.
JPA์ Hibernate์ ๊ด๊ณ๋ ์๋ฐ์ interface์ ์ด๋ฅผ ๊ตฌํํ class์ ๊ด๊ณ์ ์ ์ฌํ๋ค.
์ ๊ทธ๋ฆผ์ JPA์ Hibernate ๊ฐ์ ์์ ๋ฐ ๊ตฌํ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
JPA์ ํต์ฌ ์ธํฐํ์ด์ค์ธ EntityManagerFactory, EntityManager, EntityTransaction์ Hibernate์์ ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋๋ค.
- EntityManagerFactory → SessionFactory
- EntityManager → Session
- EntityTransaction → Transaction
Hibernate๋ ์ด ํด๋์ค๋ค์ ์์ํ๊ณ ๋ด๋ถ์ ์ผ๋ก Impl ํด๋์ค๋ค๋ก ๊ตฌํํ๋ค.
Hibernate๋ JPA์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ฉฐ, ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ ๊ฐ๋ฐ์๊ฐ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ์ง ์๋๋ก ๋์์ค๋ค.
๊ทธ๋ ๋ค๋ฉด Hibernate๋ ํ์์ผ๊น ? ๐ค
Hibernate๋ JPA์ ๊ตฌํ์ฒด ์ค ํ๋์ผ ๋ฟ, JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฐ๋์ Hibernate๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
๋ง์ฝ Hibernate์ ์๋ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์๋๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ค๋ฅธ JPA๋ก ๊ตฌํ์ฒด๋ค์ ์ฌ์ฉํ ์ ์๋ค.
- EclipseLink
- DataNucleus
- OpenJPA
- ๋๋ ์ง์ ๊ตฌํํ JPA๋ ๊ฐ๋ฅ
๐ Hibernate ์๋ ๋ฐฉ์ ๊ฐ๋ตํ๊ฒ ๋ณด๊ธฐ
- Configuration ์ค์
- Session ์์ฑ
- ํธ๋์ญ์ ์์
- CRUD ์์ ์ํ
- DB ๋ฐ์
- ํธ๋์ญ์ ์ข ๋ฃ & ์ธ์ ์ข ๋ฃ
์ ๋๋ถ๋ถ Hibernate๋ฅผ ์ฌ์ฉํ ๊น? ๐ค
Hibernate๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ตฌํ์ฒด๋ก, ์ค๋ ์๊ฐ ๋์ ์ฌ์ฉ๋๋ฉด์ ๊ฒ์ฆ๋ ์ฑ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
ํ๋ถํ ๊ธฐ๋ฅ, ์์ ์ฑ, ๋ฌธ์ํ, ๊ทธ๋ฆฌ๊ณ Spring Framework์์ ๋์ ํธํ์ฑ ๋๋ถ์ ์ฌ์ค์ JPA์ ํ์ค ๊ตฌํ์ฒด์ฒ๋ผ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
๐JDBC (Java Database Connectivity)
JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์๋๋ก ์๋ฐ์์ ์ ๊ณตํ๋ API์ด๋ค.
Hibernate๋ ๋ด๋ถ์ ์ผ๋ก JDBC๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๋ค.
JDBC๋ ์ง์ ์ ์ธ SQL ์ฝ๋ ์์ฑ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ง๋ง, Hibernate๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํตํด ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ SQL์ ์ง์ ์์ฑํ์ง ์๊ณ ํ ์ ์๋๋ก ๋์์ค๋ค.
Spring์ผ๋ก ๊ฐ๋ฐ์ ํ๋ฉด์ EntityManager๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค๋ ์ ์์ ์๋ฌธ์ด ๋ค ์ ์๋ค.
๊ทธ ์ด์ ๋ ๋๋ถ๋ถ์ DB ์ ๊ทผ ์์ ์ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ , Repository๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด Repository ๊ฐ๋ ์ด ๋ฐ๋ก Spring Data JPA์ ํต์ฌ์ด๋ค.
๐Spring Data JPA
Spring Data JPA๋ Spring์์ ์ ๊ณตํ๋ ๋ชจ๋ ์ค ํ๋๋ก, ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ๋ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
๊ธฐ์กด JPA๋ EntityManager๋ฅผ ์ง์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํด์ผ ํ์ง๋ง, Spring Data JPA๋ ์ด๋ฅผ ํ ๋จ๊ณ ๋ ์ถ์ํํ Repository ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
Spring Data JPA๊ฐ JPA๋ฅผ ์ถ์ํํ๋ค๋ ๋ง์, ๋ด๋ถ์ ์ผ๋ก๋ ์ฌ์ ํ EntityManager๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ฐ๋ฐ์๋ ์ด๋ฅผ ์ง์ ๋ค๋ฃจ์ง ์๊ณ Repository๋ง ์ ์ํ๋ฉด ๋๋ค๋ ๋ป์ด๋ค. ์ฌ์ฉ์๊ฐ Repository ์ธํฐํ์ด์ค์ ๊ท์น์ ๋ง๊ฒ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด, Spring์ด ํด๋น ๋ฉ์๋ ์ด๋ฆ์ ์๋ง์ ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด Bean์ผ๋ก ๋ฑ๋กํด์ค๋ค.
Spring ํ๋ก์ ํธ์์ Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Hibernate๊ฐ JPA์ ๊ตฌํ์ฒด๋ก ๋ฑ๋ก๋์ด ๋์ํ๋ค. ์ด ๋๋ถ์ ๊ฐ๋ฐ์๋ Hibernate๋ JPA์ ์ธ๋ถ API๋ฅผ ์ง์ ๋ค๋ฃจ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ํ, Repository ๋ฉ์๋์ ๋ค์ด๋ฐ ๊ท์น์ ๋ฐ๋ผ Spring์ด ์ฟผ๋ฆฌ๋ฅผ ์๋ ์์ฑํ๋ฏ๋ก, ๋ฐ๋ณต์ ์ SQL ์์ฑ ์์ด๋ ๋ฐ์ดํฐ ์กฐํ ๋ฐ ์กฐ์ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๐ ์ ๋ฆฌํ์๋ฉด Spring Data JPA → JPA → Hibernate → JDBC → DB ์ด๋ ๊ฒ ๊ณ์ธต์ ์ผ๋ก ๋์ํ๋ค.
๐งฉ Spring Data JPA ์์
1. ๋ชจ๋ ์ํฐํฐ ์กฐํ .findAll()
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAll() {
return userRepository.findAll();
}
}
2. ํน์ id๋ฅผ ๊ฐ์ง ์ํฐํฐ ์กฐํ .findById(Long id)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Optional<User> findById(Long id) {
return userRepository.findById(id);
}
}
3. ํน์ ์ด๋ฆ์ผ๋ก ์ํฐํฐ ์กฐํ .findByName(String name)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findByName(String name) {
return userRepository.findByName(name);
}
}
4. ์ํฐํฐ ์ ์ฅ .save()
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User save(User user) {
return userRepository.save(user);
}
}
5. ์ํฐํฐ ์ ๋ฐ์ดํธ .update()
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User update(User user) {
return userRepository.save(user);
}
}
6. ์ํฐํฐ ์ญ์ .delete()
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void delete(User user) {
userRepository.delete(user);
}
}
7. ํ์ด์ง๋ค์ด์ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ํฐํฐ ์กฐํ
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Page<User> findAll(Pageable pageable) {
return userRepository.findAll(pageable);
}
}
8. ์ ๋ ฌ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ํฐํฐ ์กฐํ
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAll(Sort sort) {
return userRepository.findAll(sort);
}
}
๐ญ Q&A
Q : JPA์ Spring Data JPA์ ์ฐจ์ด์ ์ ?
A : JPA๋ ORM์ ์ํ ํ์ค ๋ช ์ธ๋ก, EntityManager๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ๋ค๋ค์ผ ํ๋ฉฐ Hibernate ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ํ์ํ๋ค. ๋ฐ๋ฉด Spring Data JPA๋ JPA ์์ ๊ตฌ์ถ๋ Spring ๋ชจ๋๋ก, ๊ฐ๋ฐ์๊ฐ Repository ์ธํฐํ์ด์ค๋ง ์ ์ํ๋ฉด CRUD ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
๐ reference
'Computer Science' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์์ฒด์ ] ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ (0) | 2025.04.13 |
---|---|
[์ด์์ฒด์ ] ์ด์์ฒด์ (OS, Operating System) (0) | 2025.03.24 |
Java (0) | 2024.08.30 |
Spring & Spring Boot (0) | 2024.08.15 |