저장소 계층은 데이터 엑세스 계층이라고도 불리는데, 주로 데이터베이스와 관련된 작업을 처리하는 계층이다.
데이터 접근과 관련된 세부 사항을 숨기는 동시에, 메모리상에 데이터가 존재하는 것처럼 가정하여 코드를 구현하게 된다.
저장소 계층을 도입하면, 데이터 저장 방법을 더욱 쉽게 변경할 수 있고, 테스트 코드 작성시 가짜 저장소(Mock Repository)를 제공하기가 더 쉬워진다.
어플리케이션의 다른 계층들은 저장소의 세부 구현 방식에 대해 알지 못하더라도 해당 기능을 사용할 수 있다.즉, 저장소 계층의 변경 사항이 다른 계층에 영향을 주지 않는 것이다.
→ 객체 지향의 개념 중 추상화(Abstraction)와 관계가 있다.
- 저장소 계층은 데이터 저장소를 간단히 추상화한 것으로, 이 계층을 통해 모델 계층과 데이터 계층을 명확하게 분리할 수 있다.
- 대표적인 저장소 계층의 메서드
add(), create()
: 새 원소를 저장소에 추가한다.get(), find()
: 이전에 추가한 원소를 저장소에서 가져온다.
저장소 계층이 없더라도 ORM은 모델과 저장소의 결합도를 충분히 완화 시켜 줄 수 있다.
-> ORM이 없을 떄 대부분의 코드는 Raw Query로 작성되어 있기 때문이다.
ORM 매핑을 수동으로 하려면 개발 코스트가 더욱 소모된다
-> 여기서 설명하는 ORM은 이전에 사용한 Prisma와 같은 라이브러리를 말한다.
3계층 마지막 계층인 저장소 계층(Repository Layer)이다.
이전에 작성했던 코드에서 서비스 계층인 AuthServices
에서 AuthRepository
를 호출하여 데이터를 요청하는 것을 확인 할 수 있었다.
Post.repository.js
import { prisma } from "../utils/prisma/index.js";
export class AuthRepository {
login = async (email) => {
// ORM인 Prisma에서 users모델의 findUnique메서드를 사용해 데이터를 요청한다.
const user = await prisma.users.findUnique({ where: { email } });
// 값들을 반환 해준다.
return user;
};
}
저장소 계층에서는 AuthRepository
클래스에서 Prisma
의 메소드를 사용해 데이터를 조회하거나 생성하는 것이 가장 핵심적인 내용이다
단일 테이블만 사용하요 Prisma를 사용했기 때문에 코드가 복잡해지지 않았다, 그러나 어플리케이션의 규모가 커지거나 데이터베이스의 구성이 복잡해질 경우에는 저장소 계층의 구조 또한 복잡해질 것이다.