Home > Spring > πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Repository의 μ—­ν• .

πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Repository의 μ—­ν• .
Spring Framework

πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Repository의 μ—­ν• .

Java λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Repository 계측은 λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ κ΄€λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

RepositoryλŠ” λ°μ΄ν„°μ˜ CRUD(Create, Read, Update, Delete) μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ©°, 데이터λ₯Ό μ €μž₯μ†Œ(일반적으둜 λ°μ΄ν„°λ² μ΄μŠ€)μ—μ„œ κ°€μ Έμ˜€κ³ , μˆ˜μ •ν•˜λ©°, μ‚­μ œν•˜λŠ” κΈ°λŠ₯을 μΊ‘μŠν™”ν•©λ‹ˆλ‹€.

이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ 데이터 접근을 λΆ„λ¦¬ν•˜κ³ , μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν…ŒμŠ€νŠΈ κ°€λŠ₯성을 λ†’μž…λ‹ˆλ‹€.

1️⃣ Repository κ³„μΈ΅μ˜ μ£Όμš” μ—­ν• .

1. λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό 관리.

  • RepositoryλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ μ€‘κ°œμž 역할을 ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€λ‘œλΆ€ν„° 데이터λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜, 데이터λ₯Ό μ €μž₯, μˆ˜μ •, μ‚­μ œν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  데이터 μ ‘κ·Ό λ‘œμ§μ€ Repository κ³„μΈ΅μ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

2. CRUD μž‘μ—… 처리.

  • RepositoryλŠ” μ—”ν‹°ν‹°μ˜ 생λͺ…μ£ΌκΈ° μ „λ°˜μ— 걸친 CRUD μž‘μ—…μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • Java의 JPAλ‚˜ Hibernate 같은 ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•΄ 객체와 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 맀핑을 μžλ™μœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, save, findById, deleteById λ“±μ˜ λ©”μ„œλ“œλ₯Ό 톡해 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ±°λ‚˜ μ‘°νšŒν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

3. 데이터 쿼리 처리.

  • Repository 계측은 데이터λ₯Ό μ‘°νšŒν•˜κΈ° μœ„ν•΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쿼리λ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • Spring Data JPA와 같은 ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ©΄ 쿼리 λ©”μ„œλ“œλ₯Ό κ°„νŽΈν•˜κ²Œ μ •μ˜ν•  수 있으며, λ³΅μž‘ν•œ 쑰건 검색을 μœ„ν•œ JPQL(Java Persistence Query Language) λ˜λŠ” λ„€μ΄ν‹°λΈŒ SQL 쿼리λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 기본적인 쿼리 λ©”μ„œλ“œ 외에도 λ³΅μž‘ν•œ 쿼리λ₯Ό μž‘μ„±ν•˜μ—¬ νŠΉμ • 쑰건에 λ§žλŠ” 데이터λ₯Ό 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€.

4. λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 좔상화.

  • RepositoryλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό λ‘œμ§μ„ μΊ‘μŠν™”ν•˜μ—¬ μƒμœ„ 계측(Service λ“±)μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ꡬ체적인 λ™μž‘ 방식을 μ•Œ ν•„μš”κ°€ 없도둝 ν•©λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ μƒμœ„ κ³„μΈ΅μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ ꡬ쑰λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. λ°μ΄ν„°λ² μ΄μŠ€ 독립성.

  • Repositoryλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ ꡬ체적인 쒅속성을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„, Repository κ³„μΈ΅λ§Œ 적절히 μˆ˜μ •ν•˜λ©΄ μƒμœ„ κ³„μΈ΅μ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λ°μ΄ν„°λ² μ΄μŠ€ 독립성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6. 객체와 데이블 λ§€ν•‘ 관리

  • ORM을 μ‚¬μš©ν•΄ λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό 객체λ₯Ό λ§€ν•‘ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
  • 객체와 ν…Œμ΄λΈ” κ°„μ˜ 관계(1, N)λ₯Ό μ •μ˜ν•˜κ³ , μ΄λŸ¬ν•œ 관계λ₯Ό 기반으둜 λ°μ΄ν„°λ² μ΄μŠ€ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ μ½”λ“œ

Spring Data JPAλ₯Ό μ‚¬μš©ν•œ Repository κ³„μΈ΅μ˜ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    // 기본적으둜 JpaRepositoryμ—μ„œ μ œκ³΅ν•˜λŠ” CRUD λ©”μ„œλ“œλ“€
    // save, fundById, findAll, deleteById 등이 μ œκ³΅λ©λ‹ˆλ‹€.
    
    // μ»€μŠ€ν…€ 쿼리 λ©”μ„œλ“œ μ •μ˜
    Optional<User> findByEmail(String email);
    
    // λ³΅μž‘ν•œ JPQL 쿼리 λ©”μ„œλ“œ μ •μ˜ κ°€λŠ₯
    @Query("SELECT u FROM User u WHERE u.name = :name AND u.status = :status")
    List<User> findByNameAndStatus(@Param("name") String name, @Param("status") String status);
}

3️⃣ μ„€λͺ…

  • @Repository
    • Springμ—μ„œ 이 μΈν„°νŽ˜μ΄μŠ€κ°€ 데이터 μ—‘μ„ΈμŠ€ 계측을 λ‚˜νƒ€λ‚Έλ‹€λŠ” 것을 λͺ…μ‹œν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
    • @Repository μ–΄λ…Έν…Œμ΄μ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€ μ˜ˆμ™Έλ₯Ό Spring의 데이터 μ—‘μ„ΈμŠ€ μ˜ˆμ™Έλ‘œ λ³€ν™˜ν•˜λŠ” 역할도 ν•©λ‹ˆλ‹€.
  • JpaRepository<User, Long>
    • Spring Data JPAμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λ‘œ, User 엔티티와 Long νƒ€μž…μ˜ IDλ₯Ό μ‚¬μš©ν•΄ CRUD μž‘μ—…μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • κΈ°λ³Έ CRUD λ©”μ„œλ“œ
    • save, findById, deleteById λ“±μ˜ λ©”μ„œλ“œκ°€ 기본적으둜 μ œκ³΅λ©λ‹ˆλ‹€.
  • μ»€μŠ€ν…€ 쿼리 λ©”μ„œλ“œ
    • λ§€μ„œλ“œ λͺ…λͺ… κ·œμΉ™μ„ 톡해 μžλ™μœΌλ‘œ SQL 쿼리λ₯Ό μƒμ„±ν•˜λŠ” λ°©μ‹μœΌλ‘œ νŠΉμ • ν•„λ“œλ‘œ κ²€μƒ‰ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, findByEmail은 이메일을 κΈ°μ€€μœΌλ‘œ μ‚¬μš©μžλ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.
  • JPQL μ‚¬μš©
    • λ³΅μž‘ν•œ 쑰건이 ν•„μš”ν•œ 경우, @Query μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ JPQL을 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이 μ˜ˆμ‹œμ—μ„œλŠ” 이름과 μƒνƒœλ₯Ό 기반으둜 μ‚¬μš©μžλ₯Ό μ‘°νšŒν•˜λŠ” 쿼리λ₯Ό μ •μ˜ν–ˆμŠ΅λ‹ˆλ‹€.

4️⃣ Repository κ³„μΈ΅μ˜ 이점.

1. λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 데이터 μ ‘κ·Ό 둜직의 뢄리.

  • Repository 계측은 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λ°μ΄ν„°λ² μ΄μŠ€ 접근을 λͺ…ν™•νžˆ λΆ„λ¦¬ν•˜μ—¬ 각 계측이 μžμ‹ μ˜ μ—­ν™œμ—λ§Œ 집쀑할 수 있게 ν•©λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ ν•˜λ©΄ μ½”λ“œκ°€ 더 λͺ¨λ“ˆν™”λ˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

2. μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±.

  • Repository 계측은 λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό λ‘œμ§μ„ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.
  • μ—¬λŸ¬ μ„œλΉ„μŠ€μ—μ„œ λ™μΌν•œ λ°μ΄ν„°λ² μ΄μŠ€ μΏΌλ¦¬λ‚˜ 데이터λ₯Ό ν•„μš”λ‘œ ν•  λ•Œ, 이λ₯Ό μ€‘μ•™μ—μ„œ κ΄€λ¦¬ν•¨μœΌλ‘œμ¨ μ½”λ“œ 쀑볡을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

3. ν…ŒμŠ€νŠΈ κ°€λŠ₯μ„± ν–₯상.

  • Repository 계측을 μΈν„°νŽ˜μ΄μŠ€λ‘œ μ •μ˜ν•¨μœΌλ‘œμ¨ ν…ŒμŠ€νŠΈ μ‹œ Mock 객체둜 μ‰½κ²Œ λŒ€μ²΄ν•  수 μžˆμ–΄, λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Όν•˜μ§€ μ•Šκ³ λ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. λ°μ΄ν„°λ² μ΄μŠ€ λ³€κ²½μ˜ μœ μ—°μ„±.

  • λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ Repository κ³„μΈ΅λ§Œ μˆ˜μ •ν•˜λ©΄ μƒμœ„ 계측(Serviceλ‚˜ Controller)은 μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€ 독립성을 λ†’μ΄λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

5️⃣ κ²°λ‘ 

Repository 계측은 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” λͺ¨λ“  μž‘μ—…μ„ λ‹΄λ‹Ήν•˜λ©°, 데이터λ₯Ό μ €μž₯, 쑰회, μ—…λ°μ΄νŠΈ, μ‚­μ œν•˜λŠ” κΈ°λŠ₯을 μΊ‘μŠν™”ν•©λ‹ˆλ‹€.
이λ₯Ό 톡해 데이터 μ ‘κ·Ό 둜직이 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λΆ„λ¦¬λ˜λ―€λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μœ μ§€λ³΄μˆ˜μ„±, ν™•μž₯μ„±, μž¬μ‚¬μš©μ„±μ΄ 크게 ν–₯μƒλ©λ‹ˆλ‹€.