본문 바로가기
Framework/nestjs

[Nest.js] Entity란?

by Lseing 2025. 7. 10.

해당 글은 개인적으로 공부하면서 기록하는 글로써 잘못된 점이나 보충할 점이 있다면 많은 댓글 부탁드립니다~

이번에는 Entity라는 개념에 대해서 그리고 언제 사용하는지, 언제 사용하지 말아야할지 알아보자

🧐 Entity가 뭐죠?

Entity는 데이터베이스의 테이블에 해당하는 클래스이다. 쉽게 말하면

  • 데이터베이스 테이블 = Entity 클래스
  • 테이블의 행(row) = Entity 인스턴스
  • 테이블의 열(column) = Entity 속성(property) 이라고 할 수 있다.


클래스는 설계도, 테이블은 건물: Entity 클래스는 데이터베이스에 어떤 모양의 테이블을 만들지 정의하는 설계도이다.
객체 인스턴스는 행, 데이터는 내용: 이 클래스로 만든 객체 하나는(new User()) 테이블의 한 줄에 해당한다.



TypeORM과 같은 ORM라이브러리가 이 엔티티 클래스(설계도)를 읽어서, 실제 데이터베이스에 SQL 명령어를 대신 실행시켜준다.


nestjs에서는 이렇게 표현된다

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity("users")
export class User {
  @PrimaryGeneratedColumn
  id: number;

  @Column()
  email: string;

  @Column()
  password: string;
}


여기서 잠깐 예시에 나온 데코레이터들의 의미와 역할을 설명하고자 한다.

  • @Entity(): TypeORM에게 해당 클래스가 Entity라고 알려주는 역할을 한다.
  • @PrimaryGeneratedColumn(): // 기본 키(Primary Key)이며, 값이 자동으로 1씩 증가한다.
  • @Column(): 데이터베이스의 일반 column 이다.

해당 코드들은 데이터베이스에 user라는 이름의 테이블을 만들고, 그 안에 id, name, email이라는 column을 만들라는 지시와 같다.


Entity는 일종의 쿠키틀과도 유사하다

❌Entity가 없을 때(직접 SQL 쿼리 작성)

// 매번 SQL을 직접 작성해야 함
const query = `
  INSERT INTO users (email, password, created_at, updated_at) 
  VALUES ('user@test.com', 'password123', NOW(), NOW())
`;
await database.query(query);

// 사용자마다 다른 쿼리를 또 작성해야 함
const query2 = `
  INSERT INTO users (email, password, created_at, updated_at) 
  VALUES ('another@test.com', 'password456', NOW(), NOW())
`;
await database.query(query2);

⭕Entity가 있을 때(쿠키틀처럼 찍어내기)

// 1. 쿠키틀(Entity) 정의
@Entity("users")
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  password: string;
}

// 2. 쿠키틀로 찍어내기
const user1 = new User();
user1.email = "user@test.com";
user1.password = "password123";
await userRepository.save(user1);  // 쿠키 완성! 🍪

const user2 = new User();
user2.email = "another@test.com";
user2.password = "password456";
await userRepository.save(user2);  // 또 다른 쿠키 완성! 🍪

🧐 그러면 왜 사용하나요?

  1. 반복적인 SQL 작성 줄여줌 - 첫번째로 TypeORM같은 ORM 라이브러리를 사용한다면 userRepository.save(newUser)같은 코드로 데이터베이스 작업을 할 수 있다.
  2. 타입스크립트 장점 활용 - Entity는 클래스이므로, 타입검사의 이점을 그대로 누릴 수 있다 그래서 오타나 오류를 바로 찾을 수 있다.
  3. 코드의 일관성 및 재사용성 - 데이터베이스의 구조가 명확하게 정의되므로, 여러 개발자가 협업할 때 일관성을 유지할 수 있다.

🧐 언제 사용해야 하나요?

애플리케이션의 데이터를 데이터베이스에 영구적으로 저장하고 싶을 때 사용한다.

예를 들면 회원 정보나 게시글처럼 서버가 꺼져도 보존되어야할 데이터들을 엔티티로 정의한다.

주의해야할 점이 있나요?

  1. Entity와 DTO를 반드시 구별하세요
  • Entity는 데이터베이스 테이블 그 자체를 나타내고 있고, 데이터베이스와 직접 소통하는 내부용 모델이다.
  • DTO는 클라이언트와 데이터를 주고받기 위한 객체이다. 민감한 정보는 제외하고, 필요한 데이터만 담긴다.
    절대로 Entity 객체를 클라이언트에게 반환해서는 안된다. 데이터베이스 안에 중요한 정보들이 존재할 수 있는데, 이것을 그대로 반환한다면 바로 보안 사고가 일어난다.

'Framework > nestjs' 카테고리의 다른 글

[Nest.js] 소켓(socket.io)  (2) 2025.07.09
[Nest.js] DTO란?  (0) 2025.07.07