Spring MVC(Model-View-Controller)는 웹 애플리케이션 개발을 위한 프레임워크로 클라이언트 요청을 효과적으로 처리하고 응답을 반환하는 구조를 제공한다.
Spring MVC는 DispatcherServlet을 중심으로 요청을 처리하며 요청을 적절한 컨트롤러로 전달하고 응답을 생성하는 과정을 담당한다.
Spring MVC에서 클라이언트의 요청이 처리되는 흐름은 다음과 같다.
클라이언트 요청(Request) 발생
DispatcherServlet 수신
DispatcherServlet이 가장 먼저 요청을 받아 처리한다.DispatcherServlet은 Spring의 Front Controller 역할을 한다.HandlerMapping을 통해 적절한 컨트롤러 찾기
DispatcherServlet은 요청 URL에 맞는 컨트롤러를 찾기 위해 HandlerMapping을 사용한다.Controller에서 요청 처리
Service & Repository 호출 (비즈니스 로직 처리)
ModelAndView 또는 Response 반환
ModelAndView(뷰 렌더링) 또는 ResponseEntity(API 응답) 형태로 반환한다.ViewResolver를 통해 View 결정
DispatcherServlet은 ViewResolver를 사용하여 적절한 View(JSP, Thymeleaf 등)를 찾는다.클라이언트에게 응답 반환
DispatcherServlet
HandlerMapping
Controller
Service
Repository (DAO)
ViewResolver
ModelAndView
ResponseEntity
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
// GET 요청 처리
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
// POST 요청 처리
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = userService.createUser(user);
return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
}
}
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found"));
}
public User createUser(User user) {
return userRepository.save(user);
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
Spring MVC는 DispatcherServlet을 중심으로 요청을 처리하며 각 계층을 분리하여 유지보수성을 높이는 구조를 제공한다.
Spring MVC의 흐름을 정확히 이해하면 백엔드에서 요청이 어떻게 전달되고 어떻게 응답이 반환되는지를 명확하게 알 수 있다. @RequestMapping, @Controller, @Service, @Repository 같은 주요 어노테이션을 활용하여 효율적으로 애플리케이션을 구성할 수 있다.
앞으로 개발할 때 Spring MVC 구조를 잘 활용하여 유지보수성이 높은 코드를 작성하는 것이 중요하다는 점을 다시금 느꼈다.