본문 바로가기

프로그래밍&IT/기타

Framework에서 Model이 의미하는 건?

Java Spring이나 WPF MVVM 등의 framework나 솔루션 등에서 Model이란게 많이 등장한다.

나도 개인적으로 만들고 있는 프로그램들이 있는데,

Model이란걸 대략적으로는 알고 있는데, 한 번 궁금해서 챗GPT에 물어봤다.

 

IT 솔루션을 개발할 때 "Model"이라는 용어는 여러 가지 맥락에서 사용될 수 있습니다. 특히 Java Spring Framework와 같은 프레임워크에서 "Model"은 특정한 의미를 갖습니다. 아래에서 이를 상세히 설명하겠습니다.

 

1. IT 솔루션 개발에서의 Model

- 비즈니스 로직의 표현

Model은 시스템 내에서 비즈니스 로직을 표현하는 컴포넌트를 의미합니다.

즉, 도메인 모델(Domain Model)이라고도 불리며, 시스템이 처리하는 데이터와 그 데이터와 관련된 비즈니스 규칙을 나타냅니다.

 

- 데이터 구조

Model은 데이터 구조나 객체를 나타내며, 이는 데이터베이스 테이블과 직접적으로 매핑될 수 있습니다.

예를 들어, 사용자 정보를 담고 있는 User 클래스가 Model이 될 수 있습니다.

 

2. Java Spring Framework에서의 Model

- MVC 패턴에서의 Model

Spring Framework는 MVC(Model-View-Controller) 아키텍처 패턴을 따릅니다.

여기서 Model은 애플리케이션의 데이터와 비즈니스 로직을 담당합니다.

  • Model 클래스: 일반적으로 Java 객체로 표현되며, 이 객체는 데이터베이스의 테이블과 매핑되는 엔티티(예: @Entity로 어노테이션된 클래스)일 수 있습니다.
  • Model 인터페이스: Spring의 org.springframework.ui.Model 인터페이스는 컨트롤러에서 뷰(View)로 데이터를 전달하는 데 사용됩니다. 이 인터페이스를 통해 컨트롤러에서 생성된 데이터를 뷰에 추가할 수 있습니다.
@Controller
public class MyController {
    @GetMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("message", "Hello, World!");
        return "greeting";
    }
}

위 코드에서 model.addAttribute("message", "Hello, World!")는 뷰에 데이터를 전달하는 역할을 합니다.

 

- ModelAndView 클래스

ModelAndView는 Spring에서 Model과 View를 함께 다룰 수 있는 클래스입니다.

이를 사용하여 컨트롤러 메소드에서 뷰 이름과 함께 데이터를 반환할 수 있습니다.

@Controller
public class MyController {
    @GetMapping("/greeting")
    public ModelAndView greeting() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("greeting");
        modelAndView.addObject("message", "Hello, World!");
        return modelAndView;
    }
}

 

3. Model의 역할 정리

  • 데이터 표현: Model은 주로 데이터베이스와의 상호작용을 담당하며, 데이터를 캡슐화하고 비즈니스 로직을 구현하는 데 사용됩니다.
  • 데이터 전달: MVC 패턴에서 컨트롤러와 뷰 사이에서 데이터를 전달하는 역할을 합니다.
  • 비즈니스 로직 관리: Model 클래스는 시스템의 비즈니스 로직을 구현하는 데 사용되며, 이는 애플리케이션의 핵심 기능을 담당합니다.

 

기존에 내가 알고 있는 DTO (Data Transfer Object) 와 DAO (Data Acess Object) 도 궁금해졌다.

 

1. DTO (Data Transfer Object)

  • 목적: DTO는 데이터 전송을 위한 객체입니다. 주로 계층 간 데이터 전달에 사용됩니다.
  • 사용 시점: DTO는 클라이언트와 서버 간, 또는 애플리케이션 내의 다른 계층 간 데이터를 전송할 때 사용됩니다. 예를 들어, 웹 애플리케이션에서는 클라이언트가 서버로 요청을 보내거나 서버가 클라이언트에게 응답할 때 DTO를 사용할 수 있습니다.
  • 구조: DTO는 일반적으로 순수한 데이터 구조를 가지며, 보통 getter/setter 메서드를 사용합니다. 로직이 포함되지 않고, 주로 필드와 이들을 접근하는 메서드로만 구성됩니다.
  • 변환: 엔티티(Entity)와 DTO 간의 변환은 주로 컨트롤러나 서비스 계층에서 수행됩니다. 이 과정에서 필요한 데이터를 추출하거나, 추가적인 정보를 포함할 수 있습니다.
public class UserDTO {
    private String username;
    private String email;

    // getters and setters
}

예시: 사용자가 로그인할 때 입력한 정보를 담아 서버에 전달하거나, 서버가 사용자의 정보를 클라이언트에게 응답으로 보낼 때 사용될 수 있습니다.

 

2. DAO (Data Access Object)

  • 목적: DAO는 데이터베이스에 접근하고, 데이터를 조작하기 위한 객체입니다. 즉, 데이터베이스와의 상호작용을 캡슐화하고, 데이터의 CRUD(Create, Read, Update, Delete) 작업을 담당합니다.
  • 사용 시점: DAO는 주로 데이터베이스에 접근하여 데이터를 읽고 쓰거나, 데이터베이스와의 상호작용을 수행할 때 사용됩니다.
  • 구조: DAO는 데이터베이스와 상호작용하기 위한 메서드를 포함합니다. 이는 SQL 쿼리를 직접 작성하거나, ORM(Object-Relational Mapping) 프레임워크를 통해 이루어질 수 있습니다.
  • 독립성: DAO는 데이터베이스 관련 로직을 캡슐화하여 다른 계층에서 데이터베이스 관련 코드가 노출되지 않도록 합니다. 이로 인해 애플리케이션의 구조가 깔끔해지고 유지보수가 쉬워집니다.
public interface UserDAO {
    User findById(int id);
    void save(User user);
    void update(User user);
    void deleteById(int id);
}

예시: UserDAO 인터페이스는 사용자의 데이터를 데이터베이스에서 읽고 쓰는 작업을 담당합니다. 이 인터페이스의 구현체는 데이터베이스와의 구체적인 상호작용을 정의하게 됩니다.

 

3. DTO와 DAO의 비교 요약

특징 DTO (Data Transfer Object) DAO (Data Access Object)
목적 데이터를 전송하기 위한 객체 데이터베이스와의 상호작용을 담당하는 객체
주요 역할 계층 간 데이터 전달 데이터의 CRUD 작업 수행
구조 주로 필드와 getter/setter로 구성된 단순 데이터 구조 데이터베이스 접근 로직이 포함된 메서드를 가지는 인터페이스나 클래스
사용 시점 서비스/컨트롤러와 같은 계층 간 데이터 전송 시 사용 데이터베이스에 데이터를 저장하거나 불러올 때 사용
로직 포함 여부 비즈니스 로직을 포함하지 않음 데이터베이스와의 상호작용 로직 포함
변환 작업 엔티티와 DTO 간의 변환이 필요함 엔티티를 직접적으로 처리함

 

DTO는 데이터를 전달하는 역할을, DAO는 데이터를 영구 저장소(예: 데이터베이스)에서 가져오고 저장하는 역할을 합니다. 둘 다 데이터와 관련된 객체지만, 그 목적과 사용 방식이 매우 다릅니다.