MVC in Spring Boot: DAO, DTO, Entity class

d4v1d·2022년 4월 5일
0

Kotlin

목록 보기
3/4

개요

Spring Boot에서 사용되는 MVC 패턴(DAO, DTO, Entity)에 대한 내용을 정리한 포스트입니다. 🤡

MVC 패턴

참고자료 - [Spring] Spring의 MVC 패턴과 MVC1과 MVC2 비교
참고자료 - [Spring] 스프링을 이용한 MVC패턴 구현(1) - Spring MVC

Spring Framework가 채택한 MVC 패턴Model/View/Controller로 나누어 소프트웨어를 디자인하는 방식을 말합니다.

  • Model 애플리케이션 정보, 데이터, DB 등
  • View 사용자에게 보여지는 UI: Model로부터 정보를 얻고 이를 화면에 표시
  • Controller Model과 View가 직접 상호작용하지 않도록 데이터와 비즈니스 로직 사이의 동작을 관리하고 통제

MVC1


View, Controller를 JSP(JavaServer Page)가 모두 담당하여, 유저의 요청을 받고 응답을 처리합니다. 코드로 구현하기는 쉽지만 프로젝트 규모가 커지면 코드 가독성과 재사용성이 떨어집니다. JSP 하나로 MVC를 모두 다루기 때문이죠.

MVC2


널리 표준으로 사용되는 새로운 MVC 패턴입니다. JSP가 담당하던 View, Controller를 분리하여 Servlet이 Controller의 역할을 수행하는 방식이죠. Model, View, Controller 중 수정해야 할 부분이 있으면 해당 영역만을 수정하면 되므로 유지 및 보수가 수월합니다.
MVC1 패턴보다 구조가 복잡할 수 있지만, 개발자들이 이러한 세부적인 구성을 신경쓰지 않을 수 있도록 프레임워크들이 발전해왔습니다.

Spring MVC


유저의 요청을 받는 DispatcherServlet이 Front Controller 역할을 합니다. 들어온 요청은 해당 기능에 맞는 Controller에 전달하고, 비즈니스 로직이 처리된 Model을 View에게 전달합니다. View는 사용자에게 보여질 화면과 함께 response를 반환합니다.

코드 구현 시 집중해서 볼 부분은 다음과 같습니다.
참고자료 - Controller, Service, Repository 가 무엇일까?

  • Controller 유저의 요청을 받으면 이를 Service로 전달하고, 처리된 결과를 View로 return
  • Service Controller로부터 요청을 전달받으면 필요한 데이터를 Repository를 통해 불러와서 비즈니스 로직을 적용한 후 Controller로 반환
  • Repository DB 접근 요청을 받으면 DB와 직접 통신하여 필요한 데이터를 Service로 전달

DAO (Data Access Object)

DAO는 데이터베이스에 추상화된 인터페이스를 제공하는 패턴입니다.
DAO는 애플리케이션과 데이터베이스 사이의 연결 다리 역할을 하는데, DB로부터 데이터를 가져오거나(DB record ➡ Object) DB에 데이터를 보낼 수 있습니다(Object ➡ DB record). 이 과정에서 DB의 자세한 정보는 애플리케이션 상의 나머지 부분에 노출되지 않으므로, DB 접근 로직과 비즈니스 로직을 분리하기 위해 사용됩니다. 관계형 데이터베이스에서 ORM 기술을 구현한 프레임워크들을 표준화한 JPA(Java Persistence API)에 DAO가 사용됩니다.

Spring Boot에서는 Repository에 해당하는데, persistence layer와 1:1 매치됩니다. JPA를 통해 DB 테이블을 자바 객체로 매핑할 수 있습니다!

@Repository
interface ModelRepository : CrudRepository<User, String> {
    @Query("select * from users")
    fun readUsers(): List<User>
}

org.springframework.data.repository.CrudRepository에 DB 관련 기본 메서드들이 정의되어 있습니다(findAll(), save() 등).

DTO (Data Transfer Object)

DTO는 계층간(Controller, View, Business Layer) 데이터 전송을 위한 JavaBeans를 의미합니다. 비즈니스 로직을 가지지 않으며, 데이터를 전송하는데 필요한 getter와 setter 메서드만을 가지는 아주 단순한 객체입니다.

data class 키워드를 이용하여 DTO class 정의

data class User(
    val uid: String = "",
    val name: String = "unknown",
    val age: Int = 0,
    // ...
)

자바와 달리, getter/setter/toString 등을 따로 정의하지 않아도 사용할 수 있어서 코드가 매우 간결합니다. 또, 위 코드에서 볼 수 있듯이 클래스에 전달된 인자들은 자동으로 클래스의 필드로 생성됩니다!

Entity

참고자료 - JPA 애노테이션으로 Entity 클래스 만들기
Entity란 DB에 영구적으로 저장된 데이터(record)를 자바 객체로 매핑하여 인스턴스 형태로 존재하는 데이터를 의미합니다. Entity는 실제 DB의 테이블과 매핑되는 클래스이므로 자주 변경되면 여러 클래스에 영향을 미칠 수 있습니다. 따라서 View와 통신하는 DTO 클래스와 구분하여 구현함으로써 View와 DB Layer를 분리할 수 있습니다.

정리

Spring MVC 패턴과 Spring이 사용하는 DAO, DTO, Entity, 그리고 이를 코드로 구현할 때 사용되는 Controller, Service, Repository의 개념에 대해 알아보았습니다. Spring의 작동 원리를 이해하면 프로젝트를 개발할 때 패턴의 각 영역에 해당하는 코드를 작성하기 수월하겠죠? 또한, 처리할 요청의 유형에 따라 Controller, Service, Repository를 적절히 분리해서 작성할 필요가 있습니다. ⏰

profile
데이터 엔지니어/백엔드 개발자 d4v1d의 개발 일지🐯

0개의 댓글