아키텍처 정리
개인적으로 백엔드 아키텍처를 구성하면서 생각했던 것들에 대해 정리했다.
나중에 언젠가 발표자료로 쓰고 싶어서 키노트로 정리 중이다.
-> 회사 백엔드 팀 내부에서 간단한 세미나로 공유함
백엔드 아키텍처를 공부하면 매번 나오는 개념들
백엔드 아키텍처에 대한 내용을 검색하면 매번 나오는 개념들이 있다. 바로 IoC와 DI이다. 사실 예전에 어떤 회사의 과제에 해당 개념을 제대로 적용하지 못해 떨어졌던 기억이 있어서 좀 더 자세히 알아보게 됐다.
IoC에 대한 설명
먼저 IoC는 제어의 역전이라는 뜻이다. 위 코드는 Nestjs의 서버 시작점이다. 우리는 bootstrap()이라는 함수의 실행을 통해 서버를 시작하는데 bootstrap() 함수 안에 NestFactory 또는 NestFactory의 내장 함수 create()가 어떤 원리로 동작되는지 모른다. 하지만 해당 기능들의 결과를 알고 있기 때문에 우리가 원하는 기능에 사용할 수 있다.
위는 한가지 예시일 뿐이고, 어떤 기능이나 관리에 대해서 사람이 직접 하는 게 아니라 프레임워크와 같은 소프트웨어에 역으로 맡기는 걸 IoC, 제어의 역전이라고 한다.
DI에 대한 설명
DI는 의존성 주입이라는 뜻이다. 위 코드에서 UserController class는 UserService class의 signUpUser() 함수를 사용해야 한다. 만약 UserService를 외부에서 import 해서 인스턴스화 한 후 바로 사용하거나 UserController 내부에서 직접 인스턴스화 해서 사용하게 될 경우 두 class 간의 강한 의존성이 생겨 사이드 이펙트가 발생할 가능성이 생긴다. 이를 방지하기 위해서 class의 constructor에 들어갈 값의 타입으로 UserService를 받게 되면 서로 간의 의존성이 약해지기 때문에 좀 더 변화에 유연한 코드가 될 수 있다.
(함수의 경우 파라미터로 의존성 주입을 할 수있다)
클린 아키텍처 이해 안 되는 부분
클린 아키텍처에 대해서 여러 가지 규칙들이 있는데 그중 의존성에 대한 부분이 이해가 되지 않았다. 클린 아키텍처는 각 계층 간의 의존성은 안쪽으로만 향해야 한다고 한다.
하지만 일반적인 API가 동작할 때 Service layer(위 그림에선 Entities)에서 비즈니스 로직이 실행되는데 이때 DB에 있는 데이터가 필요하면 DB에 접근해 데이터를 찾아오게 된다.
클린 아키텍처 그림에선 DB의 위치가 Entities의 위치보다 바깥에 있는데 어떻게 접근할 수 있을까? 이 부분에 대한 이해가 되지 않았다.
(개인적으로) 클린 아키텍처에서 가장 중요하다고 생각하는 부분
개인적으로 공부를 하다 보니 해당 그림보다 더 중요한 부분이 있다는 걸 깨달았다. (개인적인 생각임)
바로 Port를 통한 의존성 역전이다. 오른쪽 그림을 보게 되면 Controller에서 Service로 넘어갈 때 Service를 직접 바라보지 않고 Input Port를 바라보는 모습을 볼 수 있다.
정리하자면 Service도 Input Port를 바라보면 Controller, Service 계층이 하나의 추상화된 interface 계층을 바라보는 모습이 된다. DB와 Service도 같은 방식으로 Output Port를 사이에 두고 있다.
BoardsController를 보면 BoardService를 직접적으로 주입받지 않는다. (import 된 BoardService가 없다) 대신 추상화된 interface 객체인 IBoardService를 주입받고 있다.
이를 구현하기 위해선 Nest에서 제공하는 module -> providers:[]에 명시를 해줘야 한다.
사실 위에 나온 DIP를 구현할 때 nestjs를 사용하지 않고 typescript로만 구현하면 타입이 interface이여도 당연히 작동되는게 맞지만 nestjs를 통해 구현하기 때문에 providers에 명시를 해줘야 한다.
결론은 아키텍처를 어떻게 구현하는가 보다 거기에 사용되는 원리가 중요한 것 같다. 공부하다보니 solid원칙이 여기저기서 사용되고..
끝
예제 코드 링크
https://github.com/JooYoung2274/nestjs_prac
'세미나' 카테고리의 다른 글
객체지향적으로 머드게임 만들기 - DI 프레임워크 만들어서 리팩토링 (0) | 2023.05.23 |
---|---|
테스트 구축하기 관련 발표 자료 (0) | 2023.02.28 |
객체지향적으로 간단한 머드게임 만들기 (0) | 2022.12.29 |