들어가며
스프링을 사용함에 있어서 Layered Architecture 사용하게 되었는데 이게 어떤 것이고 왜 쓰는지에 궁금증이 생겼다.
Layered Architecture
소프트웨어 개발에 일반적으로 사용되는 아키텍처이다. 계층형 아키텍처라고도 하는데, 계층의 숫자에 따라 N-tier Architecture라고도 할 수 있다.
💡 아키텍처란 ?
시스템의 구조, 동작을 정의하는 개념적인 모형이다. 레이어드 아키텍처는 계층형을 통해서 시스템의 구조, 동작을 정의한다.
계층형 아키텍처는 수직적인 구조로 여러 계층을 각각의 역할에 따라 나눌 수 있다. 이렇게 나눔으로써 각각의 계층은 자신에게 맞는 역할만 수행하게 되고 이에 따라 유지보수와 테스트하기가 용이하다.
계층이 어떻게 나뉘는가 ?
계층자체의 역할, 개수는 정해져있지 않다. 사용자에 따라서 정의할 수 있다.
일반적으로 많이 쓰는 계층은 Presentation, Business, Persistence, Database 4계층으로 나뉘어 많이 사용한다.
어플리케이션의 규모가 작을 경우 이보다 작을 수 있고 규모가 클 경우 이보다 클 수 있다.
레이어로 구성되지 않았을 경우 발생할 수 있는 문제점?
프로세스 수행을 위한 코드가 중복되어지고, 특정 서비스 코드를 수정하고자 할 때 많은 부분의 서비스를 수정하여야 한다. 가독성이 나빠질 수 있다.
그럼 레이어를 구성하지 않고 중복코드를 제거할 수 있을까 ?
객체지향적으로 모듈화를 할 수는 있으나 코드의 양이 많아짐에 따라 관리가 어려워질 수 있다.
계층화된 아키텍처 패턴
계층들은 비즈니스 요청을 충족하기 위해 수행해야하는 작업을 추상화한다.
예를들어 Presentation Layer는 비즈니스 로직에 대해 알 필요 없이 화면에 표시하기만 하면 된다.
계층을 나눔으로써 한계층에서 이루어진 변경 사항이 다른 계층의 구성 요소에 영향을 주지 않게 된다. 이렇게 함으로써 각 계층은 다른계층의 내부 작업에 대해 알 필요가 없어진다.
Presentation Layer
클라이언트에 보여지는 정보를 표현하는 계층이다. 데이터가 어떻게 처리되는지 알 필요가 없다. 브라우저와의 communication에 대한 책임을 갖는다. Controller, View가 이에 해당한다.
Business Layer
비즈니스 로직을 수행하는 계층이다. Presentation Layer가 하는 데이터를 어떻게 표현하는지에 대해 알 필요가 없다. Service, Model 등이 이에 해당한다.
Persistence Layer
데이터의 영속성을 구현하기 위해 특정 데이터가 어디서 불러져왔는지, 어떻게 다루는지를 수행한다. Repository, Dao가 있다.
💡 영속성이란 ?
데이터를 영구 저장할 수 있는 데이터의 특성을 의미한다. 영속성이 없을 경우 데이터는 메모리에서만 존재한다.
Database Layer
DB가 위치한 계층이다.
수직적으로 구성된 격리된 계층화된 아키텍쳐
계층화된 아키텍처는 서로 수직적으로 닫혀있다.
1번 계층에서 3번 계층 데이터를 가져오고 싶다면 한번에 1→3 을 하면되지 않을까? 이지만 닫혀있기 때문에 계층을 거쳐 진행되어야한다. 1→2→3 을 통해 진행되어야 한다.
이렇게 진행된다면 불편하지 않을까? 생각할 수 있지만 각 레이어가 닫혀있기에 독립적이다.
1번 계층에서 3번 계층으로 바로 데이터를 가져온다면 이 행동이 2번 계층에 영향을 미치고 변경될 수 있다.
현재 사용하고 있는 레이어드 아키텍쳐
WebController → GameService → GameDao,CarDao → DB
라는 과정을 통해 수행되고 있다.
Controller가 Presentation레이어 이며, Service가 비즈니스 레이어, Dao 들이 영속성 레이어로 사용하고 있다.
레이어드 아키텍처 주의할 점
Architecture Sinkhole Anti-Pattern
레이어드 아키텍처는 계층간에 데이터를 보내준다고 할 수 있다. 하지만 이런 과정에서 특정 계층은 로직이 없거나 너무 단순해서 그저 데이터를 내보내는 역할을 할 수 있다. 불필요한 리소스 낭비가 있을 순 있지만 전체중 20%이하면 괜찮다고 한다.
나가며
내가 자동차경주 미션에서 사용하고 있던 계층이 어떤 방식으로 이루어지고 왜 이렇게 사용되어졌었는지에 대한 개념을 잡을 수 있었던 것 같다.
'코코코딩공부 > Spring' 카테고리의 다른 글
[Spring] Dispatcher Servlet이란 ? & 미션 에서 찾아보기 (0) | 2023.04.30 |
---|---|
[Spring] Servlet 이란 ? (0) | 2023.04.30 |
[Spring] 어떤 객체를 빈으로 등록해야 할까 ? (1) | 2023.04.23 |
[Spring] Bean 이란 ? (0) | 2023.04.23 |
[Spring] 테스트 DB Failed to load ApplicationContext 에러 (0) | 2023.04.18 |