이번 자료에서는 Layered Architecture에 대해 배우고 구현하는 실습을 진행합니다.
Layered Architecture란?
- Layered Architecture는 소프트웨어 시스템을 여러 계층(Layers)으로 나누어 구성하는 설계 패턴입니다. 각 계층은 특정한 역할과 책임을 가지며, 계층 간에는 엄격한 인터페이스를 통해 상호 작용합니다. 주로 다음과 같은 세 가지 주요 계층으로 구성됩니다.
- 레이어는 필요에 따라 언제든지 추가될 수 있습니다.
- 같은 레이어 내에서 서로 다른 객체가 서로 참조하지 않도록 주의해야 합니다. (스파게티 코드 될 가능성이 있음)
- 표현 계층 (Presentation Layer 또는 Controller Layer):
- 사용자와의 상호 작용을 처리합니다.
- 클라이언트 요청을 받아 해당 요청을 서비스 계층으로 전달합니다.
- 주로 웹 애플리케이션에서는 컨트롤러(Controller)로 구성되며, 사용자 입력을 처리하고 적절한 서비스에 전달합니다.
- 응용 계층 (Application Layer 또는 Service Layer):
- 비즈니스 로직을 구현하고, 클라이언트의 요청을 처리합니다.
- 표현 계층으로부터 받은 요청을 분석하고, 필요한 데이터를 가져와 비즈니스 로직을 수행합니다.
- 데이터 액세스 계층과 통신하여 데이터를 읽고 쓰는 역할을 수행합니다.
- 데이터 액세스 계층 (Data Access Layer 또는 Persistence Layer):
- 데이터베이스나 외부 데이터 소스와의 상호 작용을 담당합니다. (외부 API 요청도 포함한다.)
- 데이터베이스에 접근하고 데이터를 읽고 쓰는 등의 데이터 액세스 작업을 수행합니다.
- 주로 데이터베이스와의 연결 및 쿼리를 처리하는 코드로 구성됩니다.
Layered Architecture가 중요한 이유
- 모듈화와 분리: 각 레이어는 독립적으로 구현되므로, 시스템의 다른 부분에 영향을 미치지 않고 수정, 유지보수, 확장이 가능합니다. 예를 들어, 데이터 액세스 레이어에서 데이터베이스 접근 방법이 변경되어도 서비스 레이어 및 컨트롤러 레이어는 영향을 받지 않습니다.
- 재사용성: 각 레이어는 독립적으로 구성되어 있으므로 재사용이 용이합니다. 예를 들어, 서비스 레이어의 특정 기능을 다른 컨트롤러에서도 사용할 수 있습니다.
- 테스트 용이성: 각 레이어는 독립적으로 테스트할 수 있습니다. 이는 단위 테스트, 통합 테스트 등을 수행할 때 유용합니다. 또한 Mocking을 사용하여 특정 레이어의 의존성을 제거하여 테스트하기 쉽게 만들 수 있습니다.
- 확장성: 새로운 기능 또는 요구 사항이 추가될 때, 새로운 레이어를 추가하거나 기존의 레이어를 수정하여 시스템을 쉽게 확장할 수 있습니다. 예를 들어, 새로운 데이터 소스를 지원하기 위해 데이터 액세스 레이어를 추가할 수 있습니다.
- 관심사의 분리: 각 레이어는 특정한 관심사에만 집중하므로 코드의 가독성과 이해도를 향상시킵니다. 데이터 액세스 레이어는 데이터베이스와의 상호 작용에만 집중하고, 서비스 레이어는 비즈니스 로직을 처리하고, 컨트롤러 레이어는 요청과 응답을 처리합니다.
Data Object
- DTO (Data Transfer Object):
- DTO는 데이터 전송을 위해 사용됩니다. 주로 계층 간 데이터 전달을 위한 용도로 사용됩니다. 예를 들어, 데이터베이스로부터 데이터를 가져와 서비스 계층으로 전달하거나, 서비스 계층에서 생성된 데이터를 표현 계층으로 전달하는 데 사용됩니다.
- DTO는 특정 작업 또는 연산을 수행하는 데 필요한 데이터를 포함하며, 일반적으로 비즈니스 로직을 포함하지 않습니다.
- DTO는 종종 데이터의 전송을 위해 직렬화될 수 있어야 하며, 일반적으로 가변(mutable)한 객체입니다.
- VO (Value Object):
- VO는 값 그 자체를 나타내는 데 사용됩니다. 데이터를 캡슐화하여 불변(immutable)한 형태로 사용됩니다. VO는 주로 도메인 모델의 부분으로 사용되며, 개념적으로는 데이터의 불변성과 불변성을 보장하는 데 중점을 둡니다.
- VO는 동일성(Identity)이 아닌 값에 따라 동등성(Equality)을 판단합니다. 즉, 두 VO가 동일한 속성 값을 가지면 같은 것으로 간주됩니다.
- 예를 들어, 금액이나 날짜와 같은 값을 나타내는 경우 VO를 사용하여 이러한 값의 불변성을 보장할 수 있습니다.
- 우리 수업에서는 레이어간 데이터를 전달하는 목적으로 데이터 오브젝트를 사용할 것이기 때문에 DTO 만을 정의해서 사용할 예정입니다.