기존의 서버는 대부분 모놀리식 형태로 존재하는 경우가 많다. 하나의 큰 돌로 만들어진 건축물처럼 단일 기능, 역할을 담당하고 잇는 서비스를 모놀리식
이라고 하는 경우가 많다. 반대되는 의미로는 마이크로
가 존재한다.
커다란 하나의 어플리케이션에 사용된 꼬일대로 꼬인 스파게티 코드는 서로 의존성이 강해지고, 이후 겉잡을 수 없이 커져버려 수정하기 어려워 지는 경우가 많다. 따라서 사전에 모듈
화 하고, 각 기능들은 서로 의존성을 최소화 하는 것이 굉장히 중요하다.
궁극적인 해결책은 소규모의 소프트웨어를 개발하는 것이다. 스택 전체를 다른 사람들과 파일을 공유하지 않는 Self Contained
인 컴포넌트로 나누고, 추론하기 쉽게 극소수의 파일만 구성하는 것이 좋다.(ex. api, service, DAO, TEST...) 이것을 마이크로서비스
라고들 부른다.
MartinFowler.com 블로그 인용
단일암체 애플리케이션도 성공적일 수 있지만, 점점 더 많은 사람들이 불만을 느끼고 있다 - 특히 더 많은 애플리케이션들이 클라우드로 전개될수록. 변화 주기는 다 같이 묶여 있다 - 애플리케이션의 조그마한 부분을 바꾸면 단일암체 전체를 재건하고 재배치하여야 한다. 시간이 흐를수록 좋은 모듈식의 구조를 유지하는것이 힘들어지고, 모듈 하나에만 작용해야 할 변화가 그 모듈 이내에서만 작용하도록 하는것이 힘들어진다. 더 많은 자원을 필요로 하는 부분만 확장하는 것이 아니라, 확장하려면 애플리케이션 전체를 확장해야한다.
uncle-bob 블로그 인용
...도서관 설계도를 보면, 아마도 커다란 입구, 체크인/체크아웃 구역, 독서실, 소규모 회의실들, 도서관의 모든 책을 수용할 수 있게 책꽂이들을 놓을 만한 공간들이 보일 것이다. 설계도를 보면 도서관이라고 바로 감이 올 것이다.
<좋은예>
<나쁜예>
현재 Express 서버의 경우 단지 Rest api 서버로 활용하고 있는 만큼 단순히 router, handler(controller) 2가지 레이어로 분류해이고, 위의 나쁜예와 유사하게 짜여져 있다. DB 의 경우 sql-server(RDBMS) 로 구성되어있고, DBA가 Stored-Procedure 를 제공해주는 만큼 따로 ORM, JPA 등을 사용하고 있지 않지만, scale-out 과 서버 기능 확장 가능성을 위 사례를 보고 조금 생각해봤다.