코딩항해기

[Spring] 2-Layered Architecture (Service, ServiceImpl) 본문

Spring

[Spring] 2-Layered Architecture (Service, ServiceImpl)

miniBcake 2024. 10. 10. 15:44

 

 

Layered Architecture (계층화 아키텍처)

소프트웨어 개발에서 일반적으로 흔히 사용되는 아키텍처의 개념으로 각 구성 요소들의 관심사 분리를 달성하기 위해 책임을 가진 계층으로 분리한 아키텍처이다.

 

관심사의 분리 (Separation of Concerns)
책임(관심사)을 기준으로 다른 책임(관심사)를 분리하는 것

 

 

관심사 분리 필요성

하나의 계층에 관심사가 여러 개 존재한다면 해당 계층의 응집도가 떨어지고, 결합도가 높아진다.

각 계층의 관심사를 기준으로 분리해 계층의 응집도를 높이고 결합도를 낮출 수 있다.

응집도가 높아지고 결합도가 낮아지면 재사용성과 유지보수성이 올라간다.

 

 

2-Layered Architecture (2-Layered 아키텍처)

 

일반적으로 프레임워크 기반의 웹 프로젝트를 보면 2개의 계층을 나누어 시스템을 개발하는데 이를 '2-Layered 아키텍처' 스타일이라고한다. new(컨테이너 등록)의 순서를 컨트롤하기 위해 고안된 아키텍처로 Service 레이어가 추가된다. Service에 관련된 객체를 먼저 컨테이너에 등록하기 위해 루트 컨테이너가 추가된다. 

 

루트 컨테이너는 서버의 시작 때 먼저 객체 등록할 수 있도록 하기 위해 서버 이벤트 감지 Listener를 사용하게 되며 Spring에서는 해당 Lisener를 제공하고 있다. (ContextLoaderLister) 루트 컨테이너는 applicationContext.xml 설정 파일을 참조한다. 기존 경로도 제공하고 있지만 context-param태그를 통해 변경할 수 있다.

 

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
        <!--src/main/resource가 classpath-->
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderLister</listener-class>
    </listener>

 

실행

1. 톰캣 서버 구동 시 web.xml을 확인한다.

2. 서블릿 컨테이너가 구동되며 web.xml에 등록된 컨테이너 객체를 생성한다.

3. 이 때 ContextLoaderLister를 통해 applicationContext.xml을 로딩한다.

4. 부모 컨테이너인 Spring 컨테이너(루트 컨테이너)가 구동되며 메모리에 객체들이 할당된다.

5. 이후 DispatcherServlet을 생성하며 관련 xml을 확인하며 객체를 생성한다.

 

 

Service의 장점

Controller가 DAO에 직접 의존하는 것이 아닌 Service에 의존성을 갖는다면, 이후 DBMS가 변경되어도 코드를 수정하거나 컴파일을 다시 진행할 필요가 없다. DBMS가 변경된다는 것은 DAO가 변한다는 것이기 때문이다.

 

Service은 DAO를 의존주입해 받기 때문에 xml에 DAO를 bean으로 등록해두었다가 DBMS가 변경될 때 bean만 변경한다면 별도의 컴파일(비용) 없이 DBMS를 교환할 수 있다. 물론 @Repository 어노테이션을 통해 bean등록도 가능하다. 하지만 어노테이션의 경우 import에 변동 사항이 생기고, 이는 컴파일을 다시 진행해야한다는 말이다.