[HometownBoard] 3-Tier Layer 구조

junghan·2023년 4월 7일
0

SpringBootProject

목록 보기
7/35
post-thumbnail

3-Tier 레이어란?

3-tier 레이어는 소프트웨어를 설계하는 방식 중 하나로, 사용자 인터페이스, 트랜잭션 도메인 순서보장, 데이터 저장소 등의 기능을 각각 독립적인 계층으로 나누어 개발하는 방식입니다. 이 방식은 애플리케이션을 유지보수하기 쉽고 확장하기 용이하게 만들어주며, 각 계층이 독립적으로 테스트될 수 있도록 해줍니다.


각 계층 별 설명

Web Layer

Web 계층은 소프트웨어에서 사용자 인터페이스와 관련된 역할을 담당하는 계층입니다. 이 계층에서는 클라이언트로부터 요청을 받아서 트랜잭션, 도메인 간 순서 보장하기 위한 Service 계층으로 데이터를 전달하고, 처리된 결과를 다시 클라이언트에게 전달합니다.

Spring Framework에서는 Web 계층을 구현하기 위해 Spring MVC를 사용합니다. Spring MVC는 Model-View-Controller(MVC) 패턴을 기반으로한 웹 프레임워크로써, DispatcherServlet을 통해 클라이언트로부터 요청을 받아 처리합니다.

  • Controller
    Controller는 DispatcherServlet이 요청을 받으면, 그 요청을 처리할 적절한 Controller에게 전달합니다. Controller는 요청을 처리하기 위해 Service 계층을 통해 필요한 데이터를 전달받고, 이 데이터를 가공하여 Model에 담아 View에 전달합니다.

  • View
    View는 Controller가 전달한 Model 데이터를 받아서, 화면을 출력하는 역할을 합니다. 이때, Spring MVC에서는 View Resolver를 통해 적절한 View를 선택합니다. 예를 들어, JSP를 사용하는 경우, View Resolver는 JSP를 렌더링하는 데 필요한 View 객체를 생성합니다.

Web 계층에서는 또한 여러 검증을 할 수 있는데, Spring Framework에서 제공하는 JSR-303 빈 검증 기능을 통해 사용자의 요청에 대한 유효성 검사를 수행하는 등의 기능을 하던지, @RequestParam 어노테이션을 통해 요청 파라미터의 유효성을 검사할 수 있습니다.

또한, Spring Framework에서는 Security 모듈을 제공하여 웹 보안 기능을 쉽게 구현할 수 있도록 지원합니다.
이 모듈은 인증 및 인가 기능을 제공하며, CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 기능도 포함하고 있습니다.

• 흔히 사용을 하는 컨트롤러(@Controller)JSP/Freemarker 등의 뷰 템플릿 영역입니다.
• 이외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 이야기합니다.


Service Layer

Service 계층은 비즈니스 로직을 처리하는 것보다는 트랜잭션 관리, 도메인 간의 순서 보장 등의 역할을 수행합니다. 이러한 역할은 비즈니스 로직을 실행하는 데에 있어서 매우 중요합니다.

예를 들어, 하나의 비즈니스 로직이 여러 개의 데이터베이스 테이블에 걸쳐서 처리되는 경우, Service 계층에서 트랜잭션을 관리함으로써, 모든 작업이 정상적으로 수행되었는지, 그리고 어느 단계에서 문제가 발생했는지 등을 확인할 수 있습니다.

따라서, Service 계층에서 비즈니스 로직을 처리하는 것은 좋지 않습니다.
비즈니스 로직은 해당하는 도메인 객체에 구현되어야 하며, Service 계층는 이러한 도메인 객체를 호출하고, 그 결과를 반환하는 역할을 수행해야 합니다. 이렇게 하면, 도메인과 관련된 코드는 도메인 객체에만 존재하게 되므로, 유지보수성과 확장성이 좋아지게 됩니다.

• @Service에 사용되는 서비스 영역입니다.
• 일반적으로 Controller와 Dao의 중간 영역에서 사용됩니다.
• @Transactional이 사용되어야 하는 영역이기도 합니다.


Repository Layer

Repository 계층은 데이터베이스나 파일 시스템 등의 데이터 저장소에 접근하여 데이터를 저장, 조회, 수정, 삭제하는 역할을 합니다. 이를 통해 데이터의 영속성(persistence)을 보장하며, 데이터베이스나 파일 시스템 등의 데이터 저장소에 대한 접근을 추상화하여 도메인 계층이나 서비스 계층과 분리시킵니다.

Repository 계층은 대부분의 경우 인터페이스로 정의되며, 이를 구현하는 클래스에서 실제 데이터베이스나 파일 시스템 등의 데이터 저장소에 접근하는 코드를 작성합니다.

이러한 인터페이스와 구현체의 분리를 통해 도메인 계층과 Repository 계층 간의 의존성을 낮출 수 있습니다.

또한, 인터페이스를 통해 데이터 저장소에 대한 접근 방식을 변경할 경우에도, 도메인 계층과 서비스 계층에는 영향을 주지 않고 Repository 계층만 수정하여 데이터 저장소에 대한 접근 방식을 변경할 수 있습니다.

Repository 계층에서는 일반적으로 CRUD(create, read, update, delete) 작업을 수행합니다.

데이터베이스나 파일 시스템 등의 데이터 저장소에 대한 접근 방식에 따라 적절한 데이터 접근 기술을 사용합니다.
예를 들어, RDBMS(Relational Database Management System)를 사용하는 경우에는 JDBC(Java Database Connectivity)를 사용하거나, ORM(Object-Relational Mapping) 프레임워크를 사용할 수 있습니다.
또한, NoSQL 데이터베이스를 사용하는 경우에는 MongoDB, Cassandra 등의 데이터베이스에 대한 접근을 위한 드라이버를 사용합니다.

• Database와 같이 데이터 저장소에 접근하는 영역입니다.
• ORM 사용하지 않던 시절(JDBC)의 Dao(Data Access Object) 영역으로 이해하시면 쉬울 것입니다.


DTOs와 Domain Model

DTOs

DTO(Data Transfer Object)란, 계층간 데이터 교환을 위한 객체로, 계층간 데이터 교환을 위해 사용됩니다. 보통은 Entity 클래스로부터 필요한 데이터만을 추출하여, 데이터를 전송하거나 저장하는 등의 작업에 사용됩니다.

DTO는 데이터의 이동과 변환만을 담당하며, 비즈니스 로직이 포함되어 있지 않습니다. 따라서 DTO는 단순하고 명확한 구조로 작성되어야 하며, 이를 통해 데이터의 이동과 변환을 보다 안전하고 빠르게 수행할 수 있습니다.

DTO는 보통 Entity 클래스와 1:1로 매핑되며, Entity 클래스에서 필요한 데이터만을 추출하여 DTO 클래스를 생성합니다. 이러한 DTO 클래스는 데이터베이스에서 데이터를 조회하여 반환하는 등의 작업에서 사용됩니다. 또한, 클라이언트와 서버 간의 데이터 통신에도 사용됩니다.

DTO는 불변 객체(Immutable Object)로 설계되어야 하며, 이를 통해 객체의 안정성과 보안성을 보장할 수 있습니다. 또한, DTO는 자바 직렬화(Java Serialization)를 지원해야 하며, 이를 통해 데이터를 직렬화하여 네트워크 상에서 전송할 수 있습니다.

• Dto(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체를 이야기하며 Dtos는 이들의 영역을 얘기합니다.
• 예를 들어 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등이 이들을 이야기합니다.


Domain Model

Domain Model은 소프트웨어 시스템에서 다루는 문제 영역(Domain)을 모델링한 것으로, 비즈니스 규칙과 개념, 업무 프로세스 등을 포함하는 객체 모델을 의미합니다. 이 모델은 비즈니스를 이해하고 구현하는데 필요한 객체, 속성, 메소드 등을 포함합니다.

Domain Model은 실질적으로 비즈니스 로직 처리를 담당하는 계층입니다. 이 계층에서는 데이터를 처리하는 데 필요한 도메인 객체들을 정의하고, 비즈니스 규칙들을 구현합니다.

도메인 객체들은 문제 영역(Domain)에서 식별될 수 있는 중요한 개념들을 나타내며, 이들은 비즈니스 규칙과 함께 업무 프로세스에 사용됩니다. 이를테면 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있습니다.

Domain Model은 시스템의 다른 레이어와 함께 사용되며, Service나 Repository 레이어 등에서도 사용됩니다.
이러한 레이어들은 Domain Model에서 정의된 객체들을 활용하여 비즈니스 로직을 처리합니다. 이를 통해 시스템 전체적으로 일관성 있고 유지보수성이 좋은 코드를 작성할 수 있습니다.

• 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 합니다.
• @Entity를 사용해보신 분들은 @Entity가 사용된 영역 역시 도메인 모델이라고 이해 해주시면 됩니다.
• 다만, 무조건 데이터베이스의 테이블과 관계가 있어야만 하는 것은 아닙니다
• VO처럼 값 객체들도 이 영역에 해당하기 때문입니다.

VO(Value Object)는 값 객체로, 도메인 모델에서 사용되는 객체 중 하나입니다. VO는 주로 읽기 전용 속성을 가진 간단한 객체로 구성되며, 이 객체를 통해 데이터를 전달하거나 조작합니다.


출처: 스프링 부트와 AWS로 혼자 구현하는 웹서비스
JAVA Guide

profile
42seoul, blockchain, web 3.0

0개의 댓글