나를 다시 붙잡는 심정으로, 마음을 다잡는 심정으로 - 브런치 1
부제에서도 보이지만 당분간 쓸 글은 '나를 다시 붙잡는 심정으로, 마음을 다잡는 심정으로' 시리즈가 될 듯싶다. 기본을 돌아보고 싶을때, 마음을 다잡고 싶을때 가볍게 보는 그런 기술 브런치를 작성해 나가려고 한다.
다중 아키텍처는 애플리케이션을 여러 계층으로 나눈 아키텍처이다.
운영 환경에 적합하기 때문에 대부분의 실제 애플리케이션이 다중 아키텍처로 설계되어있다.
그중 계층을 3개로 나눈 3계층 구조는 가장 인기 있는 아키텍처로서 웹 애플리케이션을 설계할때 많이 사용된다.
- 클라이언트 계층: 사용자 인터페이스를 제공하는 계층. 보통 프론트엔드라고 부른다.
- 애플리케이션 계층: 비즈니스 로직, 상호작용을 위한 인터페이스, 데이터를 저장하는 인터페이스를 포함하는 계층, 보통 백엔드라고 부른다.
- 데이터 저장 계층: 애플리케이션의 데이터를 보관하는 계층. 데이터베이스, 파일 시스템 등
이중 애플리케이션개발자는 당연스럽겠지만 애플리케이션 계층에 중점을 두게된다.
애플리케이션 계층을 세 개의 레이어로 나눌수 있는데 비즈니스 레이어, 프리젠테이션 레이어, 데이터 레이어 이다.
- 비즈니스 레이어: 도메인과 비즈니스 명세를 모델링한 클래스가 있다. 애플리케이션의 두뇌 역할을 한다. 보통 개체와 비즈니스 로직을 제공하는 서비스의 조합으로 이루어진다. 해당 레이어를 도메인(개체)과 애플리케이션(서비스)으로 나누기도 한다.
- 프리젠테이션 레이어: 우리가 만들 애플리케이션에서는 웹 클라이언트에 기능을 제공하는 컨트롤러 클래스가 프리젠테이션 레이어에 해당한다. 이 컨트롤러에 REST API를 구현한다.
- 데이터 레이어: 개체들을 데이터 스토리지나 데이터베이스에 보관한다. 보통 데이터 액세스 객체(DAO) 또는 저장소 클래스를 포함한다. DAO는 데이커베이스 모델을 다루고, 저장소크랠스는 도메인을 데이터베이스 레이어로 변환하는 클래스이다.
이렇게 레이어를 분리하고 결합도를 낮추는 아키텍처를 구성하게되면 여러 이점을 얻을 수 있지만 여기서는 세가지만 소개하겠다.
1. 도메인과 솔루션이 분리되며 인터페이스나 데이터베이스 명세와 섞여 있지 않는다.
2. 프리젠테이션과 데이터에리어는 다른 레이어로 교체할 수 있다.
- 클린아키텍처를 읽고 참고하면 좋은데 거기서 로버트 C 마틴형은 이렇게 말씀하셨다. '어떤 데이터베이스를 쓸지는 중요하지 않습니다. 업무의 업무 로직을 담당하는 코드들이 DB 또는 Web 같이 구체적인 세부 사항에 의존하지 않아야 합니다. 이를 통해 업무 로직(고수준 정책)은 세부 사항들(저수준 정책)의 변경에 영향을 받지 않도록 할 수 있습니다.'
3. 각 레이어의 역할이 명확히 구분된다. 비즈니스 로직을 처리하는 클래스, REST API를 구현하는 클래스, 객체를 데이터베이스에 저장하는 클래스노 나눈다.
필자는 스프링프레임워크를 좋아한다. 로버트 C 마틴형이 프레임워크와 결혼하지 말라고 하셨지 좋아하지 말라고는 안 하셨으니까... 스프링은 위에 설명한 3계층의 구조의 애플리케이션을 만들기 위한 훌륭한 도구를 제공한다. 느껴보고 싶다면 스프링 이마저도 부담된다면 스프링부트로 빠르게 한번 경험해보기를 바란다.
이번 브런치는 여기까지이다.
여담이지만 로버트 C 마틴형은 프레임워크와의 결혼을 우려하셨는데 이는 프레임워크도 세부 사항일 뿐이기 때문이다. 프레임워크는 아키텍처의 바깥쪽 원에 속하는 세부사항으로 취급해야 하며 프레임워크가 아키텍처 안쪽으로 들어오면 안 된다.
프레임워크가 핵심 코드 안으로 들어오지 못하게 하며, 대신 핵심코드에 플러그인 할 수 있는 컴포넌트에 프레임워크를 통합하고, 의존성 규칙을 준수해야 한다.