2024. 8. 26. 17:43ㆍCS/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();
}
}
- 역할: 애플리케이션 전반에 걸친 설정을 정의하고, 빈 설정 등을 관리합니다. 이는 애플리케이션의 의존성 주입과 관련된 설정을 담당합니다.
'CS > Spring' 카테고리의 다른 글
[Spring/Springboot] AOP 관점 지향 프로그래밍 (0) | 2024.12.15 |
---|---|
[Spring/Springboot] API, 프레임워크, 라이브러리의 차이 (0) | 2024.12.15 |
[Spring/Springboot] Bean/싱글톤 패턴/컴포넌트 스캔 (0) | 2024.12.15 |
[Spring/Springboot] 제어의 역전 IoC(Inversion of Control) (0) | 2024.12.15 |
[Spring/SpringBoot] 의존 관계 주입 DI(Dependency Injection) (0) | 2024.12.15 |