[Spring] 레이어드 아키텍쳐(Layered Architecture)

2022. 7. 25. 18:40Web/Spring

레이어드 아키텍쳐(Layered Architecture)

웹 어플리케이션을 제작하는 과정에서 많이 사용이 되는 구조이다. 각기 다른 구조의 계층이 층층이 겹쳐져서 웹을 이루는 구조라는 뜻에서 레이어드 아키텍쳐라는 이름을 가지게 되었다. 일반적으로 웹을 제작하는 시점에서 더 나은 아키텍쳐의 대안을 찾지 못할 경우 사용하게 되는 범용성이 높고 활용성이 높은 아키텍쳐 구조이다.

기본적으로 각기 다른 역할을 가진 애플리케이션 요소들을 수평으로 나눠 관리를 하며 각각 자신보다 한단계 하위의 레이어만 사용을 하게 된다. 

기본 구조

Controller - Prensentation Layer 

 

스프링부트로 기본프로젝트를 생성하면 기본적인 내장 톰캣을 가지고 있는 프로젝트가 생성이 된다. 프로젝트가 생성 후 실행을 하면서 해당 컨트롤러의 역할이 시작이 된다. 컨트롤러에서는 URL 매핑을 통해 각각의 동작을 컨트롤해준다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController("test")
public class MainController {

    @GetMapping("/abc")
    public void index() {
        return "abc"
    }
}

만약 해당 http://localhost:8080 라는 URL 뒤에 /abc를 붙여 http://localhost:8080/abc라는 URL을 호출 시 abc가 적힌 해당 페이지가 열리게 된다. 이런 점에서 컨트롤러는 각각의 url에서 요청하는 바에 맞춰서 각각의 메서드들을 연결해 기능을 수행한다. 즉 controller는 url과 각 서비스의 메소드를 연결해 기능을 수행하는 역할을 하는 계층이다

 

 

Service - Business Layer

 Controller가 url에서 호출되는 것을 연결해 보여준다면 Service의 경우 controller를 통해 제공하고자 하는 서비스의 메서드를 표현하는 객체가 있는 계층이다. 해당 계층에서 작성이 된 각각의 서비스를 뜻하는 메서드들은 controller를 통해 연결이 되어 사용자에게 제공이 된다. 

  • 모듈화
    • 컨트롤러에 바로 해당 메서드 생성 시 코드의 복잡성
    • Service 계층을 통해 호출을 통한 사용
  • 보안
    • 컨트롤러와 퍼시스턴스 계층의 중간단계로 해커가 컨트롤러를 통해 바로 퍼시스턴스 계층에 접근하는걸 방지
  • Entity  / DTO 객체 변환
    • model객체를 통해 entity와 DTO의 중간 단계를 수행
    • 엔티티 속성의 변경으로 DB의 컬럼이 변경되는 사태 방지

하나의 비즈니스 로직-메서드는  하나의 트랜잭션으로 동작한다.

 

Repository - Persistence Layer

 

서비스 계층 아래에 존재하며 DB와 서비스 계층을 이어주는 역할이다. entity로 데이터 객체를 관리하지만, entity만으로는 데이터베이스에 관여할 수 없기에 스프링에서는 JPA  / MyBatis를 사용한다. 데이터의 CRUD기능을 수행하며 해당 부분에서 서비스에 관한 트랜잭션이 완료가 되면 DB에 해당 마무리 정보를 넘겨서 DB에 저장이 되는 형태이다. 

  • Create 
  • Read
  • Update
  • Delete

JPA의 경우 스프링 프레임 워크에서 존재하는 JPA 리포지토리를 상속 받으면 해당 기본적인 기능들을 사용이 가능하다. 

 

@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {
    UserEntity findByEmail(String email);

    Boolean existsByEmail(String email);

    UserEntity findByEmailAndPassword(String email, String password);

}

 

DB - DataBase Layer

퍼시스턴스 계층에서 완료가 된 데이터의 형태를 DTO로 저장하는 계층이다. 개인적인 테스트를 위해서는 H2 데이터베이스를 사용하고 시중에는 Mysql, Mongo DB등 SQL 데이터 베이스와 No SQL 데이터 베이스로 나눠져서 사용이  된다. 이런 데이터 베이스를 먼저 사용하고자 할때는 spring의 설정파일에서 해당 데이터 베이스를 사용한다는 명시를 해줘야 연결이 되며 사용이 된다.

 

장 / 단점

장점

  • 복잡도가 낮기에 소규모 애플리케이션에 적합
  • 별개로 이뤄지고 작업은 각 계층의 객체를 호출하면서 이뤄지기에 다른 계층의 수정 및 기능 향상에 유리하다

단점

  • 영속성 계층을 토대로 만들어지기에 데이터베이스 주도 설계를 유도
  • 각 계층을 변경시킬때 계층 호출에 대한 이해도가 필요하며 유지보수의 난이도가 올라갈 수 있다.

단점의 경우로 인해 대규모의 애플리케이션에는 적합하지않다