π
2024λ
01μ 17μΌ
45μΌμ°¨ : Spring (5)
Spring + JPA + MariaDB
@Repository
public class MemberJpaRepository implements MemberRepository {
private EntityManager entityManager;
public MemberJpaRepository(EntityManager entityManager){
this.entityManager = entityManager;
}
@Override
public List<Member> findAll() {
List<Member> members = entityManager
.createQuery("select m from Member m", Member.class)
.getResultList();
return members;
}
@Override
public Member save(Member member) {
entityManager.persist(member);
return member;
}
@Override
public Optional<Member> findById(long id) {
Member member = entityManager.find(Member.class, id);
return Optional.ofNullable(member);
}
@Override
public void delete(Member member) {
}
@Override
public void deleteById(long id) {
}
public List<Member> findByName(String name) {
List<Member> members = entityManager.createQuery(
"select m from Member m where m.name = :name" , Member.class
)
.setParameter("name", name)
.getResultList();
return members;
}
}
1. μλ DDL μμ± (ν
μ΄λΈ μμ±):
JPAλ μν°ν° ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ ν
μ΄λΈμ μλμΌλ‘ μμ±νλ€.
μν°ν° ν΄λμ€μ νλμ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ μ»¬λΌ κ°μ 맀ν μ 보λ₯Ό νμ©νμ¬ ν
μ΄λΈμ΄ μμ±λλ€.
hibernate.hbm2ddl.autoμ κ°μ μμ±μ μ€μ νμ¬ DDL μμ±μ μ‘°μ ν μ μλ€.
2. μλ DML μ€ν (λ°μ΄ν° μ‘°μ):
JPAλ μν°ν° κ°μ²΄μ μν λ³νλ₯Ό κ°μ§νκ³ , λ°μ΄ν°λ² μ΄μ€μ λ°μνλ DML(SQL)μ μλμΌλ‘ μμ±νκ³ μ€ννλ€.
νΈλμμ
μ»€λ° μμ μ λ³κ²½λ μν°ν° κ°μ²΄μ λν DMLμ΄ λ°μ΄ν°λ² μ΄μ€μ μλμΌλ‘ λ°μλλ€.
κ°λ°μλ λ³λμ SQLμ μμ±νμ§ μμλ μν°ν° κ°μ²΄λ₯Ό μ‘°μνμ¬ λ°μ΄ν°λ² μ΄μ€μ λκΈ°νν μ μλ€.
3. κ°μ²΄ 쑰립:
JPAλ μν°ν° ν΄λμ€μ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈ κ°μ 맀ν μ 보λ₯Ό νμ©νμ¬ νμν SQLμ μλμΌλ‘ μμ±νκ³ μ€ννλ€.
μν°ν° κ°μ²΄λ μμμ± μ»¨ν
μ€νΈμμ κ΄λ¦¬λλ©°, νμμ λ°λΌ λ°μ΄ν°λ² μ΄μ€μ λκΈ°νλλ€.
κ°μ²΄ μ§ν₯μ μΈ μ½λλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό λ€λ£° μ μλ€.
- EntityManager
EntityManagerμ JPA(Java Persistence API)μμ μ 곡νλ μΈν°νμ΄μ€λ‘, μν°ν°(Entity) κ°μ²΄μ μμμ±μ κ΄λ¦¬νλ μν μ νλ€.
Entity, DTO, DAO, VO
μ©μ΄ | μ€λͺ
| μ£Όμ νΉμ§ λ° μν |
---|
VO | Value Object (κ° κ°μ²΄) | λΆλ³νλ©° μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μμ μ¬μ©λλ κ° κ°μ²΄ |
DTO | Data Transfer Object (λ°μ΄ν° μ μ‘ κ°μ²΄) | λ°μ΄ν° μ μ‘μ μν κ°μ²΄λ‘, μ£Όλ‘ ν΄λΌμ΄μΈνΈμ μλΉμ€ κ°μ λ°μ΄ν° μ μ‘μ μ¬μ© |
DAO | Data Access Object (λ°μ΄ν° μ‘μΈμ€ κ°μ²΄) | λ°μ΄ν°λ² μ΄μ€ μ‘μΈμ€λ₯Ό λ΄λΉνλ©° μ£Όλ‘ CRUD μ°μ°μ μν |
Repository | μ€κ° κ³μΈ΅μΌλ‘ λ°μ΄ν° μ‘μΈμ€λ₯Ό μΆμννκ³ λΉμ¦λμ€ λ‘μ§κ³Ό λ°μ΄ν°λ² μ΄μ€ κ°μ κ²°ν©μ μ€μ | ν΄λΌμ΄μΈνΈμ λ°μ΄ν°λ² μ΄μ€ κ°μ μ€μ¬ μν μ μν |
Entity | λ°μ΄ν°λ² μ΄μ€μμ μ€μ λ°μ΄ν°λ₯Ό λνλ΄λ κ°μ²΄ | λ°μ΄ν°λ² μ΄μ€μ ν
μ΄λΈκ³Ό 맀νλλ©° μ£Όλ‘ λ°μ΄ν°λ₯Ό λνλ΄λ κ°μ²΄ |
| μ€λͺ
| 곡ν΅μ | μ°¨μ΄μ |
---|
Entity | λ°μ΄ν°λ² μ΄μ€μμ μ€μ λ°μ΄ν°λ₯Ό λνλ΄λ κ°μ²΄ | λ°μ΄ν°λ₯Ό νννλ€. | μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μ λ΄μ§ μμ. |
VO | λΆλ³νλ©° μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μμ μ¬μ©λλ κ° κ°μ²΄ | λ°μ΄ν°λ₯Ό νννλ©° λΆλ³μ±μ κ°μ§λ€. | μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μμ μ¬μ©λλ©° λΆλ³μ±μ κ°μ‘°νλ€. |
| μ€λͺ
| 곡ν΅μ | μ°¨μ΄μ |
---|
Repository | λ°μ΄ν° μ‘μΈμ€λ₯Ό μΆμννκ³ λΉμ¦λμ€ λ‘μ§κ³Ό λ°μ΄ν°λ² μ΄μ€ κ°μ κ²°ν©μ μ€μ | λ°μ΄ν° μ‘μΈμ€λ₯Ό λ΄λΉνλ©° μ€μ¬ μν μ νλ€. | λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μΆμννκ³ , λ°μ΄ν°λ² μ΄μ€μ λν μμ‘΄μ±μ μ΅μννλ€. |
DAO | λ°μ΄ν°λ² μ΄μ€ μ‘μΈμ€λ₯Ό λ΄λΉνλ©° μ£Όλ‘ CRUD μ°μ°μ μν | λ°μ΄ν° μ‘μΈμ€λ₯Ό λ΄λΉνλ€. | μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€μμ μνΈμμ©μ μ΄μ μ λ§μΆλ©°, λ°μ΄ν° μ‘μΈμ€ λ‘μ§μ μ²λ¦¬νλ€. |
@Transactional
νΉμ§ | μ€λͺ
|
---|
μμμ± (Atomicity) | νΈλμμ
μ λͺ¨λ μμ
μ΄ μ±κ³΅μ μΌλ‘ μλ£λκ±°λ, νλλ μνλμ§ μμ μνλ‘ μ μ§λμ΄μΌ νλ€. |
μΌκ΄μ± (Consistency) | νΈλμμ
μ΄ μλ£λ νμλ λ°μ΄ν°λ² μ΄μ€λ μΌκ΄λ μνλ₯Ό μ μ§ν΄μΌ νλ€. |
κ³ λ¦½μ± (Isolation) | μ¬λ¬ νΈλμμ
μ΄ λμμ μ€νλ λ κ° νΈλμμ
μ λ€λ₯Έ νΈλμμ
μ μν₯μ μ£Όμ§ μκ³ λ
립μ μΌλ‘ μ€νλμ΄μΌ νλ€. |
μ§μμ± (Durability) | νΈλμμ
μ΄ μ±κ³΅μ μΌλ‘ μλ£λ νμλ κ·Έ κ²°κ³Όκ° μꡬμ μΌλ‘ λ°μλμ΄μΌ νλ©°, μμ€ν
μ₯μ μλ 볡ꡬ κ°λ₯ν΄μΌ νλ€. |
μ°μ° | μ€λͺ
|
---|
νΈλμμ
μμ (Begin) | νΈλμμ
μ°μ°μ νΈλμμ
μ λͺ
μμ μΌλ‘ μμν΄μΌ ν©λλ€. |
μμ
μν (Execute) | νΈλμμ
λ΄μμ μμμ μΈ μμ
λ€μ μνν©λλ€. κ° μμ
μ μ±κ³΅ λλ μ€ν¨λ‘ μλ£λ©λλ€. |
νΈλμμ
μ’
λ£ (Commit/Rollback) | νΈλμμ
μ μλ£λ νμ λͺ
μμ μΌλ‘ 컀λ°(Commit) λλ λ‘€λ°±(Rollback)λμ΄μΌ ν©λλ€. |
- μ»€λ° (Commit):
νΈλμμ
μ μ±κ³΅μ μΈ μλ£λ₯Ό μλ―Έ.
λͺ¨λ μμ
μ΄ μ μμ μΌλ‘ μ€νλμμ λ, νΈλμμ
μ κ²°κ³Όλ₯Ό μꡬμ μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ λ°μνκΈ° μν΄ μ»€λ°μ μν.
컀λ°μ΄ μνλλ©΄ νΈλμμ
μ μ’
λ£λκ³ , λ°μ΄ν°λ² μ΄μ€λ νΈλμμ
μ λ³κ²½ μ¬νμ λ°μνμ¬ μΌκ΄λ μνλ₯Ό μ μ§.
- λ‘€λ°± (Rollback):
νΈλμμ
μ μ€ν¨ λλ μμΈ λ°μ μ νΈλμμ
μ μ·¨μνκ³ μ΄μ μνλ‘ λλλ¦°λ€.
μ΄λ€ μ΄μ λ‘λ νΈλμμ
μ μ€λ¨νκ³ μ΄μ μ μΌκ΄λ μνλ‘ λμκ°μΌ ν λ μ¬μ©.
λ‘€λ°±μ μννλ©΄ νΈλμμ
μ λ³κ²½ μ¬νμ΄ λͺ¨λ μ·¨μλκ³ , λ°μ΄ν°λ² μ΄μ€λ νΈλμμ
μ΄μ μ μνλ‘ λμκ°κ² λλ€.
- @Transactionalμ μ€νλ§ νλ μμν¬μμ μ 곡νλ μ΄λ
Έν
μ΄μ
μΌλ‘, νΈλμμ
μ κ΄λ¦¬νλλ° μ¬μ©
1. νΈλμμ
λ²μ μ€μ :
@Transactionalμ λ©μλλ ν΄λμ€μ μ μ© κ°λ₯νλ©°, λ©μλμ μ μ©ν κ²½μ° ν΄λΉ λ©μλλ νΈλμμ
λ²μ λ΄μμ μ€νλλ€.
ν΄λμ€μ μ μ©ν κ²½μ° ν΄λμ€μ λͺ¨λ λ©μλλ νΈλμμ
λ²μ λ΄μμ μνλλ€.
2. νΈλμμ
μμ± μ€μ :
@Transactional μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ νΈλμμ
μ μμ±μ μ€μ ν μ μμΌλ©°, 격리 μμ€, μ½κΈ° μ μ© μ¬λΆ, λ‘€λ°± κ·μΉ λ±μ μ€μ ν μ μλ€.
3. μμΈ μ²λ¦¬μ λ‘€λ°±:
νΈλμμ
λ΄μμ μμΈκ° λ°μνλ©΄ κΈ°λ³Έμ μΌλ‘ λ‘€λ°±λλ€. λ€μ λ§ν΄, νΈλμμ
λ΄μμ μμΈκ° λ°μνλ©΄ μ΄μ μνλ‘ λ‘€λ°±λμ΄ λ°μ΄ν°λ² μ΄μ€μ μ ν리μΌμ΄μ
μνλ₯Ό μΌκ΄μ± μκ² μ μ§νλ€.
4. νΈλμμ
κ΄λ¦¬μμ ν΅ν©:
@Transactionalμ μ€νλ§μ νΈλμμ
κ΄λ¦¬μμ ν΅ν©λμ΄ λμνλ€. μ΄ μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ νΈλμμ
μ μμ, 컀λ°, λ‘€λ°±νλ λ° νμν λͺ¨λ κ΄λ¦¬ μμ
μ μ€νλ§μ΄ μννλ€.
5. μ€μ μ΅μ
:
@Transactional μ΄λ
Έν
μ΄μ
μ μ€μ μ΅μ
μ ν΅ν΄ νΈλμμ
μ λμμ μΈλ°νκ² μ‘°μ ν μ μλ€. μλ₯Ό λ€μ΄, νΉμ μμΈμ λν λ‘€λ°± μ μ±
, νμμμ, μ½κΈ° μ μ© νΈλμμ
λ±μ μ€μ ν μ μλ€.
Spring μ€μ΅ github λ§ν¬