소소한개발팁
article thumbnail
Published 2023. 9. 28. 23:28
Spring MVC 프레임워크/Spring
반응형

Spring MVC 구조 

모델 (Model)
모델은 애플리케이션의 데이터와 비즈니스 로직을 관리합니다. Spring MVC에서 모델은 Java 클래스로 표현되며, 애플리케이션의 데이터를 캡슐화하고 처리합니다. 주로 데이터베이스와 상호 작용하거나 비즈니스 로직을 수행하는 데 사용됩니다.

뷰 (View)
뷰는 사용자에게 정보를 표시하는 역할을 합니다. Spring MVC에서 뷰는 사용자 인터페이스를 나타내며 주로 JSP(JavaServer Pages), Thymeleaf, FreeMarker, 또는 다른 템플릿 엔진과 같은 기술을 사용하여 생성됩니다.

컨트롤러 (Controller)
컨트롤러는 클라이언트의 요청을 처리하고 모델과 뷰 사이의 상호 작용을 관리합니다. 요청을 수신하면 컨트롤러는 적절한 모델을 호출하여 데이터를 가져오고, 그 데이터를 뷰에 전달하여 결과를 생성합니다. Spring MVC에서 컨트롤러는 주로 POJO(Plain Old Java Object) 클래스로 구현되며 @Controller 어노테이션을 사용하여 선언됩니다.

디스패처 서블릿 (Dispatcher Servlet)
Spring MVC 애플리케이션의 모든 클라이언트 요청은 디스패처 서블릿에 도달합니다. 디스패처 서블릿은 요청을 분석하고 적절한 컨트롤러를 찾아서 요청을 전달합니다. Spring MVC 애플리케이션에서 web.xml 파일 또는 자바 설정 클래스를 통해 디스패처 서블릿을 설정할 수 있습니다.

 

핸들러 매핑 (Handler Mapping)
핸들러 매핑은 클라이언트 요청이 어떤 컨트롤러(핸들러)에 의해 처리될 것인지를 결정하는 역할을 합니다. Spring MVC에서는 다양한 핸들러 매핑 전략을 제공하며, 주요 핸들러 매핑 전략 중 일부는 다음과 같습니다.

  • BeanNameUrlHandlerMapping : 이 매핑 전략은 빈의 이름을 기반으로 URL과 매핑합니다. 즉, 빈의 이름과 URL 패턴이 일치하면 해당 빈(컨트롤러)이 처리합니다.
  • SimpleUrlHandlerMapping : 이 매핑 전략은 URL 패턴과 핸들러(컨트롤러) 간의 직접적인 매핑을 설정합니다. URL 패턴과 핸들러를 명시적으로 지정할 수 있습니다.
  • DefaultAnnotationHandlerMapping : 이 매핑 전략은 @Controller 어노테이션이 지정된 클래스를 스캔하여 URL 패턴에 자동으로 매핑합니다.
  • RequestMappingHandlerMapping : 이 매핑 전략은 @RequestMapping 어노테이션을 기반으로 URL 패턴과 핸들러를 매핑합니다. 가장 널리 사용되는 핸들러 매핑 전략 중 하나입니다.

핸들러 매핑은 DispatcherServlet에서 사용되며, 클라이언트 요청이 들어올 때 적절한 핸들러로 라우팅하는 역할을 합니다.

핸들러 어댑터 (Handler Adapter)
핸들러 어댑터는 컨트롤러(핸들러)가 요청을 처리하는 방법을 결정하고 실행합니다. 각각의 컨트롤러는 다른 방식으로 요청을 처리할 수 있으며, 핸들러 어댑터는 이러한 다양한 컨트롤러를 처리할 수 있도록 도와줍니다. 주요 핸들러 어댑터 중 일부는 다음과 같습니다.

  • SimpleControllerHandlerAdapter : 이 어댑터는 Controller 인터페이스를 구현한 컨트롤러를 처리합니다. handleRequest() 메서드를 호출하여 요청을 처리합니다.
  • HttpRequestHandlerAdapter : 이 어댑터는 HttpRequestHandler 인터페이스를 구현한 컨트롤러를 처리합니다. handleRequest() 메서드를 호출하여 요청을 처리합니다.
  • AnnotationMethodHandlerAdapter : 이 어댑터는 @Controller 어노테이션과 @RequestMapping 어노테이션을 기반으로한 컨트롤러를 처리합니다. 메서드 수준의 @RequestMapping 어노테이션을 분석하여 요청을 처리합니다.
  • RequestMappingHandlerAdapter : 이 어댑터는 RequestMapping 어노테이션을 기반으로한 컨트롤러를 처리합니다. 메서드 수준의 @RequestMapping 어노테이션을 분석하여 요청을 처리하며, @RequestBody 및 @ResponseBody 어노테이션을 사용하여 HTTP 요청 및 응답 데이터를 처리할 수 있습니다.

핸들러 어댑터는 핸들러 매핑이 선택한 핸들러(컨트롤러)를 실행하는 역할을 합니다. 요청에 따라 적절한 핸들러 어댑터가 선택되어 해당 컨트롤러의 메서드가 호출됩니다.

 

설정 파일 또는 애노테이션
Spring MVC 애플리케이션은 XML 또는 자바 기반의 설정을 사용하여 구성됩니다. XML 설정 파일을 사용할 수도 있고, @Configuration 어노테이션을 사용하여 자바 기반의 설정을 구현할 수도 있습니다.

뷰 리졸버 (View Resolver)
뷰 리졸버는 컨트롤러에서 반환된 뷰 이름을 실제 뷰 객체로 해석하는 역할을 합니다. 이것은 뷰와 뷰 템플릿의 연결을 담당합니다.

 



반응형

 

HTTP 요청 및 응답

Request Mapping 

기본 URL 매핑: @RequestMapping 어노테이션을 사용하여 특정 URL에 대한 요청을 처리하는 메서드를 지정할 수 있습니다. 아래 예제에서는 "/hello" 경로로의 GET 요청을 처리하는 메서드를 정의합니다.

@Controller
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        return "hello";
    }
}

 

HTTP 메서드에 따른 매핑: @GetMapping, @PostMapping 등 특정 HTTP 메서드(GET, POST, PUT, DELETE 등)에 대한 요청을 처리하기 위해 더 간단한 어노테이션을 사용할 수 있습니다. 예를 들어, @GetMapping은 GET 요청에 대한 처리를 간결하게 정의할 수 있습니다.

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

 

URI 변수 매핑: @PathVariable URI 내에 변수를 사용하여 동적인 요청을 처리할 때 @PathVariable을 사용할 수 있습니다. 예를 들어, "/user/{userId}"와 같은 경로에서 userId 값을 추출할 수 있습니다.

@Controller
public class UserController {
    @GetMapping("/user/{userId}")
    public String getUser(@PathVariable Long userId) {
        // userId를 사용한 로직
        return "user";
    }
}

 

요청 파라미터 매핑: @RequestParam 요청 파라미터를 처리할 때 @RequestParam 어노테이션을 사용합니다. 아래 예제에서는 "name" 파라미터를 받아 처리합니다.

@Controller
public class GreetingController {
    @GetMapping("/greet")
    public String greet(@RequestParam("name") String name) {
        // name 파라미터를 사용한 로직
        return "greeting";
    }
}

 

부모 경로 설정: @RequestMapping을 클래스에 적용 @RequestMapping 어노테이션을 클래스 수준에 적용하여 해당 클래스의 모든 메서드에 대한 공통 경로를 지정할 수 있습니다

@Controller
@RequestMapping("/products")
public class ProductController {
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String getProduct(@PathVariable Long id) {
        // 제품 정보를 조회하고 템플릿을 반환
        return "product";
    }
}

 

Request Parameter

쿼리 파라미터(Query Parameter):쿼리 파라미터는 URL에 포함된 파라미터로, 주로 GET 요청에서 사용됩니다. 

@GetMapping("/search")
public String search(@RequestParam(name = "q") String query) {
    // query를 사용한 로직
    return "search-results";
}

위의 예제에서는 "/search?q=검색어"와 같은 URL에서 "q" 파라미터를 받아옵니다.

 

HTML Form:HTML Form을 통해 POST 요청으로 전송된 데이터를 받을 때는 메서드 파라미터에 해당 객체를 바인딩할 수 있습니다. 이를 위해 @ModelAttribute 어노테이션을 사용합니다. 예를 들어, 다음과 같이 HTML Form을 통해 전송된 데이터를 받을 수 있습니다:

@PostMapping("/submit-form")
public String submitForm(@ModelAttribute User user) {
    // user 객체를 사용한 로직
    return "form-success";
}

위의 예제에서 User 클래스는 HTML Form에서 전송된 데이터와 필드를 매핑하는 객체입니다.

 

@RequestParam: @RequestParam 어노테이션을 사용하여 요청 파라미터를 직접 메서드의 매개변수로 바인딩할 수 있습니다. 이 방법은 주로 쿼리 파라미터나 단일 값의 요청 파라미터를 받을 때 사용됩니다. 예를 들어:

@GetMapping("/user-info")
public String getUserInfo(@RequestParam(name = "id") Long userId) {
    // userId를 사용한 로직
    return "user-info";
}

 

@ModelAttribute: @ModelAttribute 어노테이션을 사용하여 요청 파라미터를 메서드 파라미터로 바인딩할 수 있습니다. 이 방법은 객체나 모델 속성에 여러 요청 파라미터를 바인딩할 때 유용합니다. 예를 들어:

@PostMapping("/update-user")
public String updateUser(@ModelAttribute User user) {
    // user 객체를 사용한 로직
    return "user-updated";
}

위의 예제에서는 User 객체에 해당하는 요청 파라미터들이 바인딩됩니다.

 

Response

정적 리소스를 응답으로 반환하는 방법: Spring MVC에서 정적 리소스(예: CSS 파일, JavaScript 파일, 이미지 파일)를 응답으로 반환하려면 src/main/resources/static 또는 src/main/resources/public 디렉터리에 리소스를 위치시키면 됩니다. 이 디렉터리에 저장된 파일은 Spring MVC가 자동으로 처리합니다. 예를 들어, /static/css/styles.css 경로에 있는 CSS 파일을 제공하려면 다음과 같이 설정할 수 있습니다:

<link rel="stylesheet" type="text/css" href="/static/css/styles.css">

Spring MVC는 이 경로로 요청이 들어오면 해당 정적 리소스 파일을 찾아 응답으로 전송합니다.

 

뷰 템플릿을 사용하는 방법: Spring MVC에서 뷰 템플릿을 사용하여 동적인 HTML 페이지를 생성하고 응답으로 반환할 수 있습니다. Thymeleaf, JSP, FreeMarker 등 다양한 뷰 템플릿 엔진을 지원합니다. 아래는 Thymeleaf를 사용한 예제입니다:

@Controller
public class ViewController {
    @GetMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "greeting"; // 이것은 Thymeleaf 템플릿의 이름입니다.
    }
}

위의 예제에서 /greeting 경로로 요청이 들어오면 "greeting" 뷰 템플릿을 렌더링하여 응답으로 반환합니다. 이러한 뷰 템플릿은 templates 디렉터리에 저장됩니다.

 

HTTP 메시지를 사용하는 방법: Spring MVC에서 HTTP 메시지를 직접 사용하려면 HttpServletResponse 객체를 활용하여 메시지를 생성하고 반환합니다. 아래는 간단한 예제입니다:

@Controller
public class MessageController {
    @GetMapping("/message")
    public void sendMessage(HttpServletResponse response) throws IOException {
        String message = "This is an HTTP message.";
        response.setContentType("text/plain");
        response.getWriter().write(message);
    }
}

위의 예제에서 /message 경로로 요청이 들어오면 HttpServletResponse 객체를 사용하여 "This is an HTTP message."라는 텍스트 메시지를 생성하고 응답으로 반환합니다. setContentType 메서드를 사용하여 응답의 콘텐츠 유형을 설정할 수 있습니다.

반응형

'프레임워크 > Spring' 카테고리의 다른 글

SSR - Thymeleaf 기본 기능 소개  (0) 2023.10.02
Spring MVC - Log 사용하기  (0) 2023.09.28
쓰레드(Thread)  (1) 2023.09.24
서블릿(Servlet)  (0) 2023.09.24
Mybatis  (0) 2020.01.14
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!