본문 바로가기

설계

[파이썬] 레이어드 (layered) 아키텍처

레이어드 아키텍처(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 패턴을 사용하면 복잡한 시스템을 사용하기 쉬운 인터페이스로 감싸서 사용할 수 있습니다.


이 외에도 레이어드 아키텍처와 함께 사용되는 패턴은 다양하며, 프로젝트의 요구사항과 상황에 따라 다르게 적용될 수 있습니다.