레이어드 아키텍쳐

Kim Dong Kyun·2023년 4월 24일
1
post-thumbnail

개요

레이어드 아키텍쳐란?

소프트웨어의 구성 요소들을 서로 다른 레이어로 분리하여 각각의 역할과 책임을 부여하여 시스템을 구축하는 소프트웨어 아키텍처 패턴


구성요소

1. Presentation Layer

  • 사용자에게 뷰, 혹은 모델을 리턴하는 레이어. (화면 or 데이터)

  • Spring 에서는 controller 로 구현된다. @RestController 사용하면 (JPA) 뷰와 모델 전부 리턴 가능하다.

  • 특정 URI를 호출하면 뷰나 데이터를 넘겨준다.

2. Business Layer

  • 비즈니스 로직을 처리하는 레이어

  • Spring 에서는 service, 혹은 domain으로 구현된다.

3. Data Layer

  • 데이터를 저장하고 관리하는 레이어로, 주로 데이터베이스와의 상호작용을 담당

  • Spring에서는 Repository(JPA) 혹은 DAO (redis DB 등의 접근) 로 구현된다. 혹은 JDBC Template, MyBatis등도 데이터 접근을 가능하게 한다.


장단점

장점:

  1. 모듈화와 분리: 각 레이어는 독립적으로 개발, 관리, 테스트될 수 있으므로 시스템의 모듈화와 분리가 가능
  • 애플리케이션의 유지보수성, 확장성, 테스트 용이성을 향상
  1. 단일 책임 원칙(Single Responsibility Principle, SRP) 준수: 각 레이어는 특정한 책임과 역할을 갖기 때문에, 각 레이어는 해당하는 기능에 집중
  • 코드의 가독성, 유지보수성, 확장성을 개선할 수 있습니다.
  1. 재사용성: 각 레이어는 독립적으로 개발되므로, 재사용성이 높아진다.
  • 예를 들어, 데이터 레이어는 다양한 비즈니스 로직에서 재사용될 수 있다.
@Service
@RequiredArgsConstructor
public class MyMovieServiceImpl implements MyMovieService {

    private final MovieRepository movieRepository;
    ...
@Service
@RequiredArgsConstructor
public class MovieServiceImpl implements MovieService {

    private final MovieRepository movieRepository;
    ...

단점:

  1. 복잡성: 레이어드 아키텍처는 레이어 간의 상호작용을 관리해야 하므로 약간의 복잡성을 동반할 수 있다.

  2. 성능 저하: 레이어드 아키텍처는 레이어 간의 추가적인 인터페이스와 통신을 필요로 하므로, 성능 저하의 가능성이 있다.

  3. 단방향 의존성: 레이어드 아키텍처는 각 레이어가 상위 레이어에게 의존하도록 설계되어 있기 때문에, 하위 레이어에서 상위 레이어로의 의존성이 존재

  • 이로 인해 하위 레이어의 변경이 상위 레이어에 영향을 미칠 수 있어 전체 시스템의 안정성과 유지보수성을 관리하는 데 어려움이 있을 수 있다.
  1. 유연성 제한: 레이어드 아키텍처는 각 레이어의 기능과 역할을 명확하게 분리하므로, 시스템의 유연성이 제한될 수 있다. 새로운 기능이나 요구사항이 추가될 때 레이어 간의 인터페이스와 통신을 수정해야 할 수 있어, 시스템의 유연한 대응이 어려울 수 있다.

4,5 단점 예

// Presentation Layer (UI)
public class UserController {
    private UserService userService;

    public UserController(UserService userService) {
        // Presentation Layer가 UserService에 의존
        this.userService = userService;
    }

    // ...
}

// Business Layer
public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        // Business Layer가 UserRepository에 의존
        this.userRepository = userRepository;
    }

    // ...
}

// Data Layer
public class UserRepository {
    // Data Layer가 Database에 의존
    public User getUserById(int userId) {
        // 데이터베이스 조회 로직
    }

    // ...
}

레이어드 아키텍쳐가 위와 같이 설계되어 있으므로, 유연성 부족이나 단방향 의존성 등 단점이 존재하게 된다.

  • 확장 가능한 코드를 만들기 위한 노력, 모듈화가 필요하다
  • FactoryPattern 등이 좋은 예시 일 듯 하다.

2개의 댓글

comment-user-thumbnail
2023년 4월 26일

와.. 꿀 안빠네

1개의 답글