본문 바로가기
  • Where there is a will there is a way.
개발/spring

애플리케이션 아키텍처

by 소확행개발자 2020. 7. 19.

아키텍처는 어떤 경계 안에 있는 내부 구성요소들이 어떤 책임을 갖고 있고, 어떤 방식으로 서로 관계를 맺고 동작하는지를 규정하는 것이라고 할 수 있다. 아키텍처는 단순히 정적인 구조를 나타내는 것으로만 생각하기 쉽지만 실제로는 그 구조에서 일어나는 동적인 행위와 깊은 관계가 있다.

 

아키텍처 설계는 여러가지가 있다.

 

시스템 레벨의 아키텍처 , 애플리케이션 레벨의 아키텍처 , 데이터 아키텍처등 

 

이 글에서는 스프링 웹 애플리케이션 아키텍처에 대해서 정리해보겠다.

 

1. 계층형 아키텍처

 

우리는 자바 애플리케이션을 설계할때 우선적으로 성격이 다른 코드가 얽혀 있는 것을 두 개의 오브젝트로 분리하고, 그 사이에 유연한 결합을 가질 수 있도록 인터페이스를 두고, 그 관계를 맺어주는 제 3의 존재인 DI 컨테이너를 둬서 오브젝트기리는 직접적인 관계를 알지 못하도록 만들었다. 

 

이런 기본적인 원리는 아키텍처 레벨에서 좀 더 큰 단위에 대해서도 동일하게 적용할 수 있다.

 

애플리케이션을 구성하는 오브젝트들을 비슷한 성격과 책임을 가진 것들끼리 묶을 수 있다. ( 데이터 엑세스 로직을 담당하는 DAO 들 또는 비즈니스 로직을 구현해놓은 비즈니스 서비스 오브젝트들도 같은 성격으로 묶을 수 있다. )

 

서비스 오브젝트들은 특정 기술과 환경에 종속되지 않으면서 도메인의 업무에는 밀접하게 관련을 갖고 있는 POJO 로 만들어진다. 

 

웹을 처리하는 코드 또한 독자적인 성격으로 분리가 가능하다. -> 서블릿 컨테이너로부터 받은 사용자의 요청정보를 해석해서 그것을 POJO 기반의 서비스 오브젝트에 전달해주고, 결과를 받아서 다시 웹 사용자 인터페이스에 표시 가능한 형태로 변환해주는 역할을 한다.

 

이렇게 책임과 성격이 다른 것을 크게 그룹으로 만들어 분리해두는 것을 아키텍처 차원에서는 계층형 아키텍처라고 부른다.

 

  • 3계층 아키텍처와 수직 계층

 

데이터 액세스 계층

사용 기술에 따라서 다시 세분화된 계층으로 구분될 수 있다. 데이터 엑세스 계층에서의 세분화이기 때문에 3계층 구조와 달리 수직적인 계층으로 표현한다. ( 내부적으로는 )

 반면에  같은 책임을 가졌지만 추상화 레벨에 따라 구분하는 경우는 세로로 배열해서 표현한다.

 

서비스 계층

잘 만들어진 스프링 애플리케이션의 서비스 계층 클래스는 이상적인 POJO 로 작성된다. 서비스 계층은 특별한 경우가 아니라면 추상화 수직 계층구조를 가질 필요가 없다. 단순히 POJO 레벨에서 비즈니스 로직을 모델링하다가 상속구조를 만들 수 있을진 몰라도 기술 API 를 직접 다루는 코드가 아니기 때문에 기술에 일관된 방식으로 접근하게 하거나 편하게 사용하게 해주는 추상화는 필요 없기 때문이다. 

 

여기서 추가적으로 만약에 스케줄러 같은 서비스나 메시징 서비스 메일 서비스는 어느 계층에 속하는게 맞다고 판단되는가 ? 라는 궁금증이 생길 수 있다.

이런 서비스는 기반 서비스 계층이라고 표현하며 모든 계층에서 접근이 가능하게 하며 원칙적으로 서비스 계층 코드가 기반 서비스 계층의 구현에 종속되면 안된다. 

 

 

프레젠테이션 계층

 

프레젠테이션 계층은 매우 다양한 기술과 프레임워크의 조합을 가질 수 있다. 웹기술은 끊임없이 발전하고 새로운 모델이 등장하기 때문에 더욱 그렇다.

 

앤터프라이즈 애플리케이션의 프레젠테이션 계층은 클라이언트의 종류와 상관없이 HTTP 프로토콜을 사용하는 서블릿이 바탕이 된다. 

 

모든 프레젠테이션 로직은 서버의 프레젠테이션 계층의 컴포넌트에서 처리된다. 화면 흐름을 결정하는 것이나 ( 어떤 화면을 보여줄지에 대한 결정 권 ) 사용자 입력 값에 대한 검증 ( 유효한 접근에 인지에 대한 검증 ) , 서비스 계층의 호출과 전달되는 값의 포맷의 변화, 뷰라고 불리는 화면을 어떻게 그릴지에 대한 로직등이 모두 서버에서 처리됐다.

-> 이때의 클라이언트는 단순히 서버 프레젠테이션 계층의 기능에 대한 사용자 인터페이스에 불과했다. 하지만 최근에는 점점 많은 프레젠테이션 로직이 클라이언트로 이동하고 있다 ( 이거는 어떻게 프론트랑 이야기하는지에 따라 다르겠지만 )

 

 

댓글