Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

(스파르타 코딩클럽) 면접 예상 질문 Spring MVC패턴 본문

TIL

(스파르타 코딩클럽) 면접 예상 질문 Spring MVC패턴

H.S-Backend 2024. 8. 13. 11:18

 

1. 클라이언트 요청 (Client Request)

사용자가 브라우저 또는 REST 클라이언트(예: Postman)를 통해 특정 URL로 API 요청을 보냅니다. 이 요청은 HTTP 요청으로 표현됩니다.

2. 디스패처 서블릿 (DispatcherServlet)

요청이 웹 서버(Tomcat, Jetty 등)에 도착하면, 이 요청은 Spring의 DispatcherServlet으로 전달됩니다. DispatcherServlet은 요청을 처리하는 핵심 역할을 하는 프론트 컨트롤러로, Spring MVC의 진입점 역할을 합니다.

  • DispatcherServlet의 역할: DispatcherServlet은 요청을 받고, 적절한 컨트롤러(Controller)에 요청을 전달하며, 컨트롤러의 결과를 받아서 적절한 뷰(View)로 응답을 생성합니다.

3. 핸들러 매핑 (Handler Mapping)

DispatcherServlet은 요청 URL에 따라 어떤 컨트롤러가 이 요청을 처리할지 결정하기 위해 HandlerMapping을 사용합니다.

  • HandlerMapping: Spring은 URL과 컨트롤러 메서드를 매핑하기 위해 다양한 HandlerMapping 구현체를 사용합니다. 가장 일반적인 것은 RequestMappingHandlerMapping으로, @RequestMapping이나 @GetMapping, @PostMapping 등으로 정의된 URL을 매핑합니다.

4. 컨트롤러 (Controller) 호출

HandlerMapping에 의해 적절한 컨트롤러가 결정되면, 해당 컨트롤러의 메서드가 호출됩니다.

  • 컨트롤러 역할: 컨트롤러는 비즈니스 로직을 호출하고, 필요한 데이터를 처리한 후 응답 데이터를 준비합니다. 이때, 컨트롤러는 일반적으로 서비스 계층(Service Layer)을 호출하여 비즈니스 로직을 수행합니다.
@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
       User user = userService.findById(id);
       return ResponseEntity.ok(user);
    }
}

이 코드에서 getUser 메서드는 /api/users/{id} 경로로 들어온 GET 요청을 처리합니다.

5. 서비스 계층 (Service Layer)

컨트롤러는 비즈니스 로직을 수행하기 위해 서비스 계층을 호출합니다.

  • 서비스 계층 역할: 서비스 계층은 실제 비즈니스 로직이 구현되는 곳입니다. 예를 들어, 데이터베이스에서 사용자 정보를 조회하거나, 트랜잭션 관리, 다른 비즈니스 규칙을 적용하는 등의 작업을 수행합니다.
@Service
public class UserService {

    public User findById(Long id) {
       // 데이터베이스에서 사용자 정보 조회
       return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException(id));
    }
}

 

6. 데이터 접근 계층 (Data Access Layer)

서비스 계층이 데이터베이스와 상호작용할 필요가 있다면, Spring Data JPA와 같은 데이터 접근 계층을 통해 데이터베이스와 상호작용합니다.

  • Repository 역할: Spring Data JPA에서는 Repository 인터페이스를 통해 데이터베이스 작업을 수행합니다. 이 인터페이스는 CRUD(Create, Read, Update, Delete) 작업을 쉽게 처리할 수 있게 해줍니다.
public interface UserRepository extends JpaRepository<User, Long> {
}

 

7. 응답 처리 (Response Handling)

컨트롤러에서 서비스 계층을 통해 필요한 작업을 완료한 후, 결과를 반환합니다. 이때, 컨트롤러는 ResponseEntity나 단순히 객체를 반환하여 Spring이 자동으로 JSON이나 XML 등의 형식으로 변환해 클라이언트에 전달할 수 있도록 합니다.

  • ViewResolver 또는 HttpMessageConverter: Spring은 ViewResolver를 사용해 뷰(View)를 결정하거나, REST API의 경우 HttpMessageConverter를 사용하여 객체를 JSON이나 XML로 변환합니다.
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.findById(id);
    return ResponseEntity.ok(user);
}

이 메서드는 User 객체를 JSON 형식으로 클라이언트에 반환합니다.

8. 디스패처 서블릿에서 응답 반환 (Response Dispatch)

모든 작업이 완료되면, DispatcherServlet은 최종 응답을 클라이언트로 반환합니다. 이 응답은 웹 서버를 통해 사용자의 브라우저나 REST 클라이언트에 전달됩니다.

 

간략한 정리

  1. 클라이언트 요청: 사용자 → 웹 서버
  2. DispatcherServlet: 요청 처리 시작
  3. Handler Mapping: 적절한 컨트롤러 매핑
  4. Controller: 비즈니스 로직 호출
  5. Service Layer: 비즈니스 로직 수행
  6. Data Access Layer: 데이터베이스와 상호작용
  7. Response Handling: 응답 생성 및 변환
  8. 응답 반환: 클라이언트로 응답 전송

 

반응형