์ํํธ์จ์ด ๊ณตํ์์ ๋ชจ๋(Module)์ ๊ฑฐ๋ํ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋
๋ฆฝ์ ์ธ ๋จ์์ด์ ๊ธฐ๋ฅ์ ๋ถํ์ ์๋ฏธํ๋ค.
๋ ๊ณ ๋ก ์ง์ ๋ง๋ ๋ค๊ณ ์์ํด ๋ณด์. ์ฐฝ๋ฌธ, ๋ฒฝ, ๋ฌธ ๋ธ๋ก์ ๋ฐ๋ก ๋ง๋ ๋ค ์กฐ๋ฆฝํ๋ค. ์ด๋ ์ค์ํ ๊ฒ์ ๊ฐ ๋ธ๋ก์ด ์๋ก ๋ง๋ฌผ๋ฆฌ๋ ํ์ค ๊ท๊ฒฉ(interface)์ ๊ฐ์ก๋ค๋ ์ ์ด๋ค.
๋ชจ๋ํ๋ฅผ ํ๋ ์ด์ ๋ ํฌ๊ฒ 3๊ฐ์ง๋ค.
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์์ ๋ชจ๋์ ๋จ์ํ ํ์ผ์ ๋๋๋ ๊ฒ์ด ์๋๋ผ ๋
ผ๋ฆฌ์ ์ธ ๊ฒฝ๊ณ(Boundary)๋ฅผ ๊ธ๋ ์์
์ด๋ค. ์ข์ ๋ชจ๋์ ์ธ๋ถ์ ์ฒ ์ ํ ๊ฒฉ๋ฆฌ๋๋ฉด์๋ ๋ด๋ถ์ ์ผ๋ก๋ ๋จ๋จํ๊ฒ ๋ญ์ณ ์์ด์ผ ํ๋ค.
1. ๊ณ ์์ง (High Cohesion)
๋ชจ๋ ๋ด๋ถ๋ ์์ง๋๊ฐ ๋์์ผ ํ๋ค. ์๋ฅผ ๋ค์ด UserModule ์์๋ ๊ฐ์
, ๋ก๊ทธ์ธ์ฒ๋ผ ์ ์ ์ ๊ด๋ จ๋ ๋ก์ง๋ง ๋ญ์ณ ์์ด์ผ ํ๋ค. ๋ง์ฝ ์ด ์์ ๊ฒฐ์ ๋ก์ง์ด ์์ฌ ์๋ค๋ฉด ์ ์ ๊ธฐ๋ฅ์ ๊ณ ์น ๋ ์๊ด์๋ ๊ฒฐ์ ์ฝ๋๊น์ง ๊ฑด๋๋ ค์ผ ํ๋ ์ํ์ด ์๊ธด๋ค.
2. ์ ๊ฒฐํฉ (Low Coupling)
๋ชจ๋ ๊ฐ์ ์์กด์ฑ์ ์ต์ํ๋์ด์ผ ํ๋ค. ๊ฒฐ์ ๋ชจ๋์ ์์ ํ๋ค๊ณ ์ ์ ๋ชจ๋์ด ๊ณ ์ฅ ๋๋ค๋ฉด ๋ ๋ชจ๋์ ๋๋ฌด ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์ํ์ด๋ค. ์ธํฐํ์ด์ค(interface)๋ผ๋ ์ฝ์๋ ์ฐฝ๊ตฌ๋ง์ ํตํด ์ํตํจ์ผ๋ก์จ ํ ์ชฝ์ ๋ณํ๊ฐ ๋ค๋ฅธ ์ชฝ์ ๋ฒ์ง๋ ๋๋นํจ๊ณผ๋ฅผ ์ฐจ๋จํด์ผ ํ๋ค.
3. ์บก์ํ (Encapsulation)
๋ชจ๋์ ์์ ์ ๋ณต์กํ ๋ด๋ถ ๋ก์ง์ ์ธ๋ถ์ ์๋ฆฌ์ง ์๋๋ค. ๊ผญ ํ์ํ ๊ธฐ๋ฅ๋ง ๋ฐ์ผ๋ก ๋
ธ์ถ(Public) ํ๊ณ ๋๋จธ์ง๋ ์จ๊น(Private)์ผ๋ก์จ ์ธ๋ถ์ ์๋ชป๋ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ๋ชจ๋์ ๋
๋ฆฝ์ฑ์ ์งํจ๋ค.
NestJS๋ ํ๋ ์์ํฌ ์ฐจ์์์ ๋ชจ๋ ๊ฐ๋
์ ๊ฐ์ ํ๋ค. ๋ชจ๋ NestJS ์ฑ์ ์ต์ ํ๋ ์ด์์ ๋ฃจํธ ๋ชจ๋(Root Module)์ ๊ฐ์ง๋ฉฐ ๋ชจ๋๋ค์ด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฎ์ฌ ํ๋์ ๊ฑฐ๋ํ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฑํ๋ค.
NestJS ๋ชจ๋์ @Module() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ๋ค์ 4๊ฐ์ง ํต์ฌ ์์ฑ์ ์ ์ํ๋ค.
1. providers: ๋ด๋ถ ์๋น์ค ๋ ์ด์ด๋ก ๋ชจ๋์ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ค
2. controllers: ์ธํฐํ์ด์ค ๋ ์ด์ด๋ก ์ฌ์ฉ์๋ ์ธ๋ถ ์์คํ
๊ณผ์ ์ํธ์์ฉ์ ๊ด๋ฆฌํ๋ ๊ณ์ธต
3. imports: ์ด ๋ชจ๋์ด ์๋ํ๊ธฐ ์ํด ํ์ํ ๋ค๋ฅธ ๋ชจ๋๋ค์ ๋ชฉ๋ก
4. exports: ์ด ๋ชจ๋์ ๊ธฐ๋ฅ ์ค ๋ค๋ฅธ ๋ชจ๋์์๋ ์ฌ์ฉํ ์ ์๊ฒ ํ์ฉํ ๋ช
๋จ
@Module({
// 1. ์ธ๋ถ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ (DB ๊ธฐ๋ฅ ๋ฑ)
imports: [TypeOrmModule.forFeature([User])],
// 2. ์์ฒญ์ ๋ฐ์ ์ปจํธ๋กค๋ฌ
controllers: [UserController],
// 3. ๋ด๋ถ์์ ์ฌ์ฉํ ์๋น์ค (DIP ์์น ์ ์ฉ)
providers: [
UserService,
{
provide: UserRepository, // ์ถ์ํ๋ ๊ท๊ฒฉ(์ธํฐํ์ด์ค)
useClass: TypeOrmUserRepository, // ์ค์ ๊ตฌํ์ฒด
},
],
// 4. ์ธ๋ถ ๋ชจ๋์์๋ ์ธ ์ ์๊ฒ ๊ณต๊ฐํ ์๋น์ค
exports: [UserService, UserRepository],
})
export class UserModule {}โ
๋ชจ๋์ ์ค๊ณํ๋ค ๋ณด๋ฉด ๋จ์ํ ๋๋๋ ๊ฒ ์ด์์ ๋ณต์กํ ์ํฉ์ ๋ง์ฃผํ๊ฒ ๋๋ค. ์ด๋ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ค์ ํฌ์ธํธ๋ค์ด๋ค.
