2023. 12. 1. 17:47ใBack-End ์์ ์ค/Nest.js
NestJS๋ก ๋ฐฐ์ฐ๋ ๋ฐฑ์๋ ํ๋ก๊ทธ๋๋ฐ:ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ฐจ์ธ๋ ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ค
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ทโ๏ธ ์์ ์ค์ธ ๋ด์ฉ
TypeORM์ ์ด์ฉํ์ฌ Repository๋ฅผ ๋ง๋๋ ์ค @EntityRepository๊ฐ Deprecated๋ Issue๋ฅผ ํ์ธํ๊ฒ ๋์์ด์.
์์ ์ ์ฒ์ Nest.js๋ฅผ ๊ณต๋ถํ ๋๋ TypeORM 0.2.45 Version์ ์ฌ์ฉํด์ ๋ฌธ์ ๊ฐ ์์์ง๋ง,
์ง๊ธ์ TypeORM 0.3.17 Version์ ์ฌ์ฉํ๋ฉด์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ง๋ฅ๋จ๋ฆฌ๊ฒ ๋์์ด์.
๐ค ์ด์ ๋?
@EntityRepository๋ฅผ Deprecate ์ํจ ์ด์ ๋ ๋ฌด์์ผ๊น์?
TypeORM์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ด Service Layer์์ Business Logic๋ง ์์ฑํ๊ณ , Repository Layer์์ Query Logic์ ์์ฑ(Data Mapper Pattern)ํ๊ฒ ๋ผ์.
์ด ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ด์.
์์ ๊ฐ์ด ๋ชจ๋ User๋ฅผ ์กฐํํ๋ Logic์ ๋ง๋ ๋ค๊ณ ํ ๋, TypeORM์์ ํ์ค์ผ๋ก ์ง์ํ๋ find()๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ , ๋์ผ ์ญํ ์ ํ๋ getAllUsers()๋ฅผ Repository Class ๋ด๋ถ์ ๋ง๋ค์ด์ ์์ฑํ์์ด์.
์์ ๊ฐ์ด ํ์ ๋, ์ฌ๋ฌ ๊ฐ๋ฐ์๋ค์ด ์๊ฒฉํ Data Mapper Pattern์ ์ฌ์ฉ์ด ์ข์ง ์๋ค๊ณ ๋ชฉ์๋ฆฌ๋ฅผ ๋๊ณ ,
์ด๋ฅผ ํตํด TypeORM ๊ฐ๋ฐ์๋ค์ @EntityRepository Decorator๋ฅผ Deprecated ํ๋ฉฐ, Active Record Pattern ์ฌ์ฉ์ ๊ถ์ฅ ํ๋ ๋ฏ ํด ๋ณด์ฌ์.
๋ํ, Nest.js์ Module์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํจ๋ ์์ด์.
Nest.js๋ Version Update๋ฅผ ํตํด Framework์ ๊ธฐ๋ฅ์ ํฅ์์ํค๊ณ , ์ฌ์ฉ์๊ฐ ๋ ํจ๊ณผ์ ์ผ๋ก Code๋ฅผ ์์ฑํ๊ณ ,
์ ์ง ๊ด๋ฆฌํ ์ ์๋๋ก ๋
ธ๋ ฅํ๊ณ ์์ด์.
EntityRepository Decorator๋ TypeORM์์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋ Nest.js์์ ์ถ๊ฐ๋ ๊ฒ์ด์์.
Nest.js๋ ์ฃผ๋ก ๊ฐํธํ Code ๊ตฌ์ฑ์ ์ํด ๋ช ๊ฐ์ง Custom Decorator๋ฅผ ์ ๊ณตํ์๋๋ฐ,
์ด ์ค ์ผ๋ถ๋ ํฅ ํ Release์์ ๋ณ๊ฒฝ ๋๋ Deprecated ๋๊ธฐ๋ก ๊ฒฐ์ ๋์๋ค๊ณ ํด์.
Nest.js์์๋ ๋ณด๋ค ์ผ๋ฐ์ ์ด๊ณ , ํ์ค์ ๋ถํฉํ๋ ๋ฐฉ์์ผ๋ก TypeORM์ ์ฌ์ฉํ๊ธธ ๋ฐ๋ผ๊ณ ์์ด์.
๋ํ, TypeORM์ด Update ๋๋ฉด์ Framework์
Lifecycle๊ณผ ํตํฉ๋๋๋ก ์ค๊ณ๋ Decorator ๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์.
Update๋ Library Version์ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฌํญ, ๋ณด์ ํจ์น ๋ฑ์ ํฌํจํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ด์์.
๐ป ๋ฌธ์ ํด๊ฒฐ!
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ง์ Decorator๋ฅผ ๋ง๋ค๊ณ , ํด๋น Decorator๊ฐ ์ ์ฉ๋ Repository๋ฅผ ๋ฐ์์ค Module์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ์ ํด๋ณด๋ ค๊ณ ํด์.
์ต์ด ์์ ๊ฐ์ด @TypeormRepository Decorator๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
์ด ์ฝ๋๋ Nest.js์์ ์ฌ์ฉ๋๋ ๊ฐ๋จํ Custom Decorator ๋ฐ Metadata ์ค์ ์ ์ํ Code์์.
setMetadata()๋ Nest.js์์ ์ ๊ณตํ๋ Decorator ์์ฑ ํจ์์์.
์ด๊ฒ์ ์ด์ฉํด์ Metadata ์์ฑ์ ํ ์ ์์ด์.
metadata Key๋ก ์ฌ์ฉ๋ ๋ฌธ์์ด์ Metadata์ Key๋ก ์ฌ์ฉ๋๋ ์์๊ฐ์ธ๋ฐ,
์ด Key๋ฅผ ํตํด Metadata์ ์ ๊ทผํ ์ ์์ด์.
ํด๋น Code์์๋ TypeORM๊ณผ ๊ด๋ จ๋ Custom Repository์ ๋ํ Metadata ์ค์ ์ ์ํด ์ฌ์ฉํ๋ ค๊ณ ํด์.
TypeormRepository()๋ Class Decorator๋ก ๋์ํ๊ฒ ๋ผ์.
์ด ํจ์๋ฅผ ์ด์ฉํด ์ฃผ์ด์ง Eneity์ ๋ํ Custom Repository๋ฅผ ์ค์ ํ๊ธฐ ์ํด SetMetadata()๋ฅผ ํธ์ถํ๊ฒ ๋ผ์.
์ฆ, ํด๋น Class๋ฅผ ์ง์ ํ Custom Repository๋ก ์ฌ์ฉํ๊ณ ์ ํ ๋, ์ด Decorator๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์.
์ ์ฝ๋๋ Nest.js์์ TypeORM์ Custom Repository๋ฅผ Module๋ก ๋ง๋ค๊ธฐ ์ํ Code์์.
DynamicMoule๊ณผ Provider๋ Nest.js์์ Module๊ณผ Provider๋ฅผ ์ ์ํ๊ธฐ ์ํ Interface์์.
TypeormCustomMoule Class๋ Modul์ ์ ์ ํด์ฃผ๋ ์ญํ ์ํด์.
forCustomRepository()๋ ๋์ ์ผ๋ก Custom Repository๋ฅผ ์์ฑํ๋๋ฐ, ์ฌ์ฉํ๋ ค๊ณ ๋ง๋ค์์ด์.
์ด Method๋ repositories[]๋ฅผ ๋ง๋ค ํด๋น Repository Module์ ์ถ๊ฐํ๋ ์ญํ ์ ํด์.
providers[]๋ Module์์ ์ฌ์ฉํ Provider๋ฅผ ๋ด๋ ๋ฐฐ์ด์ด์์.
for...of Loop๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ repositories[]๋ฅผ ์ํํ๋ฉด์ ๊ฐ Repository์ ๋ํ Provider๋ฅผ ์์ฑํด์ค์.
Reflect.getMetadata(...) ์ด ๋ถ๋ถ์ TypeormRepository Metadata๋ฅผ ์ฝ์ด์ค๋ ๋ถ๋ถ์ด์์.
์ด Metadata๋ @TypeormRepository Decorator๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ๋ Entity๋ฅผ ๋ํ๋ธ๋ต๋๋ค.
๋ํ, Metadata Key ๊ฐ์ธ TYPEORM_CUSTOM_REPOSITORY์ ํด๋น ํ๋ Entity๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ผ์.
13 ~ 24๋ฒ์งธ ์ค์ providers[]์ ์ ์ํ Entity์ ๋ํ Provider๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ๋๋ฐ,
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ๊ฑด๋๋ฐ๊ฒ ๋์ด์์ด์.
useFafactory()๋ ํด๋น Repository์ ๋ํ Provider๋ฅผ ์์ฑํ๋ Factory ํจ์์์.
์ฌ๊ธฐ์๋ Data Source๋ฅผ ์ฃผ์
๋ฐ์ ํด๋น Entity์ ๊ธฐ๋ณธ Repository๋ฅผ ์์ฑํ๊ณ ,
์ด๋ฅผ ์ด์ฉํด ์๋ก์ด Repository๋ฅผ ๋ง๋ค๊ฒ ํด ์ฃผ์์ด์.
Module์ DynamicModule ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋๊ณ , providers[]๋ฅผ ๋ด๋ณด๋ด๋ฉฐ,
TypeormCustomModule์ Module๋ก ์ง์ ํ๊ฒ ํด์ฃผ์์ด์.
์ด Module์ forCustomRepository()๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค Custom Repository๋ ๋์ ์ผ๋ก ์์ฑํ๊ณ ,
์ด๋ฅผ Nest.js Application์ ํตํฉํ ์ ์๋๋ก ๋ง๋ ๊ฒ์ด์์.
Deprecated๋ Decorator๋ฅผ ์ญ์ ํ๊ณ , ์์ ๊ฐ์ด Custom Decorator๋ฅผ ์
๋ ฅํด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ ์ ์ฝ๋ 30๋ฒ์งธ ์ค๊ณผ ๊ฐ์ด Custom Module์ ์์ฑํด ์ฃผ์์ด์.
๊ธฐ์กด์ @EntityRepository๋ฅผ ์ฌ์ฉํ๋ค๋ฉด @InjectRepository๋ฅผ Service Layer์์ ์ฌ์ฉํ์ง๋ง,
์ด์ ๋ ์ฌ์ฉํ๋ฉด Error๊ฐ ํฐ์ง๊ฑฐ์์.
๊ทธ๋์ @InjectRepository Decorator๋ฅผ ์ง์์ฃผ์ด์ผ ํด์.
NestJS๋ก ๋ฐฐ์ฐ๋ ๋ฐฑ์๋ ํ๋ก๊ทธ๋๋ฐ:ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ฐจ์ธ๋ ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ค
COUPANG
www.coupang.com
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ง ์ฐธ๊ณ ์๋ฃ
How to workraound this TypeORM error, "EntityRepository is deprecated , use Repository.extend function instead"?
However, I can't find any Repository.extend method in Repository class and there's nothing about it in the documentation. How to solve this? typeorm version: "^0.3.0" I'm using nest js and
stackoverflow.com