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

이번에는 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); // 또 다른 쿠키 완성! 🍪
🧐 그러면 왜 사용하나요?
- 반복적인 SQL 작성 줄여줌 - 첫번째로 TypeORM같은 ORM 라이브러리를 사용한다면 userRepository.save(newUser)같은 코드로 데이터베이스 작업을 할 수 있다.
- 타입스크립트 장점 활용 - Entity는 클래스이므로, 타입검사의 이점을 그대로 누릴 수 있다 그래서 오타나 오류를 바로 찾을 수 있다.
- 코드의 일관성 및 재사용성 - 데이터베이스의 구조가 명확하게 정의되므로, 여러 개발자가 협업할 때 일관성을 유지할 수 있다.
🧐 언제 사용해야 하나요?
애플리케이션의 데이터를 데이터베이스에 영구적으로 저장하고 싶을 때 사용한다.
예를 들면 회원 정보나 게시글처럼 서버가 꺼져도 보존되어야할 데이터들을 엔티티로 정의한다.
주의해야할 점이 있나요?
- Entity와 DTO를 반드시 구별하세요
- Entity는 데이터베이스 테이블 그 자체를 나타내고 있고, 데이터베이스와 직접 소통하는 내부용 모델이다.
- DTO는 클라이언트와 데이터를 주고받기 위한 객체이다. 민감한 정보는 제외하고, 필요한 데이터만 담긴다.
절대로 Entity 객체를 클라이언트에게 반환해서는 안된다. 데이터베이스 안에 중요한 정보들이 존재할 수 있는데, 이것을 그대로 반환한다면 바로 보안 사고가 일어난다.
'Framework > nestjs' 카테고리의 다른 글
| [Nest.js] 소켓(socket.io) (2) | 2025.07.09 |
|---|---|
| [Nest.js] DTO란? (0) | 2025.07.07 |