Tunko Development Diary

[NestJS] [TypeOrm] Active Record 패턴vs Data Mapper 패턴 본문

Development/Nest.js

[NestJS] [TypeOrm] Active Record 패턴vs Data Mapper 패턴

Tunko 2021. 4. 13. 22:21

TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms.

Active Record 와 Data Mapper 는
TypeOrm에서 사용 되는 일종의 패턴을 의미한다.

  • Active Record 예시
    // example how to save AR entity
    const user = new User();
    user.firstName = "Timber";
    user.lastName = "Saw";
    user.isActive = true;
    await user.save();
    

// example how to remove AR entity
await user.remove();

// example how to load AR entities
const users = await User.find({ skip: 2, take: 5 });
const newUsers = await User.find({ isActive: true });
const timber = await User.findOne({ firstName: "Timber", lastName: "Saw" });

정말 간단하게 이야기하면 
User entity 에 접근헤서  CRUD 기능을 구현한다 했을떄 매 쿼리마다 바로 new User() 등을 사용해 객체를 생성해서 제공되는 메서드를 사용해 DB 에접근하는 방식

- Data Mapper 예시
```javascript
const userRepository = connection.getRepository(User);

// example how to save DM entity
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await userRepository.save(user);

// example how to remove DM entity
await userRepository.remove(user);

// example how to load DM entities
const users = await userRepository.find({ skip: 2, take: 5 });
const newUsers = await userRepository.find({ isActive: true });
const timber = await userRepository.findOne({ firstName: "Timber", lastName: "Saw" });

위 예시와 별반 다를 건 없다 다만 한가지 다른점은

const userRepository = connection.getRepository(User);

이 부분이다. 즉 이건 해당 Entity 전용 메니저 클래스를 만들어 사용할때를 의미한다.


요약

어떤 패턴이 좋고 나쁘다곤 할 수 없다.
접근성이 좋은 방식은 Active Record 방식이다. 단순하고 작은 앱에서 유용하다고 한다.
Data Mapper 는 Entity별로 별도의 매니저클래스를 두는 방식이다. 이 방식은 규모가 있는 앱에서 효과적이다.

반응형
Comments