Repository 를 사용한 데이터 접근 추상화의 원리와 구조

Seong Hyeon Kim·2024년 8월 2일
0

스프링

목록 보기
8/9

  • 레포지토리는 데이터 접근을 추상화하는 역할을 합니다. 이를 통해 애플리케이션은 데이터 저장소에 직접 접근하지 않고, 레포지토리를 통해 간접적으로 접근합니다. 이렇게 하면 데이터 저장소와 애플리케이션 로직 간의 의존성이 줄어들고, 데이터 접근 로직이 단순화됩니다.



데이터 접근 추상화의 원리와 구조

1. 추상화된 데이터 접근

데이터 접근을 추상화하면 데이터 저장소에 접근하는 모든 로직이 레포지토리 계층에 집중됩니다. 애플리케이션 로직은 레포지토리 인터페이스를 통해 데이터에 접근합니다. 이는 데이터 저장소의 종류나 접근 방식이 변경되더라도 애플리케이션 로직을 변경하지 않고 레포지토리 구현만 변경하면 되도록 설계하는 것입니다.

2. 레포지토리 패턴의 구조

레포지토리 패턴은 다음과 같은 구조로 구성됩니다:

  • 도메인 객체: 실제 데이터 모델을 나타내는 클래스입니다.
  • 레포지토리 인터페이스: 데이터 접근 메서드를 정의합니다.
  • 레포지토리 구현체: 인터페이스를 구현하여 실제 데이터 저장소에 접근하는 로직을 포함합니다.

비유를 통한 설명

레포지토리 패턴을 쉽게 이해할 수 있도록 비유를 사용해 설명해보겠습니다.


비유: 도서관 시스템

도서관 시스템을 생각해 봅시다. 도서관에는 책들이 있고, 사람들은 책을 대출하고 반납하는 등의 작업을 합니다. 여기서 도서관 시스템의 각 요소를 레포지토리 패턴에 비유할 수 있습니다.


  1. 도메인 객체 (책):

    • 책은 도메인 객체입니다. 책에는 제목, 저자, ISBN 등의 정보가 포함됩니다.
    • 도메인 객체는 실제 데이터 모델을 나타냅니다.
  2. 레포지토리 인터페이스 (도서 관리자):

    • 도서 관리자는 책을 대출하거나 반납하는 등의 작업을 정의합니다.
    • 예를 들어, findBookByTitle(String title), borrowBook(Long bookId), returnBook(Long bookId) 등의 메서드를 정의할 수 있습니다.
    • 레포지토리 인터페이스는 데이터 접근 메서드를 정의합니다.
  3. 레포지토리 구현체 (도서관 시스템 구현):

    • 도서관 시스템은 도서 관리자의 요청에 따라 실제로 책을 찾고, 대출하고, 반납하는 작업을 수행합니다.
    • 이는 데이터베이스에 접근하여 책 정보를 저장하거나 업데이트하는 로직을 포함합니다.
    • 레포지토리 구현체는 인터페이스를 구현하여 실제 데이터 저장소에 접근하는 로직을 포함합니다.



비유예제로 레포지토리 사용 예시

  • 위의 비유를 코드로 표현하면 다음과 같습니다:

도메인 객체 (책)

public class Book {
    private Long id;
    private String title;
    private String author;
    private String isbn;

    // Getter와 Setter
}

레포지토리 인터페이스 (도서 관리자)

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

public interface BookRepository extends JpaRepository<Book, Long> {
    Optional<Book> findByTitle(String title);
}

레포지토리 구현체 (도서관 시스템 구현)

스프링 데이터 JPA는 JpaRepository 인터페이스를 구현한 기본 구현체를 자동으로 생성합니다. 우리는 이를 사용하여 데이터 접근을 간단하게 구현할 수 있습니다.

@Service
public class LibraryService {
    @Autowired
    private BookRepository bookRepository;

    public Book borrowBook(Long bookId) {
        return bookRepository.findById(bookId).orElseThrow(() -> new RuntimeException("Book not found"));
    }

    public void returnBook(Long bookId) {
        Book book = bookRepository.findById(bookId).orElseThrow(() -> new RuntimeException("Book not found"));
        // 책 반납 로직
    }
}



결론

  • 레포지토리는 데이터 접근을 추상화하여 데이터 저장소와 애플리케이션 로직 간의 의존성을 줄입니다.

  • 이를 통해 데이터 접근 로직을 단순화하고, 데이터 저장소의 변경에도 유연하게 대처할 수 있습니다.

  • 비유를 통해 레포지토리 패턴이 도서관 시스템과 유사하게 작동함을 알 수 있습니다.

  • 도서 관리자는 실제 도서관 시스템을 통해 책을 관리하며, 이는 데이터 접근을 추상화하는 레포지토리 패턴의 원리와 유사합니다.

profile
삽질도 100번 하면 요령이 생긴다. 부족한 건 경험으로 채우는 개발자

0개의 댓글