[SOLID][Nest.js][Java + Spring] Interface๋ฅผ ํ์ฉํ ๊ฒฐํฉ๋ ๋ถ๋ฆฌ (Interface๋ฅผ ์ด์ฉํ Dependency Injection - DI)
"์ด ํฌ์คํ
์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ [Nest.js] Interface๋ฅผ ํ์ฉํ ๊ฒฐํฉ๋ ๋ถ๋ฆฌ
๐ฝ Interface๋ฅผ ์ด์ฉํ Dependency Injection - DI
๐ฆ ๊ฐ์
SOLID 5 ์์น์ด๋ผ๋ Object-Oriented Programming, OOP (๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)์ Software(์ํํธ์จ์ด) Design(๋์์ธ)์ ๋ค์ฏ ๊ฐ์ง ๊ธฐ๋ณธ ์์น์ด๋ผ๋ ๊ฐ๋
์ด ์์ด์. ์ด ๊ฐ๋
์ ์ฃผ์ ๋ด์ฉ์ ์๊ฐ์ด ์ง๋๋ ๋ณ๊ฒฝ์ด ์ฉ์ดํ๊ณ , ์ ์ง๋ณด์์ ํ์ฅ์ด ์ฌ์ด ์ํํธ์จ์ด ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค๋ผ๋ ๊ฒ์ด์์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ค์ํ ๊ฐ๋
์ผ๋ก ์๋ฆฌ ์ก๊ณ ์์ด์.
์ด๋ฒ ๊ธ์์๋ SOLID 5์์น ์ค ์ฃผ๋๊ฐ ๊ฐ๋ฐํ ๋, ํญ์ ์ฌ์ฉํ๋ ค๊ณ ๋
ธ๋ ฅํ๋ Interface Segregation Principle - ISP (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ณ , ์ด๋ฅผ Nest.js์์๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋๊ฐ? ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๋ ค๊ณ ํด์.
๐ฆ ISP๋?
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ๊ฐ์ฒด๋ ์์ ์ด ํธ์ถํ์ง ์๋ Method(๋ฉ์๋)์ ์์กดํ์ง ์์์ผ ํ๋ค. ๋ผ๋ ์์น์ด์์.
์ฆ, ๊ตฌํํ ๊ฐ์ฒด์๊ฒ ๋ฌด์๋ฏธํ ๋ฉ์๋ ๊ตฌํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐ๋์ ํ์ํ ๋ฉ์๋๋ง์ ์์ ๋ฐ ๊ตฌํํ๋ผ๋ ๊ถ๊ณ ์ฌํญ์ด์์.
๋ง์ฝ ์์ํ ๊ฐ์ฒด์ ๊ท๋ชจ๊ฐ ๋๋ฌด ํฌ๋ค๋ฉด ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์์ ๋จ์์ Interface(์ธํฐํ์ด์ค)๋ก ๋๋๋ ๊ฒ๋ ๊ณ ๋ คํด ๋ด์ผ ํด์.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ท๋ชจ๊ฐ ํฐ ๊ฐ์ฒด๋ฅผ ์์ํ์ ๋, ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ด๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ๋ด ๋ณธ๊ฒ์ด์์.
์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๊ฐ์ฒด๊ฐ ๊ฐ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ์์ํ ๊ฒฝ์ฐ ์ผ์ชฝ ๊ฐ์ฒด๋ ํ์ํ ๋ฉ์๋๊ฐ ๋ชจ๋ ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ด์.
ํ์ง๋ง, ์ค๋ฅธ์ชฝ ๊ฐ์ฒด์ ๊ฒฝ์ฐ Method1์ ๋นผ๊ณ , ๋๋จธ์ง ๋ฉ์๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๋ ์ํฉ์์๋ ๋ถ๊ตฌํ๊ณ , ๊ฐ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ์์ ๋ฐ์๊ธฐ ๋๋ฌธ์ ์์น ์์๋ ํด๋น ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฌ ์ ์(Overriding)ํด ์ฃผ์ด์ผ ํด์.
๋ง์ฝ ์์ ๋์์ธ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๊ฐ ๋์๋ณ๋ก ๊ตฌ๋ถํด ์ธํฐํ์ด์ค๋ก ๋ง๋ค์๋ค๋ฉด ๊ฐ ๊ฐ์ฒด๊ฐ ํ์ํ ์ธํฐํ์ด์ค๋ง์ ์์ํ์ฌ ๊ตฌํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์๊ฐ ํ์ํ ๋ฉ์๋๋ง์ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ด์์.
์ด๊ฒ์ด ๋ฐ๋ก ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ๊ฐ๋
์ด์์.
์ด ๋, ์ธํฐํ์ด์ค์ ์ฅ์ ์ ๋ด๋ถ ๊ตฌํ์ ๋ชฐ๋ผ๋ ์ํธ ์์ฉ์ ํ ์ ์๋ค๋ ์ ์ด์์.
์ด ๋ง์ด ๋ฌด์จ ๋ง์ด๋๋ฉด ๊ฐ์ฒด ์ค๊ณ ์ ์ธ๋ถ๋ก ๋
ธ์ถ๋๋ ์ธํฐํ์ด์ค์ ๋ด๋ถ์ ์จ๊ฒจ์ง ๊ตฌํ์ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค๋ ์๋ฏธ์์.
์ด๊ฒ์ Separation of interface and implementation(์ธํฐํ์ด์ค์ ๊ตฌํ์ ๋ถ๋ฆฌ)๋ผ๊ณ ํด์.
๋, ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด์.
๊ฐ์ฒด ์์ฒด๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ํด๋์ค๊ฐ ์์ ๋, ๋ด๋ถ๊ฐ ์ด๋ป๊ฒ ๋์ด ์๋์ง ์ด๋ค ๋ฉ์๋๊ฐ ์ด๋ ค์๋์ง ๋ฑ์ ๊ณ ๋ คํด์ผํด์.
๋ง์ผ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ฉ์๋๊ฐ ๋ง์ด ์๊ณ , ๊ทธ๊ฑธ ์ ๋ชป ์ฌ์ฉํ๋ค๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ์๋์น ์๊ฒ ๋ณ๊ฒฝํ ์๋ ์๊ณ ,
๊ทธ๋ ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉํ๋ ๊ณณ์์๋ ๊ทธ๊ฑธ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์์ด์.
์ด๋ฅผ ์ํด ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ์ ์ฐํ๊ณ , ์์ ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ์ํด ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์์.
๐ฝ ๊ตฌํํ๊ธฐ
๐ฆ Service Layer
๋ณดํต Backend(๋ฐฑ์๋)์์ MVC Pattern(ํจํด)์ ์ด์ฉํ์ฌ API๋ฅผ ๊ตฌํํ๋ค๋ฉด Controller, Service, Repository๋ก
๋๋์ด ๊ฐ๋ฐ์ ํ๊ฒ ๋ ๊ฑฐ์์.
์ํ๋ง(Java + Spring Boot) ์์๋ฅผ ํ๋ฒ ๋ณผ๊ฒ์.
์ Resolver(๋ฆฌ์กธ๋ฒ) Code(์ฝ๋)๋ฅผ ๋ณด๋ฉด 18๋ฒ์งธ ์ค์ @RequiredArgsConstructor๋ฅผ ์ ์ธํ๊ณ , 22๋ฒ์งธ ์ค์ final Keyword(ํค์๋)๋ฅผ ์ด์ฉํ์ฌ EquipmentService(์ธํฐํ์ด์ค)๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ ์ธํ๊ณ , ์ฌ์ฉํ๋ ๊ฑธ ๋ณผ ์ ์์ด์.
๊ทธ๋ฆฌ๊ณ , ServiceImpl์ Service๋ฅผ implements ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๊ณ ,
๊ฐ ๋ฉ์๋๋ฅผ @Override ํ์ฌ ์ฌ ์ ์ํด์ฃผ๊ณ ์์ด์.
์ด๋ Spring Boot(์คํ๋ง ๋ถํธ) Framework(ํ๋ ์์ํฌ)์ ๊ธฐ๋ฅ์ด ์๋
์์ ์๋ฐ์ ๋คํ์ฑ ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๊ตฌํํ ์ ์์ด์.
์คํ๋ง์ ์์กด์ฑ ์ฃผ์
๋ฐฉ์์ ์คํ๋ง์์ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์์กดํ์ฌ๋
์คํ๋ง Container(์ปจํ
์ด๋)๊ฐ Runtime(๋ฐํ์) ์์ ์ ์คํ๋ง Bean(๋น)์ ๋ฑ๋ก๋ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ์์ด์์.
์ ์ฝ๋์์๋ EquipmentService ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ,
๊ตฌํ์ฒด์ธ EquipmentServiceImpl์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ฒ ๋๋ต๋๋ค.
Nest.js ์ญ์ TypeScript์์ ์ด๋ฐ ๋คํ์ฑ์ ์ ๊ณต(JavaScript ES6์์๋ ๋ฏธ์ง์) ํ์ง๋ง, TypeScript์ ๊ฒฝ์ฐ Compile(์ปดํ์ผ) ์์ ์๋ง ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๊ณ , ๋ฐํ์ ์์ ์๋ ์ธํฐํ์ด์ค๊ฐ ์ฌ๋ผ์ง๋ ํน์ฑ๊ณผ ํจ๊ป Nest.js ํน์ฑ(Module)์ผ๋ก ์ธํด ์คํ๋ง ๋ถํธ๋ณด๋จ ์กฐ๊ธ ๋ ์์
ํ ๊ฒ์ด ์์ด์.
์คํ๋ง์ด์๋ค๋ฉด ์ฌ๊ธฐ๊น์ง ํด์ฃผ๊ณ , Controller์์ ์ด๋ฅผ ์ฃผ์
ํด์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง,
Nest.js์์๋ ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ์ฉํ ์ ์์ด์.
๋ฐ๋ก ์์ ๊ฐ์ด ๋ชจ๋์ ๋ฑ๋กํด์ฃผ์ด์ผ ํด์.
๊ทธ๋ฆฌ๊ณ Controller์์ ์์ ๊ฐ์ด ์์ฑ์์ ์ธ์๊ฐ์ผ๋ก @Inject("...")๋ฅผ ์ถ๊ฐํด ์ค์ผ ํ๋๋ฐ, @Inject()์ ์ธ์๊ฐ์ ๋ชจ๋์ provide ๊ฐ์ฒด์ ๊ฐ์ ๋ช
์ํด ์ฃผ์ด์ผ ํด์.
์ด๋ฅผ ํตํด Provider(ํ๋ก๋ฐ์ด๋)๋ฅผ ๋ชจ๋์ ๋ฑ๋กํ ๋, ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ํ๋ก๋ฐ์ด๋ ๋ฌธ์์ด Token(ํ ํฐ)์ ์ฃผ์
ํด์ฃผ์ด์ผ ํ๋ ๋ฐฉ์์ด์์.
์ผ๋ฐ์ ์ผ๋ก ํ๋ก๋ฐ์ด๋ ์ฃผ์
์ ์์ฑ์ ์ฃผ์
ํจํด์ ์ฌ์ฉํ์ฌ ํ๋ก๋ฐ์ด๋๋ฅผ ์ฃผ์
ํ๊ฒ ๋์ง๋ง, ์ด ํจํด์ ์ฌ์ฉํ๋ ค๋ฉด Class(ํด๋์ค)๋ฅผ ์์กดํ๊ณ ์์ด์ผ ํ๋ฉฐ, ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๊ณ ์์ผ๋ฉด ์์ฑ์ ์ฃผ์
ํจํด์ ์ฌ์ฉํ ์๊ฐ ์์ด์.
์ด๋ ๋ฐํ์ ์์ ์ ์ธํฐํ์ด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ด์์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๊ฐ์ด ์์ฑ์๋ฅผ ์ด์ฉํด ๋ฌธ์์ด ํ ํฐ ๋ฐฉ์์ผ๋ก ํ๋ก๋ฐ์ด๋๋ฅผ ๋ฑ๋กํ์ฌ ์์กด์ฑ ์ฃผ์
์ ํ๊ณ , ์ฃผ์
ํ ์ธํฐํ์ด์ค ๋ฉค๋ฒ ๋ณ์์ @Inject(...)๋ฅผ ๋ฌ์์ฃผ์ด ๋ชจ๋์ useClass์ ๋ช
์ํ ๊ตฌํ์ฒด๊ฐ ์ฃผ์
๋ ์ ์๋๋ก ํด์ค์ผ ํด์.
๊ตฌํ์ด ์ ๋์๋ ํ์ธ์ ์ํด ์๋ฒ๋ฅผ ๊ตฌ๋ํ๊ณ , PlayGround๋ก ํ
์คํธ๋ฅผ ์งํํด ๋ณผ๊ฒ์.
์์ ๊ฐ์ด ์ ์ ์๋ํ๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ง ์ฐธ๊ณ ์๋ฃ