Home > Spring > πŸƒ[Spring] Repository νŒ¨ν„΄μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸƒ[Spring] Repository νŒ¨ν„΄μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Spring Framework

πŸƒ[Spring] Repository νŒ¨ν„΄μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • Repository νŒ¨ν„΄μ€ 데이터 μ ‘κ·Ό λ‘œμ§μ„ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)κ³Ό λΆ„λ¦¬ν•˜μ—¬, λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ‹€λ₯Έ μ €μž₯μ†Œμ™€μ˜ μƒν˜Έμž‘μš©μ„ μΊ‘μŠν™”ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‚˜λ¨Έμ§€ 뢀뢄이 λ°μ΄ν„°λ² μ΄μŠ€μ™€ 직접 μƒν˜Έμž‘μš©ν•˜λŠ” λŒ€μ‹  Repositoryλ₯Ό 톡해 데이터λ₯Ό μ €μž₯, 쑰회, μˆ˜μ •, μ‚­μ œ λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 λ˜μ–΄, μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ Repository νŒ¨ν„΄μ˜ μ£Όμš” κ°œλ….

1️⃣ 데이터 μ ‘κ·Ό 둜직의 μΊ‘μŠν™”.

  • λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ Repository 클래슀둜 κ°μ‹Έμ„œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
    • μ΄λ ‡κ²Œ ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‹€λ₯Έ λΆ€λΆ„μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ 직접 μƒν˜Έμž‘μš©ν•˜μ§€ μ•Šκ³ , Repository 클래슀λ₯Ό ν†΅ν•΄μ„œλ§Œ 데이터λ₯Ό λ‹€λ£¨κ²Œ λ©λ‹ˆλ‹€.
  • 이둜 인해 데이터 μ ‘κ·Ό 둜직과 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λΆ„λ¦¬λ˜μ–΄, μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ—λ„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ³  Repository만 μˆ˜μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

2️⃣ 데이터 μ†ŒμŠ€μ˜ 좔상화.

  • Repository νŒ¨ν„΄μ€ 데이터가 μ–΄λ””μ—μ„œ μ˜€λŠ”μ§€μ— λŒ€ν•΄ 좔상화λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • 데이터가 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(Relational Database, RDB), NoSQL λ°μ΄ν„°λ² μ΄μŠ€, 파일 μ‹œμŠ€ν…œ, μ›Ή μ„œλΉ„μŠ€ λ“± μ–΄λ–€ 곳에 μ €μž₯λ˜μ–΄ μžˆλŠ”μ§€μ™€ λ¬΄κ΄€ν•˜κ²Œ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 데이터λ₯Ό λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이 좔상화 덕뢄에, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ νŠΉμ • 데이터 μ†ŒμŠ€μ— μ’…μ†λ˜μ§€ μ•ŠμœΌλ©°, 데이터 μ†ŒμŠ€λ₯Ό κ΅μ²΄ν•˜κ±°λ‚˜ ν™•μž₯ν•˜κΈ° μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

3️⃣ CRUD μž‘μ—…μ˜ ν‘œμ€€ν™”.

  • RepositoryλŠ” 보톡 CRUD μž‘μ—…(Create, Read, Update, Delete)을 ν‘œμ€€ν™”λœ λ°©μ‹μœΌλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 데이터 μ ‘κ·Ό 둜직이 일관성을 μœ μ§€ν•  수 있으며, κ°œλ°œμžκ°€ CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ) μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ ν˜Όλž€ 없이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ Repository νŒ¨ν„΄μ˜ μž₯점.

1️⃣ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)κ³Ό 데이터 μ ‘κ·Ό 둜직의 뢄리.

  • 데이터 μ ‘κ·Ό μ½”λ“œμ™€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic) μ½”λ“œκ°€ λΆ„λ¦¬λ˜λ―€λ‘œ, μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§‘λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€ κ΄€λ ¨ 둜직이 λ³€κ²½λ˜λ”λΌλ„ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)에 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)μ΄λž€?

2️⃣ 데이터 μ†ŒμŠ€μ˜ 변경에 λŒ€ν•œ μœ μ—°μ„±.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ κΈ°μˆ μ΄λ‚˜ μ €μž₯μ†Œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ MySQLμ—μ„œ MongoDB둜 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ „ν™˜ν•΄μ•Ό ν•  경우, Repository λ‚΄λΆ€μ˜ κ΅¬ν˜„λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λ―€λ‘œ λ³€κ²½ μž‘μ—…μ΄ μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.

3️⃣ ν…ŒμŠ€νŠΈ μš©μ΄μ„±.

  • 데이터 μ ‘κ·Ό 둜직이 Repository둜 μΆ”μƒν™”λ˜μ–΄ 있기 λ•Œλ¬Έμ—, ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ Mock(λͺ¨μ˜ 객체)λ₯Ό μ‚¬μš©ν•΄ Repository의 λ™μž‘μ„ λŒ€μ²΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ 없이도 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν…ŒμŠ€νŠΈν•  수 있게 λ©λ‹ˆλ‹€.

3️⃣ Spring Data JPAμ—μ„œμ˜ Repository νŒ¨ν„΄ κ΅¬ν˜„.

  • Spring Data JPAλŠ” Repository νŒ¨ν„΄μ„ νŽΈλ¦¬ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.
    • κ°œλ°œμžλŠ” 데이터 μ ‘κ·Ό λ‘œμ§μ„ 일일이 μž‘μ„±ν•  ν•„μš” 없이, Spring Data JPAκ°€ μ œκ³΅ν•˜λŠ” JpaRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™•μž₯ν•¨μœΌλ‘œμ¨ μžλ™μœΌλ‘œ CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ) μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있게 λ©λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ: User μ—”ν‹°ν‹° 클래슀.

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String Integer age;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter μƒλž΅
}

πŸ‘‰ μ˜ˆμ‹œ: UserRepository μΈν„°νŽ˜μ΄μŠ€.

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByName(String name);
}
  • μœ„μ˜ μ½”λ“œμ—μ„œ UserRepositoryλŠ” JpaRepositoryλ₯Ό 상속받아 μžλ™μœΌλ‘œ 기본적인 CRUD λ©”μ„œλ“œ(save, findAll, findById, delete λ“±)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ, findByName μ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄, Spring Data JPAλŠ” 이 λ©”μ„œλ“œ 이름을 λΆ„μ„ν•˜μ—¬ name ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ μ‘°νšŒν•˜λŠ” SQL 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€λ‹ˆλ‹€.

πŸ‘‰ μ„œλΉ„μŠ€ λ ˆμ΄μ–΄μ—μ„œ μ‚¬μš©.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.streotype.Service;

@Service
public class UserSevice {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public User getUserByName(String name) {
        return userRepository.findByName(name);
    }
    
    public void saveUser(User user) {
        userRepository.save(user);
    }
}

4️⃣ Repository νŒ¨ν„΄μ˜ μ‚¬μš© μ˜ˆμ‹œ.

  • λ§Œμ•½ ν˜„μž¬ MySQL을 μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, λ―Έλž˜μ— MongoDB둜 μ „ν™˜ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
    • Repository νŒ¨ν„΄μ„ μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄, λ‹€μŒκ³Ό 같은 μž‘μ—…μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
        1. MySQL 기반의 UserRepository κ΅¬ν˜„μ„ MongoDB 기반의 μƒˆλ‘œμš΄ UserRepository둜 ꡐ체.
        1. μ„œλΉ„μŠ€ λ ˆμ΄μ–΄λ‚˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜μ •ν•  ν•„μš” 없이, λ°μ΄ν„°λ² μ΄μŠ€ κΈ°μˆ μ„ μ „ν™˜ν•  수 있음.

5️⃣ μš”μ•½.

  • Repository νŒ¨ν„΄μ€ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μΊ‘μŠν™”ν•˜μ—¬, 데이터 μ ‘κ·Ό λ‘œμ§μ„ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λΆ„λ¦¬ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ€ 데이터 μ†ŒμŠ€μ˜ 변경에 λŒ€ν•œ μœ μ—°μ„±μ„ μ œκ³΅ν•˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ€λ‹ˆλ‹€.
  • Spring Data JPAλŠ” μ΄λŸ¬ν•œ Repository νŒ¨ν„΄μ„ 맀우 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, κ°œλ°œμžλ“€μ΄ 데이터 μ ‘κ·Ό 계측을 κ°„λ‹¨ν•˜κ³  효율적으둜 관리할 수 있게 ν•΄μ€λ‹ˆλ‹€.