π[Backend Development] Java Spring νλ μμν¬μ κ³μΈ΅ - Data Access Layer (λ°μ΄ν° μ κ·Ό κ³μΈ΅)
β Data Access Layer (λ°μ΄ν° μ κ·Ό κ³μΈ΅)
Data Access Layerλ λΉμ¦λμ€ λ‘μ§κ³Ό λ°μ΄ν°λ² μ΄μ€λ₯Ό λΆλ¦¬νμ¬ μμ€ν μ μ μ°νκ³ νμ₯ κ°λ₯νκ² λ§λ€κΈ° μν΄ μ¬μ©ν©λλ€.
-
μ£Όμ μ»΄ν¬λνΈ :
@Repository
- μν : λ°μ΄ν°λ² μ΄μ€(DB)μ μ§μ μ κ·Όνμ¬ λ°μ΄ν°λ₯Ό CRUD(Create, Read, Update, Delete)νλ μν μ λ΄λΉν©λλ€.
- μ€λͺ : λΉμ¦λμ€ λ‘μ§κ³Ό λ°μ΄ν°λ² μ΄μ€ μ¬μ΄μ λ€λ¦¬ μν μ ν©λλ€. JPA(Java Persistence API)μ κ°μ κΈ°μ μ μ¬μ©νμ¬ SQL 쿼리λ₯Ό μ§μ λ€λ£¨κ³ , λ°μ΄ν°μ μμμ±(Persistence)μ κ΄λ¦¬ν©λλ€.
β 1. JPA (Java Persistence API)
JPAλ μλ° μ ν리μΌμ΄μ μμ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ λ°©μμ μ μν βλͺ μΈβ λλ βκ·μΉβ μ λλ€.
-
κ°λ : κ°λ°μκ° μ§μ SQL 쿼리λ₯Ό μμ±νλ λμ , μΌλ° μλ° κ°μ²΄(Object)λ₯Ό λ€λ£¨λ―μ΄ μ½λλ₯Ό μ§λ©΄ JPAκ° μμμ μ μ ν SQLμ μμ±νμ¬ λ°μ΄ν°λ² μ΄μ€μ ν΅μ ν©λλ€. μ΄μ²λΌ κ°μ²΄μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μλμΌλ‘ μ°κ²°ν΄μ£Όλ κΈ°μ μ ORM(Object-Relational Mapping) μ΄λΌκ³ νλ©°, JPAλ μ΄ ORM κΈ°μ μ νμ€ κ·κ²©μ λλ€.
-
μν : SQL μ€μ¬μ κ°λ°μμ κ°μ²΄ μ€μ¬μ κ°λ°λ‘ μ ννμ¬, κ°λ°μκ° λΉμ¦λμ€ λ‘μ§μ λ μ§μ€ν μ μκ² λμμ€λλ€. κ°μ₯ μ λͺ ν JPA ꡬν체λ‘λ νμ΄λ²λ€μ΄νΈ(Hibernate) κ° μμ΅λλ€.
π λΉμ : JPAλ βμλ λ²μκΈ°βμ κ°μ΅λλ€. κ°λ°μλ βμλ° κ°μ²΄βλΌλ μΈμ΄λ‘ λ§νλ©΄, JPAκ° βSQLβμ΄λΌλ μΈμ΄λ‘ λ²μνμ¬ λ°μ΄ν°λ² μ΄μ€μ μν΅νκ³ κ·Έ κ²°κ³Όλ₯Ό λ€μ βμλ° κ°μ²΄βλ‘ λ²μν΄μ λλ €μ€λλ€.
β 2. λ°μ΄ν°μ μμμ± (Persistence)
μμμ±μ λ°μ΄ν°κ° νλ‘κ·Έλ¨μ΄ μ’ λ£λμ΄λ μ¬λΌμ§μ§ μκ³ μꡬμ μΌλ‘ μ μ₯μμ λ¨μμλ νΉμ±μ μλ―Έν©λλ€.
- μΌλ°μ κ°λ : μ ν리μΌμ΄μ μ κ»λ€ μΌλ λ°μ΄ν°κ° κ·Έλλ‘ λ¨μμλ μνλ₯Ό λ§ν©λλ€. μ΄λ¬ν μμμ±μ 보μ₯νκΈ° μν΄ λ°μ΄ν°λ² μ΄μ€, νμΌ μμ€ν λ±μ μ¬μ©ν©λλ€.
-
JPAμμμ κ°λ
(μμμ± μ»¨ν
μ€νΈ) : JPAμμλ μ‘°κΈ λ ꡬ체μ μΈ μλ―Έλ‘ μ¬μ©λ©λλ€. βμμμ± μ»¨ν
μ€νΈ(Persistence Context)β λ JPAκ° μν°ν°(Entity) κ°μ²΄λ€μ κ΄λ¦¬νλ κ°μμ 곡κ°(μΊμ)μ
λλ€.
- λ°μ΄ν°λ² μ΄μ€μμ μ‘°ννκ±°λ μ μ₯ν μν°ν°λ μ΄ μμμ± μ»¨ν μ€νΈμ λ€μ΄κ°λλ€.
- μΌλ¨ μμμ± μ»¨ν μ€νΈμ λ€μ΄μ¨ κ°μ²΄λ JPAκ° κ³μ μΆμ νλ©° λ³νλ₯Ό κ°μ§ν©λλ€.
- νΈλμμ μ΄ λλλ μμ μ, JPAλ μμμ± μ»¨ν μ€νΈ μμμ λ³κ²½λ κ°μ²΄λ€μ κ°μ§νμ¬ μλμΌλ‘ UPDATE 쿼리λ₯Ό λ λ € λ°μ΄ν°λ² μ΄μ€μ κ·Έ λ³κ²½μ¬νμ λ°μν©λλ€. μ΄ κ³Όμ μ ν΅ν΄ λ°μ΄ν°μ μμμ±μ΄ μ μ§λ©λλ€.
β 3. Data Access Layerλ μΈμ μ¬μ©νλμ?
μ ν리μΌμ΄μ
μ λ°μ΄ν°λ₯Ό μꡬ μ μ₯μ(μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€)μ μ μ₯νκ±°λ μ‘°ννλ λͺ¨λ μμ
μ μ¬μ©λ©λλ€.
λΉμ¦λμ€ κ³μΈ΅(Service
)μ΄ λ°μ΄ν° μ²λ¦¬λ₯Ό μμ²νλ©΄, μ΄ κ³μΈ΅μ΄ μ€μ§μ μΈ λ°μ΄ν°λ² μ΄μ€ ν΅μ μ λ΄λΉν©λλ€.
β 4. Data Access Layerλ μ΄λμ μ¬μ©νλμ?
μ ν리μΌμ΄μ
μν€ν
μ²μ κ°μ₯ μμͺ½, λ°μ΄ν°λ² μ΄μ€μ κ°μ₯ κ°κΉμ΄ κ³³μ μμΉν©λλ€.
λΉμ¦λμ€ κ³μΈ΅(Service
)μ μμ²μ λ°μ λ°μ΄ν°λ² μ΄μ€μ μ§μ μνΈμμ©νλ μ΅μ μ μν μ μνν©λλ€.
β 5. Data Access Layerλ μ΄λ»κ² μ¬μ©νλμ?
μ£Όλ‘ @Repository
μ΄λ
Έν
μ΄μ
μ λΆμΈ μΈν°νμ΄μ€λ ν΄λμ€λ‘ ꡬνν©λλ€.
νΉν Spring Data JPAλ₯Ό μ¬μ©νλ©΄, JpaRepository
μ κ°μ μΈν°νμ΄μ€λ₯Ό μμλ°λ κ²λ§μΌλ‘λ κΈ°λ³Έμ μΈ CRUD κΈ°λ₯μ΄ κ΅¬νλμ΄ λ§€μ° νΈλ¦¬νκ² μ¬μ©ν μ μμ΅λλ€.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// μ΄λ©μΌλ‘ μ¬μ©μλ₯Ό μ°Ύλ 컀μ€ν
λ©μλ
Optional<User> findByEmail(String email);
}
β 6. Data Access Layerλ μ μ¬μ©νλμ?
κ°μ₯ μ€μν μ΄μ λ λ°μ΄ν° μ κ·Ό κΈ°μ μ μΊ‘μνμ κ΄μ¬μ¬μ λΆλ¦¬μ λλ€.
-
μ μ°μ λ° νμ₯μ± : λμ€μ λ°μ΄ν°λ² μ΄μ€λ₯Ό MySQLμμ Oracleμ΄λ λ€λ₯Έ μ’ λ₯λ‘ λ³κ²½νλλΌλ, λΉμ¦λμ€ λ‘μ§ μ½λλ μ ν μμ ν νμ μμ΄ μ΄ Data Access Layerμ ꡬνλ§ λ°κΎΈλ©΄ λ©λλ€.
-
μ μ§λ³΄μ μ©μ΄μ± : λ°μ΄ν°λ² μ΄μ€μ κ΄λ ¨λ λͺ¨λ μ½λκ° νκ³³μ λͺ¨μ¬μμ΄, SQL 쿼리 μ΅μ νλ ν μ΄λΈ ꡬ쑰 λ³κ²½ μ μμ ν λΆλΆμ μ°ΎκΈ° μ½κ³ κ΄λ¦¬κ° μ©μ΄ν©λλ€.
-
μν λΆλ¦¬ : λΉμ¦λμ€ κ³μΈ΅μ β무μμ ν μ§βμλ§ μ§μ€νκ³ , λ°μ΄ν° μ κ·Ό κ³μΈ΅μ βμ΄λ»κ² λ°μ΄ν°λ₯Ό κ°μ Έμ¬μ§βμλ§ μ§μ€νκ² νμ¬ μ½λμ κ°λ μ±κ³Ό λͺ νμ±μ λμ λλ€.
β
@Repository
@Repository
λ λ°μ΄ν°λ² μ΄μ€μ μ§μ μ κ·Όνλ ν΄λμ€(DAO)μ μ¬μ©λλ©°, μμΈλ₯Ό μ€νλ§μ μΌκ΄λ λ°©μμΌλ‘ λ³νν΄μ£Όλ μν μ ν©λλ€.
β
1. @Repository
λ μΈμ μ¬μ©λλμ?
λ°μ΄ν°λ² μ΄μ€μ μ§μ ν΅μ νμ¬ λ°μ΄ν°λ₯Ό CRUD(μμ±, μ‘°ν, μμ , μμ )νλ κ°μ²΄λ₯Ό λ§λ€ λ μ¬μ©ν©λλ€.
μ£Όλ‘ λ°μ΄ν°λ² μ΄μ€μ ν
μ΄λΈμ μ κ·Όνλ DAO(Data Access Object) ν΄λμ€λ μΈν°νμ΄μ€μ μ μ©λ©λλ€.
β
2. @Repository
λ μ΄λμ μ¬μ©λλμ?
μ ν리μΌμ΄μ
μν€ν
μ²μ Data Access Layer(λ°μ΄ν° μ κ·Ό κ³μΈ΅)μμ μ¬μ©λ©λλ€.
μ΄ κ³μΈ΅μ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ Service
κ³μΈ΅κ³Ό μ€μ λ°μ΄ν°λ² μ΄μ€ μ¬μ΄μμ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μν μ λ΄λΉν©λλ€.
β
3. @Repository
λ μ΄λ»κ² μ¬μ©λλμ?
ν΄λμ€λ μΈν°νμ΄μ€ μ μΈλΆ μμ @Repository
μ΄λ
Έν
μ΄μ
μ λΆμ¬μ£ΌκΈ°λ§ νλ©΄ λ©λλ€.
νΉν Spring Data JPAλ₯Ό μ¬μ©νλ©΄, JpaRepository
μΈν°νμ΄μ€λ₯Ό μμλ°λ κ²λ§μΌλ‘λ μλμΌλ‘ Repositoryλ‘ λ±λ‘λμ΄ κΈ°λ³Έμ μΈ CRUD λ©μλλ₯Ό λ°λ‘ μ¬μ©ν μ μμ΅λλ€.
// μ΄ μΈν°νμ΄μ€κ° λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνλ Repositoryμμ μ μΈν©λλ€.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// JpaRepositoryλ₯Ό μμλ°μΌλ©΄ κΈ°λ³Έμ μΈ CRUD(save, findById, findAll, delete λ±)
// λ©μλκ° μλμΌλ‘ μ 곡λ©λλ€.
// λ©μλ μ΄λ¦μ κ·μΉμ λ§κ² μμ±νλ©΄, Spring Data JPAκ° μμμ
// 쿼리λ₯Ό μμ±ν΄μ€λλ€. (μ: μ΄λ©μΌλ‘ μ¬μ©μ μ°ΎκΈ°)
Optional<User> findByEmail(String email);
}
β
4. @Repository
λ μ μ¬μ©λλμ?
@Repository
λ₯Ό μ¬μ©νλ μ£Όλ μ΄μ λ λ κ°μ§μ
λλ€.
- μν λͺ μ (μ½λ κ°λ μ±) : μ΄ ν΄λμ€κ° βλ°μ΄ν° μ μ₯μμ μ κ·Όνλ κ°μ²΄β μμ λͺ ννκ² λνλ λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ ν΄λμ€μ μν μ μ½κ² νμ ν μ μμ΅λλ€.
-
μμΈ λ³ν (Exception Translation) :
@Repository
μ κ°μ₯ μ€μν κΈ°λ₯μ λλ€. λ°μ΄ν°λ² μ΄μ€λ§λ€ λ°μνλ μμΈ(e.g, MySQLμMySQLIntegrityConstraintViolationException
)κ° λ€λ¦ λλ€.@Repository
κ° λΆμ΄ μμΌλ©΄, μ€νλ§μ΄ μ΄λ¬ν νΉμ κΈ°μ μ μ’ μμ μΈ μμΈλ€μ μ€νλ§μ μΌκ΄λ μμΈ κ³μΈ΅μΈDataAccessException
μΌλ‘ λ³νν΄μ€λλ€. λλΆμ κ°λ°μλ λ°μ΄ν°λ² μ΄μ€ μ’ λ₯μ μκ΄μμ΄ μΌκ΄λ λ°©μμΌλ‘ μμΈλ₯Ό μ²λ¦¬ν μ μμ΅λλ€.