데이터 접근을 추상화하면 데이터 저장소에 접근하는 모든 로직이 레포지토리 계층에 집중됩니다. 애플리케이션 로직은 레포지토리 인터페이스를 통해 데이터에 접근합니다. 이는 데이터 저장소의 종류나 접근 방식이 변경되더라도 애플리케이션 로직을 변경하지 않고 레포지토리 구현만 변경하면 되도록 설계하는 것입니다.
레포지토리 패턴은 다음과 같은 구조로 구성됩니다:
레포지토리 패턴을 쉽게 이해할 수 있도록 비유를 사용해 설명해보겠습니다.
도서관 시스템을 생각해 봅시다. 도서관에는 책들이 있고, 사람들은 책을 대출하고 반납하는 등의 작업을 합니다. 여기서 도서관 시스템의 각 요소를 레포지토리 패턴에 비유할 수 있습니다.
도메인 객체 (책):
레포지토리 인터페이스 (도서 관리자):
findBookByTitle(String title)
, borrowBook(Long bookId)
, returnBook(Long bookId)
등의 메서드를 정의할 수 있습니다.레포지토리 구현체 (도서관 시스템 구현):
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"));
// 책 반납 로직
}
}
레포지토리는 데이터 접근을 추상화하여 데이터 저장소와 애플리케이션 로직 간의 의존성을 줄입니다.
이를 통해 데이터 접근 로직을 단순화하고, 데이터 저장소의 변경에도 유연하게 대처할 수 있습니다.
비유를 통해 레포지토리 패턴이 도서관 시스템과 유사하게 작동함을 알 수 있습니다.
도서 관리자는 실제 도서관 시스템을 통해 책을 관리하며, 이는 데이터 접근을 추상화하는 레포지토리 패턴의 원리와 유사합니다.