PLOD

[Spring] 3 Layer Architecture 본문

개발 공부/Spring framework

[Spring] 3 Layer Architecture

훌룽이 2024. 7. 29. 20:29

 

기존에 Controller 클래스에만 의존하여 모든 기능을 처리하도록 한다면  문제가 발생할 수 있다. 

  1. 한 개의 클래스에 너무 많은 양의 코드가 존재하기 때문에 코드를 이해하기 어려움 → 가독성 떨어짐
  2. 현업에서는 코드의 추가 혹은 변경 요청이 계속 생길 수 있다.
  3. 문제가 발생했는데 해당 Controller 클래스를 구현한 개발자가 퇴사한다면? → 유지보수성 떨어짐

이러한 문제점들을 해결하기 위해 서버 개발자들은 서버에서의 처리과정이 대부분 비슷하다는 걸 깨닫고, 처리 과정을 크게 Controller, Service, Repository 3개로 분리하였다. 

 

Web Layer

  • 흔히 사용하는 Controller와 JSP / freemaker 와 같은 view 템플릿 영역이다
  • Filter,Intercepter,ControllerAdvice등 외부 요청과 응답에 전반적인 영역을 말한다.

Service Layer

  • 일반적으로 Controller와 DAO의 중간영역에서 사용된다
  • @Transactional이 사용되어야 하는 영역이다
  • 보통 여기서 비즈니스 로직을 처리하나 관점에 따라 Domain Model에서 비즈니스 로직을 처리하기도 한다

Repository Layer

  • 데이터베이스(DB)에 접근하여 역할(CRUD)을 하는 객체
  • 대표적으로 Repository , DAO가 있다

DTO

  • 계층간 데이터 교환을 위한 객체이다
  • 주로 Client에서 데이터를 반환하거나 받아줄 때 사용한다. 
  • 데이터 전송 및 이동을 위해 생성되는 객체를 의미한다
  • Client에서 보내오는 데이터를 객체로 처리할 때 사용되고 서버의 계층간의 이동에도 사용됩니다.
  • 그리고 DB와의 소통을 담당하는 Java 클래스를 그대로 Client에 반환하는 것이 아니라 DTO로 한번 변환한 후 반환할 때도 사용된다. 
  • 데이터 전달 용도로만 사용하는 클래스라서 @getter & @setter 만 가진 클래스

ResponseDto : Client에서 데이터를 반환할 때 사용

package com.sparta.memo.dto;

import lombok.Getter;

@Getter
public class MemoResponseDto {
    private Long id;
    private String username;
    private String contents;
}

RequestDto : Client에서 요청 데이터를 받아줄 때 사용

package com.sparta.memo.dto;

import lombok.Getter;

@Getter
public class MemoRequestDto {
    private String username;
    private String contents;
}

Domain

  • 도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화 시킨 것을 도메인 모델이라고 한다
  • 대표적으로 테이블을 선언하기 위한 Entity, VO 가 있다.
@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
    @Id
    private Long id;

    // nullable: null 허용 여부
    // unique: 중복 허용 여부 (false 일때 중복 허용)
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    // length: 컬럼 길이 지정
    @Column(name = "contents", nullable = false, length = 500)
    private String contents;
}

 

Comments