레이어드 아키텍처(Layered Architecture)는 소프트웨어를 구성하는 아키텍처 중 하나로, 서로 다른 계층으로 구성되어 있습니다. 이 아키텍처에서 각 계층은 다른 계층과 상호작용하여 전체 시스템을 구성합니다. 각 계층은 자신이 책임져야 할 기능을 수행하며, 다른 계층에 대한 인터페이스를 제공합니다.
1. 설명
레이어드 아키텍처의 가장 일반적인 예는 3계층 아키텍처입니다. 이 아키텍처는 다음과 같은 세 개의 계층으로 구성됩니다.
- 프레젠테이션 계층 (Presentation Layer): 사용자 인터페이스(UI)를 담당하는 계층입니다. 사용자와 시스템 간의 상호작용을 처리하며, 사용자가 시스템을 조작할 수 있도록 UI를 제공합니다.
- 비즈니스 계층 (Business Layer): 비즈니스 로직을 처리하는 계층입니다. 이 계층에서는 데이터 처리, 데이터 유효성 검사, 규칙 처리 등과 같은 비즈니스 요구사항을 구현합니다.
- 데이터 액세스 계층 (Data Access Layer): 데이터를 저장하고 검색하는 계층입니다. 이 계층에서는 데이터베이스와의 상호작용을 처리하며, 데이터에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
2. 예제 코드
이제 파이썬으로 간단한 레이어드 아키텍처를 구현해보겠습니다. 이 예제에서는 사용자가 입력한 이름과 나이를 검증하고 저장하는 간단한 시스템을 구현합니다.
# Presentation Layer
def get_user_input():
name = input("Enter your name: ")
age = input("Enter your age: ")
return name, age
def display_error(message):
print(f"Error: {message}")
# Business Layer
def validate_user_input(name, age):
if not name:
raise ValueError("Name is required")
if not age:
raise ValueError("Age is required")
try:
age = int(age)
except ValueError:
raise ValueError("Age must be a number")
if age < 18:
raise ValueError("Age must be greater than or equal to 18")
return name, age
# Data Access Layer
def save_user_data(name, age):
with open("users.txt", "a") as f:
f.write(f"{name}, {age}\n")
# Main function
def main():
try:
name, age = get_user_input()
name, age = validate_user_input(name, age)
save_user_data(name, age)
except ValueError as e:
display_error(str(e))
위 코드에서 get_user_input() 함수는 사용자로부터 이름과 나이를 입력받아서 튜플 형태로 반환합니다. 이 함수는 Presentation Layer에 해당합니다.
display_error() 함수는 에러 메시지를 출력하는 함수입니다. 이 함수는 Presentation Layer에 해당합니다.
validate_user_input() 함수는 사용자로부터 입력받은 이름과 나이를 검증하는 함수입니다. 이 함수는 Business Layer에 해당합니다. 입력값이 유효하지 않을 경우 ValueError를 발생시킵니다.
save_user_data() 함수는 검증된 사용자 데이터를 파일에 저장하는 함수입니다. 이 함수는 Data Access Layer에 해당합니다.
main() 함수에서는 get_user_input() 함수를 호출하여 사용자로부터 입력받은 데이터를 가져옵니다. 그 다음 validate_user_input() 함수를 호출하여 데이터를 검증합니다. 검증된 데이터는 save_user_data() 함수를 호출하여 파일에 저장됩니다. 만약 검증 중 에러가 발생하면 display_error() 함수를 호출하여 에러 메시지를 출력합니다.
이 예제에서는 3개의 계층으로 구성된 간단한 레이어드 아키텍처를 구현했습니다. 이 아키텍처를 사용하면 각 계층이 서로 다른 책임을 지니므로 코드 유지보수가 쉬워지며, 시스템의 확장성도 높아집니다.
3. 함께 사용되는 패턴
레이어드 아키텍처와 함께 자주 사용되는 패턴으로는 다음과 같은 것들이 있습니다.
- MVC(Model-View-Controller) 패턴: Presentation Layer를 모델, 뷰, 컨트롤러로 나누어 구성하는 패턴입니다. 모델은 데이터를 관리하고 처리하는 부분, 뷰는 사용자 인터페이스를 구성하는 부분, 컨트롤러는 모델과 뷰를 연결하는 부분으로 구성됩니다.
- DI(Dependency Injection) 패턴: 객체 간의 의존성을 낮추기 위해 의존성을 주입하는 패턴입니다. 의존성을 주입함으로써 객체 간의 결합도를 낮추어 유연하고 테스트하기 쉬운 코드를 작성할 수 있습니다.
- Repository 패턴: 데이터베이스와의 상호작용을 담당하는 객체를 별도로 구성하여 데이터 액세스를 추상화하는 패턴입니다. 이를 통해 데이터 액세스 로직을 분리하여 코드의 유지보수성을 높일 수 있습니다.
- Facade 패턴: 서브시스템의 복잡한 인터페이스를 단순화하여 사용하기 쉬운 인터페이스를 제공하는 패턴입니다.Facade 패턴을 사용하면 복잡한 시스템을 사용하기 쉬운 인터페이스로 감싸서 사용할 수 있습니다.
이 외에도 레이어드 아키텍처와 함께 사용되는 패턴은 다양하며, 프로젝트의 요구사항과 상황에 따라 다르게 적용될 수 있습니다.
'설계' 카테고리의 다른 글
[파이썬] 상속성 (Inheritance) (0) | 2023.03.23 |
---|---|
[파이썬] 캡슐화 (Encapsulation) (0) | 2023.03.23 |
[파이썬] 포트와 어댑터 패턴 (0) | 2023.03.21 |
[파이썬] 저장소 패턴 (Repository Pattern) 에 대해서 (0) | 2023.03.21 |
[디자인 패턴] 비지터 패턴 (Visitor Pattern) - python 예제 코드 (0) | 2023.03.11 |