Repository Design Pattern
Repository 패턴은 Data Layer를 app의 나머지 부분에서 분리하는 디자인 패턴이다.
Service Layer와 Data Source Layer 사이에서 중재자 역할을 하는 Layer다.
Service Layer에는 비즈니스 로직인 서비스의 핵심이 되는 로직이 존재한다.
Repository 패턴을 적용하지 않으면 비즈니스 로직에서 바로 데이터 베이스에 접근하게 된다.
바로 접근하면 안되는 것일까?
Service Layer에서 DB에 바로 접근이 가능하긴 하지만 몇 가지 문제점들이 발생할 수 있다.
- 프로젝트 진행시 코드가 분리되어있지 않아서 비즈니스 로직에만 집중하기 어렵다.
- 여러 개의 서비스가 있을 경우, 동일한 쿼리로 DB에 접근한다면 코드의 중복이 발생한다.
- 여러 개의 서비스 간에 서로 참조를 하고 있다면 순환 참조가 생길 수 있다.
Repository 패턴 적용의 장점
- Repository 패턴은 여러개의 서비스가 있을 때 장점들을 더욱 발휘한다
- Repository Layer에서만 DB에 접근이 가능해서 비즈니스 로직과 분리하여 정리할 수 있다.
- 여러 개의 서비스가 있어도 하나의 Repository Layer에서 DB 접근을 관리할 수 있다.
- 코드의 유지보수와 확장성을 보장할 수 있다.
< Nest JS, TypeORM, PostgreSQL 사용 >
// user.repository.ts
import { Injectable } from '@nestjs/common';
import { DataSource, Repository } from 'typeorm';
import { User } from './user.entity';
import { InjectRepository } from '@nestjs/typeorm';
@Injectable()
export class UserRepository extends Repository<User> {
constructor(@InjectRepository(User) private dataSource: DataSource) {
super(User, dataSource.manager);
}
async registerUser(user: User): Promise<User> {
await this.save(user);
return user;
}
async findUser(user: User): Promise<User> {
const findUser = await this.findOneBy({ email: user.email });
return findUser;
}
}
- Repository Layer에서 TypeORM 메서드인 save, findOneBy를 통해서 DB에 접근한다
// user.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { User } from './user.entity';
import { UserRepository } from './user.repository';
@Injectable()
export class UserService {
constructor(private userRepository: UserRepository) {}
register(user: User): Promise<User> {
return this.userRepository.registerUser(user);
}
async getUser(user: User): Promise<User> {
const result = await this.userRepository.findUser(user);
if (!result) {
throw new NotFoundException('user를 찾을 수 없습니다.');
}
return result;
}
}
- Service Layer에서는 바로 DB로 접근하지 않고 Repository Layer로 접근한다.
참고자료
https://tasddc.tistory.com/124
https://velog.io/@jhsol24/NestJS-Repository-Pattern-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
https://velog.io/@ilil1/Repository-Pattern-%EC%9D%B4%EB%9E%80
반응형
'IT Study > JavaScript' 카테고리의 다른 글
[NestJS] Swagger 설치 및 적용 (0) | 2024.01.08 |
---|---|
[NestJS] Nest.js 시작하기 (0) | 2024.01.07 |
[NestJS] 게시글 DB에 저장하기 (with PostgreSQL) (0) | 2024.01.04 |
[JS] 비동기 처리 패턴 async, await (0) | 2023.09.06 |
[JS] setTimeout의 clearTimeout, 디바운싱, 쓰로틀링 (0) | 2023.09.06 |