[Spring/MVC] Controller, Repository, DTO, Domain, Config의 역할

2024. 8. 26. 17:43CS/Spring

 

 

Spring 프레임워크에서
애플리케이션의 구조를 형성하는

`Controller`, `Repository`, `DTO`, `Domain`,
그리고 `Config`의 역할에 대해 알아봅시다

 

 

Spring MVC의 구조와 예제 시나리오

예제 시나리오
만약 `User`라는 엔티티를 관리하는 간단한 애플리케이션을 만든다고 가정해보겠습니다.
사용자 정보를 조회하거나 생성하는 기능이 필요할 때, 각 요소는 다음과 같이 동작합니다.

1. 사용자가 `/api/users/1`로 GET 요청을 하면, `UserController`가 요청을 처리합니다.
2. 'UserController`는 `UserService`를 호출하여 사용자 정보를 가져오게 하고, 이때 `UserService`는`UserRepository`를 사용하여 데이터베이스에서 사용자를 조회합니다.
3. `UserRepository`는 데이터베이스와 통신하여 `User` 엔티티를 반환합니다.
4. `UserService`는 이 엔티티를 `UserDTO`로 변환하여 `UserController`에 전달합니다.
5. `UserController`는 이 DTO를 HTTP 응답으로 반환합니다.

이와 같은 방식으로 각 구성 요소가 역할을 나누어 서로 협력하여 애플리케이션의 기능을 구현하게 됩니다.


1. Controller


`Controller`는 사용자의 요청을 처리하고, 요청에 따라 적절한 서비스나 비즈니스 로직을 호출하며, 결과를 반환하는 역할을 합니다. 주로 HTTP 요청을 처리하고, RESTful 웹 서비스에서 사용됩니다.

@RestController
@RequestMapping("/api/users")
public class UserController {

    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
        UserDTO userDTO = userService.getUserById(id);
        return ResponseEntity.ok(userDTO);
    }

    @PostMapping
    public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {
        UserDTO createdUser = userService.createUser(userDTO);
        return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
    }
}


- 역할: HTTP 요청을 받아서 서비스 레이어를 호출하고, 그 결과를 HTTP 응답으로 반환합니다.




2. Repository


`Repository`는 데이터베이스와의 상호작용을 담당합니다. `Spring Data JPA`에서는 Repository 인터페이스를 사용하여 데이터베이스 CRUD 작업을 쉽게 처리할 수 있습니다.

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}


- 역할: 데이터베이스에 대한 CRUD 작업을 수행합니다. 예를 들어, 사용자 데이터를 저장하거나 조회하는 등의 작업을 처리합니다.




3. DTO (Data Transfer Object)


`DTO`는 계층 간 데이터 전송을 위해 사용되는 객체로, 주로 데이터베이스 엔티티와는 다르게 클라이언트에 전달할 데이터를 정의합니다.

public class UserDTO {
    private Long id;
    private String name;
    private String email;

    // getters and setters
}


- 역할: 클라이언트에게 반환하거나 클라이언트로부터 받을 데이터를 담는 객체입니다. 보통 데이터베이스 엔티티와 다르게 필요에 따라 일부 필드만 포함할 수 있습니다.




4. Domain (또는 Entity)


`Domain` 객체는 애플리케이션의 핵심 비즈니스 로직과 관련된 데이터를 포함하는 객체로, 데이터베이스 테이블과 매핑되는 클래스입니다.

@Entity
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // getters and setters
}


- 역할: 데이터베이스 테이블과 1:1로 매핑되는 객체로, 애플리케이션의 핵심 데이터를 담습니다. 이 객체는 비즈니스 로직을 포함할 수도 있습니다.




5. Config


`Config` 클래스는 애플리케이션의 설정과 관련된 내용을 관리합니다. 주로 `@Configuration` 어노테이션을 사용하여 스프링의 빈(Bean) 설정을 담당합니다.

@Configuration
public class AppConfig {

    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }
}


- 역할: 애플리케이션 전반에 걸친 설정을 정의하고, 빈 설정 등을 관리합니다. 이는 애플리케이션의 의존성 주입과 관련된 설정을 담당합니다.