[Nest.js] Layered Architecture ( 계층화 구조 ) 는 무엇이고 왜 사용할까?
Nest.js의 동작 구조
[Nest.js] Nest.js의 동작 구조
🐳 왜 Nest.js의 구조를 알아야 하는가 뭐든지 새로운 것을 배울 때는 그 기술들이 왜 나오고 어떤 메커니즘으로 동작하는지 아는 것이 가장 중요하다. 특히나 Nest.js는 다른 node.js 프레임워크에는
programmer-hoo.tistory.com
🐳 Layered Architecture ( 계층화 구조 ) 란?
말 그대로 여러 계층을 나눈 구조를 의미한다. 이 때 한 계층에는 여러 컴포넌트 들이 존재하는데 각각의 컴포넌트들은 특정 역할만을 수행한다. 이러한 컴포넌트들로 이루어진 계층을 여러 개 만들어 구조를 만드는 것을 계층화 구조 ( Layered Architecture ) 라고 한다.
Architecture를 설계함에 있어 몇 개의 Layer를 사용해도 괜찮지만 보통은 네 개의 아키텍쳐로 나눈다.
- Presentation Layer
- Business Layer
- Persistence Layer
- Databse Layer
🐳 Layered Architecture ( 계층화 구조 )의 핵심 개념
🎯 계층은 다른 계층에 대해 닫혀있다 !
계층은 다른 계층에 대해 닫혀 있다. 그렇기 때문에 한 번에 다른 계층으로 이동하는 것이 아니라 인접한 계층을 차례차례 지나가야 한다.
이러한 계층은 서로 다른 계층 간의 고립을 위해 만들어졌다.
계층 간의 고립은 한 계층의 변화가 다른 계층에 영향을 거의 미치지 않는 다는 것이고 다른 계층에 독립적이라는 것이다.
즉 다른 계층에 대해 거의 알지 못하더라도 구현이 가능하다는 것이다.
이러한 두 특성에 의해 개발의 편리성이 증가한다.
그렇다면 우리는 이런 질문을 던질 수 있을 것이다.
Controller Layer에서 Database를 바로 접근하는 것이 효율적인 경우 다른 계층을 거치지 않고 Database를 거치는 것이 더 효율적이지 않을까?
왜 계층형 구조는 인접한 계층을 차례차례 지나가야 하는 걸까?
계층을 개방해 다른 계층을 연결할 경우 두 계층간의 결합도( Coupling )가 증가하기 때문에 관리하기가 더 어려워 지게 된다
우리는 이러한 일을 피하고자 계층형 구조를 사용는 것이다.
🐳 그렇다면 계층형 구조를 언제 사용하는 것이 좋을까 ?
특별하게 어울리는 아키텍처가 보이지 않는다면, Layered Architecture는 대부분의 어플리케이션에 사용하기 적합하다.
하지만 ! 주의해야 할 포인트 두 가지가 있다.
첫 번째
Architecture sinkhole 이다. 이는 모든 계층에서 거의 아무 작업도 하지 않고 그냥 거쳐가는 것을 말한다.
계층형 구조의 특성상 이런 일은 반드시 발생하기 마련이기 때문에 아예 발생하지 않을 수는 없다. 하지만 그 비율이 중요하다.
20 : 80 정도의 비율로 20% 정도가 계층을 단순하게 지나가는 정도의 비율이라면 괜찮다.
하지만 Architecture sinkhole의 비율이 20%가 넘어가게 되는 경우 특정 계층을 개방하는 것을 고려해 봐야 할 것이다.
하지만 이렇게 될 경우 계층간의 결합도가 증가하게 되므로 더 고려해야 할 것이 많아지게 될 것이다 !!
두 번째
Layered Architecture 패턴은 배포 가능한 단위로 계층을 분리하긴 하지만 모놀리식 응용프로그램에 적합한 경향이 있다는 것입니다. ( 모놀리식 응용프로그램 )
그렇기 때문에 배포, 안정성, 성능 및 확장성 측면에서 잠재적 문제가 생길 수 있다 !
🐳 Layered Architecture ( 계층화 구조 )의 특성 정리
1. 전반적인 속도 및 성능 : 느림
당연하게도 여러 계층을 거쳐가게 되므로 속도 및 성능 측에서 비효율적인 부분이 존재하고 이는 속도와 성능의 저하로 연결된다.
2. 배포의 편리성 : 낮음
한 부분을 변경하더라도 전체를 재배포 해야 하는 경우가 많기 때문에 배포가 어려운 경향이 있다. ( 아마 모놀리식 어플리케이션 성질을 가지기 때문이다 ... )
3. 테스트 용이성 : 높음
계층을 분리해서 구현하기 때문에 계층별로 테스트하기가 쉽고 다른 계층을 Mocking해 테스트 하기가 쉽다 !
4. 확장성 : 낮음
하나의 통일된 모놀리식 응용 프로그램을 지향하기 때문에 유동성이 떨어진다.
5. 개발 편리성 : 높음
구현 자체가 어렵지 않고 보편적인 아키텍처이기 때문에 개발 편리성은 높은 편이다.
또한 다른 계층에 대한 정보를 거의 몰라도 계층을 구현 가능하기 때문에 개발 편리성 및 난이도가 낮은 편이다.
🐳 정리
공학이라는 것은 결국에는 Trade Off를 선택하는 일이라고 생각한다. 투자를 많이하고 돈을 많이 쓴다면 당연히 성능은 올라가겠지만 과연 그게 수익성이 좋은 일일까?
결국 모든 것은 장점과 단점을 판단해 선택하는 일이라고 생각한다.
그런 의미로 Layered Architecture 또한 마찬가지이다. 하나의 아키텍처가 모든 프로그램에 적합하다고 할 수는 없을 것이다.
그렇기 때문에 각각의 아키텍처가 어떤 장점이 있고 어떤 단점이 있는 지를 파악해 알맞은 아키텍처를 선택해야할 것이다.
🐳 참고자료
https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
https://en.wikipedia.org/wiki/Multitier_architecture