아키텍처(architecture)는 건축 분야에서 유래된 용어로써 요구 사항을 만족하는 건축물을 짓는데 있어 청사진같은 역할을 함. 컴퓨터 시스템에서의 아키텍처란 어떠한 시스템을 구축하는데 있어 해당 시스템의 비즈니스적 요구사항을 만족하는 전체 시스템 구조를 정의하는 것이며, 이해 당사자들이 전체 시스템 구조를 이해하는데 무리가 없도록 일반적으로 이미지나 도형 등을 많이 사용함. 아키텍처의 범위를 어디까지로 할 것이냐에 대해서는 의견이 분분하자만 아키텍처는 우선 너무 복잡하면 안됨. 물론 거대하고 방대한 시스템이라면 어쩔 수 없이 어느 정도의 복잡함이 아키텍처 내에 표현될 수 밖에 없지만 기본적으로 최대한 심플함을 유지하기 위해 노력해야함.
시스템 아키텍처
시스템 아키텍처는 하드웨어와 소프트웨어를 모두 포함하는 어떤 시스템의 전체적인 구성을 큰 그림으로 표현한 것. 시스템 아키텍처를 통해 기본적으로 해당 시스템이 어떤 하드웨어로 구성되고, 어떤 소프트웨어를 사용하는지 대략적으로 알 수 있음. 또한 해당 시스템 구성 요소들 간의 상호작용이 어떻게 이루어지는지 등 시스템이 정상적으로 동작하기 위한 동작 원리 등이 시스템 아키텍처 안에 표현이 되면 이해 당사자들이 해당 아키텍처를 이해하는데 도움이 됨.
시스템 아키텍처 사례
위 그림은 채팅 서버를 구축하기 위한 전통적인 시스템 아키텍처라고 함. 채팅 사용자가 많지 않다면 위 그림과 같은 아키텍처만으로 해당 시스템을 이해하는데 큰 무리가 없음. 하지만 사용자가 많아진다면 그림과 같은 아키텍처에는 문제가 발생함. 우선 사용자의 요청을 단일 서버가 모두 처리하기 때문에 제한적인 사용자 요청만 처리할 수 있음. 즉 사용자의 요청이 늘어나는 상황에 대비하기 위한 시스템 확장에 대한 부분이 전혀 고려되지 않음. 그리고 웹ㅂ소켓 서버가 단일 서버이기 때문에 해당 서버가 다운되면 시스템 전체가 죽게되는 문제가 있음.
채팅 서버 아키텍처를 개선한 아키텍처 모습.
개선된 점
채팅 서버의 전송 속도를 향상 시키는 것을 목적으로 한번 더 제안된 아키텍처임.
소프트웨어는 하드웨어를 제외한 컴퓨터 내의 모든 프로그램을 포괄하는 의미를 가지고 있으며 이러한 소프트웨어의 구성을 큰 그림으로 표현한 것이 스프트웨어 아키텍처임. 소프트웨어 아키텍처 사례의 대표적인 것이 바로 Java 플랫폼 아키텍처임.
위 그림은 Java를 포함한 Java 플랫폼에 대한 아키텍처를 마치 벽돌을 쌓은 듯한 모습으로 표현한 아키텍처임. 이 아키텍처를 통해 Java가 어떤 기술들을 지원하고 Java를 통해서 어떤 기능들을 사용할 수 있는지 등을 큰 그림으로 접근할 수 있음
알아야 할 애플리케이션 아키텍처
애플리케이션은 소프트웨어 종류의 하나로써 좁게는 데스크탑이나 스마트폰에서 사용하는 응용 프로그램을 말하며 넓게는 클라이언트의 요청을 처리하는 서버 애플리케이션을 의미함. 애플리케이션의 아키텍처 유형에는 다양한 유형이 있지만 우리가 앞으로 만들게 될 웹 애플리케이션과 연관이 있는 계층형 아키텍처(N-티어)에 대해서 알아볼 것임.
API 계층(API Layer)
API 계층은 클라이언트의 요청을 받아들이는 계층임. 일반적으로 표현 계층(Presentation Layer)라고도 불리지만 REST API를 제공하는 애플리케이션의 경우 API 계층이라고 표현함.
서비스 계층(Service Layer)
서비스 계층은 API 계층에서 전달받은 요청을 업무 도메인의 요구 사항에 맞게 비즈니스적으로 처리하는 계층임. 애플리케이션의 핵심 로직은 서비스 계층에 포함되어 있다고 해도 과언이 아닐만큼 애플리케이션에 있어 핵심이 되는 계층임
도메인이란, 주로 비즈니스적인 어떤 업무 영역과 관련이 있음. 예를 들어 새로운 배달 주문 앱을 만들 때 고객과 음식원, 배달원 그리고 카드사 또는 은행 등 배달 주문 앱을 구현하기 위해 필요한 업무를 자세히 알면 알수록 퀄리티가 높은 애플리케이션을 만들 가능성이 높음. 즉 고객이 음식을 주문하는 과정, 주문을 처리하는 과정, 조리된 음식을 배달하는 과정 등의 도메인 지식(Domain Knowledge)들을 서비스 계층에서 비즈니스 로직으로 구현해야하는 것임.
Spring framework에서는 약 20여개의 모듈을 통해 다양한 기능들을 제공하는데, 앞서 언급했던 AOP, Aspect, Servlet, Web같은 용어들 역시 아키텍처에서 확인할 수 있음.
모듈이란 Java에서 일반적으로 지원되는 여러가지 기능들을 목적에 맞게 그룹화하여 묶어놓은 것. 이러한 모듈들은 Java의 패키지 단위로 묶여 있으며, 이 패키지 안에는 관련 기능을 제공하기 위한 클래스들이 포함되어 있음. 일반적으로 모듈은 재사용 가능하도록 라이브러리 형태로 제공되는 경우가 많음