Java2EE Framework/프레임워크 개념

계층화 아키텍처(Layered architecture)

본클라쓰 2010. 5. 5. 12:00

 

대부분의 중/대규모의 어플리케이션은 효율적인 개발 및 유지보수를 위해 계층화(layered)하여 개발하는 것이 일반적이다.

 

계층화 아키텍처는 MVC으로 대표되는데 MVC 패턴의 특징은 다음과 같다.

  • 컨트롤러와 모델과는 독립적으로 뷰를 수정할 수 있다.
  • 모델 컴포넌트는 뷰와 컨트롤러 컴포넌트로부터 데이터 구조와 같은 내부적인 상세한 사항을 숨긴다.
  • 모델에 인터페이스를 가능한 한 사용하면, GUI 또는 J2ME와 같은 영역에서도 재사용이 가능하다.
  • 컨트롤러에서 모델 코드 부분을 분리하면 원격 비즈니스 컴포넌트 사용으로 옮겨가는 것이 수월하다.

 

 이와 같이 계층화 아키텍처는 UI의 로직과 비즈니스 로직은 어떻게 구현하고 어디에 위치시킬 것인가, 그리고 어플리케이션에 필요한 데이터 및 어플리케이션의 상태는 어떻게 유지하고 공유할 것인가 등에 대해서 정의하고 각 계층을 분할한다. 계층의 분할에 있어서, 각 계층의 역할과 각 계층을 연결하기 위해 사용할 기술 요소들과 특정 계층을 교체하거나 변경할 경우 다른 계층들에 영향을 주지 않을 정도의 유연성에 대해서 반드시 고려해야 한다.

 

MVC 패턴을 더욱 세분화하면 다음과 같이 계층을 구분할 수 있다.

 

 

 이와 같이 계층을 프리젠테이션(Presentation), 제어(Control), 비즈니스 로직(Business Logic), 퍼시스턴스(Persistence), 도메인 모델(Domain model)로 구분한다.

 

 

● 프리젠테이션 계층(Presentation Layer) -  표현과 이벤트 처리, 데이터 포맷 책임

 

 사용자와의 최종 접점으로 사용자로부터 데이터를 입력받거나 데이터를 출력해 보이는 계층이다. 프리젠테이션 계층은 외부로부터의 어플리케이션에 대한 요구를 받아들이는 부분인 동시에 처리 결과를 사용자에게 보여주는 부분이며, event-driven 방식의 GUI에 기반한 프리젠테이션을 포함하고 있으며, 이벤트 처리 및 데이터 포맷팅을 책임진다.

 

 프리젠테이션 계층은 컨트롤러의 구성 요소와 상호 작용한다.

 

 

 제어 계층(Control Layer) -  구성 요소간의 처리흐름의 제어, 데어터 조작 의뢰, 데이터 변환 및 연산, Exception, Error 처리

사용자로부터 요청을 받고 응답을 처리하는 계층이다. 뷰 층으로부터 이벤트를 메시지로 전환하여 Model에게 전달하는 사용자 입력에 대한 응답 메카니즘을 포함한다.

 

 하위 계층에서 발생하는 Exception이나 Error에 대한 처리를 맡으며, 최종 프리젠테이션 계층에 표현해야 할 도메인 모델을 엮는 기능, 사용자로부터 받은 데이터의 유효성 검증(Validation)을 처리 한다. 비즈니스 로직과 프레젠테이션 계층을 분리하기 위한 컨트롤러의 역할도 하며, 전체 시스템의 설정 상태를 유지하고, 요청에 해당하는 비즈니스 로직을 결정하는 역할을 한다.

 

 즉, 사용자의 요청을 검증하고 로직에 요청을 전달하는 일과 로직에서 전달된 응답을 적절한 뷰에 연결짓는 것이 제어 계층의 몫이다. 즉 "what to do" 를 담당하는 계층이다.

 

 

비즈니스 계층(Business Layer) - 컨트롤러와 뷰를 연결하는 역할, 다른 계층과 통신하기 위한 인터페이스 제공, 트랜잭션 처리 등

 

 애플리케이션의 비즈니스 로직 처리와 비즈니스와 관련된 도메인 모델의 적합성을 검증한다. 또한, 트랜잭션 처리와 제어 계층과 퍼시스턴스 계층 사이를 연결하는 역할로서 두 계층이 직접적으로 통신하지 않게 하여 애플리케이션의 유연성을 증가시킨다.

 즉, 다른 계층들과 통신하기 위한 인터페이스를 제공한다. 핵심 업무 로직의 구현과 그에 관련된 데이터의 적합성 검증 이외도 다양한 부가적인 구현이 추가된다. 즉, "how it's done" 를 담당하는 계층이다.

 

※ 모델계층

비즈니스 계층와 퍼시스턴스 계층을 합치면 모델 계층이 된다. 모델 계층은 어플리케이션에 필요한 지속성 있는 데이터를 조작하며, 데이터베이스/파일의 데이터를 조작하는 기능을 수행한다. 또한, 인터페이스를 통해 데이터의 직접적 조작(입력, 수정, 삭제, 조회)을 담당한다.

 

 

퍼시스턴스 계층(Persistence Layer)

 

 영구 데이터를 빼내어 객체화 시키며, 영구 저장소에 데이터를 저장, 수정, 삭제하는 계층이다. 즉, 데이터베이스나 파일에 접근하여 데이터를 CRUD 하는 계층이다. 이 계층에서 사용할 수 있는 프레임워크로는 JDO, Hibernate, ibetis, EJB가 있다.

  

 

도메인 모델 계층(Domain Model Layer)

 

 관계형 데이터베이스의 엔티티와 비슷한 개념을 가지는 것으로 데이터 객체를 말한다.

 

 

 이렇게 계층을 분리하는 이유는 비즈니스 계층과 퍼시스턴스 계층이 해야 할 모든 작업을 JSP가 담당하게 된다면 JSP내에서 구현해야 할 작업이 너무 많아짐으로써 코드가 복잡해 짐으로 유지보수가 어려워짐을 막는 것이다. 이와 같이 명확하게 계층화하여 구현해야 재사용성이 높아지게 된다. 하나의 계층에서 모든 작업을 전담하는 경우 같은 작업을 반복해서 구현해야 하는 경우가 발생하게 되며, 이로 인해 많은 중복 코드가 발생하게 된다. 이는 향후 중복 코드의 변경이 필요한 경우 모든 소스 코드를 수정해야 하는 번거로움이 발생하게 된다.

 

 작은 애플리케이션은 계층을 분리하지 않고 로직과 표현을 하나에 처리해도 문제가 발생하지 않는다. 또한, 개발 생산성에서도 유용하다. 하지만 애플리케이션이 커지고 복잡해지는 대규모의 프로그램을 작성할 경우 로직과 표현이 섞여 있는 프로그램 코드는 유지보수나 확장성에 문제가 많다. 이렇게 계층을 구분하여 프로그램을 작성하면 각 계층간의 역할에 집중할 수 있으며 프로그램의 유연성과 확장성 및 재사용성을 높일 수 있다.

 

 

※ 참고 - 계층간 개발 순서

이렇게 프로그램을 계층으로 구분한 후 개발을 시작할 때 어느것부터 작성하는 것이 맞느냐의 문제이다. 보통, 도메인 모델 -> 퍼시스턴스 -> 서비스 -> 컨트롤러 -> 뷰 순으로 작업을 진행한다.

 

이는 프로그램의 특성 상 데이터에 먼저 접근하는 것이 바르기 때문이다.