ORM μ΄λ?
κ°μ²΄μ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€ κ°μ λ°μ΄ν°λ₯Ό μλμΌλ‘ λ§€νν΄μ£Όλ κΈ°μORMμ κ°λ°μκ° μ½λμμ μ¬μ©νλ κ°μ²΄μ κ΄κ³ν DBμ ν μ΄λΈ μ¬μ΄μ λ°μ΄ν°λ₯Ό μλμΌλ‘ λ³νν΄μ£Όλ κΈ°μ μ΄λ€. μ΄λ₯Ό ν΅ν΄ SQL μ§μ μμ± μμ΄ κ°μ²΄ μ§ν₯ λ°©μμΌλ‘ DBμ μ κ·Όν μ μλ€.
TypeORM
TypeORMμ TypeScriptμ JavaScriptλ₯Ό μν ORM λΌμ΄λΈλ¬λ¦¬μ λλ€. Node.js νκ²½μμ μ¬μ©ν μ μμΌλ©°, λ°μ½λ μ΄ν°μ νμ μμ μ±μ μ 곡ν©λλ€.TypeORM μ₯μ
- νμ μμ μ±: TypeScriptμ νμ μμ€ν μ νμ©νμ¬ λ°νμ μ€λ₯λ₯Ό μ€μ΄κ³ , κ°λ° μ€ νμ μ€λ₯λ₯Ό μ¬μ μ λ°©μ§νλ€.
-
λ°μ½λ μ΄ν°λ₯Ό ν΅ν λ§€ν:
@Entity(),@Column(),@PrimaryGeneratedColumn()λ±μ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬, ν΄λμ€μ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ κ°μ λ§€νμ μ€μ νλ€. -
리ν¬μ§ν 리 ν¨ν΄ μ¬μ©: λ°μ΄ν°λ² μ΄μ€ μμ
μ 리ν¬μ§ν 리λ₯Ό ν΅ν΄ μΊ‘μννμ¬ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , λ°μ΄ν° μ κ·Όμ μΌκ΄μ± μκ² μ μ§
(μμ)UserRepositoryλ₯Ό μ¬μ©νμ¬UserEntityμ λν CRUD μμ μ μ²λ¦¬ -
λ§μ΄κ·Έλ μ΄μ
μ§μ: λ§μ΄κ·Έλ μ΄μ
κΈ°λ₯μ ν΅ν΄ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§μ λ³κ²½ μ΄λ ₯μ κ΄λ¦¬νκ³ , λ°μ΄ν°λ² μ΄μ€ ꡬ쑰λ₯Ό μ½κ² μ
λ°μ΄νΈν μ μμ΅λλ€.
(μμ) μ€ν€λ§ λ³κ²½ μtypeorm migration:generateμtypeorm migration:runλͺ λ Ήμ΄λ₯Ό μ¬μ©ν©λλ€. - λ€μν λ°μ΄ν°λ² μ΄μ€ μ§μ: MySQL, PostgreSQL, SQLite, MariaDB λ± λ€μν κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μ
-
Active Record & Data Mapper ν¨ν΄ μ§μ
Active Recordμ Data Mapper ν¨ν΄μ΄ λμΌ?
μμμ±μ λν λ‘μ§(DB μ κ·Ό λ±)μ λκ°/μ΄λ»κ² ν μ§λ₯Ό μ νλ ν¨ν΄μ΄λ€.
(μν°ν° μ€μ€λ‘ vs λ³λ 리ν¬μ§ν 리/λ§€νΌ)- Active Record ν¨ν΄: μν°ν°κ° μμ μ λ°μ΄ν°λ² μ΄μ€ μμ
μ μ²λ¦¬ν©λλ€.
μ) User, Orderκ³Ό κ°μ ν΄λμ€λ€μ΄ μ§μ λ°μ΄ν°λ² μ΄μ€ μμ μ μ²λ¦¬νλ λͺ¨λΈ - Data Mapper ν¨ν΄: λ°μ΄ν°λ² μ΄μ€ μμ
μ λ³λμ λ ν¬μ§ν λ¦¬κ° μ²λ¦¬ν©λλ€.
μ) λ ν¬μ§ν 리λ₯Ό μ§μ ꡬννμ¬, DB μμ λ‘μ§μ μ²λ¦¬νλ€.
- Active Record ν¨ν΄: μν°ν°κ° μμ μ λ°μ΄ν°λ² μ΄μ€ μμ
μ μ²λ¦¬ν©λλ€.
λ§μ΄κ·Έλ μ΄μ μ΄λ?
λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ λ³κ²½ μ΄λ ₯ κ΄λ¦¬ λ° μ μ©λ§μ΄κ·Έλ μ΄μ μ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό 체κ³μ μΌλ‘ κ΄λ¦¬νκ³ , λ²μ λνκΈ° μν κΈ°λ₯μ΄λ€.
μ½κ² λ§ν΄, λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§(ν μ΄λΈ, μ»¬λΌ λ±)μ ꡬ쑰 λ³νλ₯Ό μ½λλ‘ κΈ°λ‘νκ³ , μ΄λ₯Ό μμ°¨μ μΌλ‘ μ μ©νκ±°λ λλ릴 μ μκ² λμμ£Όλ λꡬμ΄λ€. TypORMμμλ νμν μμ μ
Up/Down λ©μλλ₯Ό ν΅ν΄ μ μ©(Up)νκ±°λ λλ릴(Down) μ μκ² ν΄μ£Όλ κΈ°λ₯μ΄μμ.
TypeORM Config μ€μ
@nestjs/config ν¨ν€μ§λ₯Ό μ€μΉνμ¬ μ¬μ©νλ€.configκ° μΆ©λλμ§ μκ³ , μ¬μ©νκΈ° νΈνκ² νλ€.
synchronize μ΅μ
μ nest.js μλ²κ° μμλλ©΄, μ€μ DBμ μν°ν° νμΌ κ°μ λκ° μλ§λ λΆλΆμ΄ μμ λ(컬λΌμ΄ μΆκ°λκ±°λ, ν
μ΄λΈμ΄ μΆκ°λκ±°λ νλ μμ
λ€μ΄ λ°μ μλμ΄ μμ λ) λ³κ²½μ¬νμ μλμ λ§μΆ°μ€λ€.
νλ‘λμ
νκ²½μμλ TypeORM μ€μ μ
synchronize μ΅μ
μ μ§μν΄μΌνλ€.μκΈ°μΉ μμ λ°μ΄ν° μμ€μ΄λ μ€ν€λ§ λ³κ²½ μνμ΄ μκΈ° λλ¬Έ
synchronize μ΅μ
μ μν°ν° μ½λμ DB μ€ν€λ§λ₯Ό μλ² μμ μ μλμΌλ‘ λ§μΆ°μ£Όλ κΈ°λ₯μ νλ€. μ΄ κΈ°λ₯μ κ°λ° μ€μ νΈλ¦¬νμ§λ§, νλ‘λμ
μμλ μμμΉ λͺ»ν μ€ν€λ§ λ³κ²½μΌλ‘ μ€μν λ°μ΄ν°κ° μμ λ μνμ΄ μμ΄ μ¬μ©νμ§ μλλ€.λ§μ΄κ·Έλ μ΄μ λͺ λ Ήμ΄
-
migration:run: λκΈ° μ€μΈ λͺ¨λ λ§μ΄κ·Έλ μ΄μ μ μ€νν©λλ€.
β μ€μ λ‘ μμ±λ λ§μ΄κ·Έλ μ΄μ νμΌμ DBμ λ°μν΄μ€λ€.
β DBμ 컬λΌμ΄ λ°λμκ±°λ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ΄ μλ‘ μΆκ°λμκ±°λ νλ λͺ¨λ λ³κ²½μ¬νμ μ€μ DBμ λ°μν΄μ€λ€.
λ§μ΄κ·Έλ μ΄μ μ μ€νν΄μ μμ±λ νμΌμ μ½λλ₯Ό 보면,upκ³Όdownλ©μλκ° μμ±λλ€.upλ©μλλ runμ νμ λ μ€νλκ³ ,downλ©μλλ revertλ₯Ό νμ λ μ€νμ΄ λλ€.
-
migration:generate: μν°ν°μ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§μ μ°¨μ΄λ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ λ§μ΄κ·Έλ μ΄μ νμΌμ μμ±ν©λλ€.
--name=Add_CreatedAt_To_PostμΌλ‘ λ§μ΄κ·Έλ μ΄μ μ μ΄λ¦μ λΆμΌ μ μλ€. -
migration:create: λΉ λ§μ΄κ·Έλ μ΄μ νμΌμ μμ±ν©λλ€.
β μ°λ μ΄μ : λ΄κ° μνλ SQL 컀맨λλ₯Ό μ§μ μ λ ₯νκ³ , λ³κ²½μ¬νμ μλμΌλ‘ μΈμνμ¬ μΏΌλ¦¬λ₯Ό μμ±νλ κ²μ νκ³ μΆμ§ μμ λ -
migration:revert: κ°μ₯ μ΅κ·Όμ μ€νλ λ§μ΄κ·Έλ μ΄μ μ λλ립λλ€. β runμ ν΅ν΄μ λ°μλ λ§μ΄κ·Έλ μ΄μ μ λ€μ λ릴 λ, μ¦ λ³΅κ΅¬ν λ μ¬μ©νλ 컀맨λ -
migration:show: μ μ©λ λ§μ΄κ·Έλ μ΄μ κ³Ό λκΈ° μ€μΈ λ§μ΄κ·Έλ μ΄μ λͺ©λ‘μ νμν©λλ€.
β νμ¬ λ§μ΄κ·Έλ μ΄μ μ΄ μ΄λκΉμ§ μ§νμ΄ λκ³ , μ΄λλΆν° μ§νμ΄ λμ§ μμλμ§λ₯Ό νμ
μ£Όμμ¬ν
- λ§μ΄κ·Έλ μ΄μ μ μ€ννκΈ° μ μ νμ λ°μ΄ν°λ² μ΄μ€λ₯Ό λ°±μ νμΈμ.
- νλ‘λμ νκ²½μμ λ§μ΄κ·Έλ μ΄μ μ μ€νν λλ νΉν μ£Όμκ° νμν©λλ€.
- λ§μ΄κ·Έλ μ΄μ νμΌμ λ²μ κ΄λ¦¬ μμ€ν μ ν¬ν¨λμ΄μΌ ν©λλ€.
- synchronize μ΅μ μ falseλ‘ μ€μ ν νμλ λͺ¨λ μ€ν€λ§ λ³κ²½μ¬νμ λ§μ΄κ·Έλ μ΄μ μ ν΅ν΄ κ΄λ¦¬ν΄μΌ ν©λλ€.
μ°Έκ³ μλ£
μ°Έκ³ μλ£
- νλ‘ νΈ κ°λ°μλ₯Ό μν λ°±μλ 101 (NestJS, TypeORM) κ°μ
- [μ€μ΅] TypeORM λ§μ΄κ·Έλ μ΄μ - DB μ»¬λΌ μΆκ° ν΄λ³΄κΈ°