5. MVC 모델 알아보기

DAEILLIM·2023년 12월 2일
0
post-thumbnail

1. MVC 모델

MVC 모델은 '프로그램의 처리 역할을 나누어서 프로그램을 작성하는 방법'으로 웹 시스템 개발에 자주 사용되고 있습니다.
역할은 모델(M, Model), 뷰(V, View), 컨트롤러(C, Controller)의 세 종류로 분류합니다.


1.1 모델

모델은 시스템에서 비즈니스 로직(Business Logic)을 담당합니다. '비즈니스 로직'이라는 단어는 '시스템의 코어 부분' 혹은 '시스템의 목적을 처리하는 부분' 등을 나타냅니다.

비즈니스 로직을 회원 가입할 때의 상황에 비유하면 사용자가 입력한 아이디의 중복 확인, 본인 인증, 비밀번호 규칙 확인 등이 필요할 것입니다. 이 중에서 아이디 중복 확인의 로직을 생각해보면 우선 사용자가 입력한 아이디 값을 메모리에 저장하고 회원 데이터베이스에서 동일한 아이디가 있는지 확인하고 중복 여부를 화면에 표시할 수 있게 전달하는 것까지가 비즈니스 로직이 됩니다.

1.2 뷰

뷰는 사용자 입력과 출력 결과 등 시스템에서 표현 부분을 담당하며 웹 어플리케이션에서는 주로 화면을 담당합니다.


1.3 컨트롤러

컨트롤러는 서비스 처리 담당하는 모델과 화면 표시를 담당하는 뷰를 제어(Controller)하는 역할입니다. 사용자가 입력한 내용을 뷰에서 받고, 받은 데이터를 기준으로 모델에 내용을 전달합니다. 또 모델에서 받은 데이터를 뷰에 전달해서 화면에 표시하는 역할을 합니다.


2. MVC 모델의 개요와 이점

서비스 처리 모델(M, Model), 뷰(V, View), 컨트롤러(C, Controller)로 분류함으로써 프로그램의 독립성이 높아질 수 있습니다.

  1. 역할 분담을 통해 효율적인 개발 가능
  2. 개발하는 엔지니어의 분업화가 용이
  3. 설계 변경에 유연하게 대응 가능
image-20231202161845782

3. 스프링 MVC

스프링 MVC를 간단히 설명하면 '웹 어플리케이션을 간단하게 만들 수 있는 기능을 제공하는 프레임워크'입니다.

스프링 MVC(Spring MVC) 프레임워크는 프런트 컨트롤러 패턴(Front Controller Pattern)을 기반으로 동작합니다. 프런트 컨트롤러 패턴은 웹 애플리케이션에서 들어오는 모든 요청을 하나의 진입점, 즉 프런트 컨트롤러(Front Controller)가 처리하도록 하는 디자인 패턴입니다.

스프링 MVC에서는 DispatcherServlet이 프런트 컨트롤러 역할을 합니다. 클라이언트의 요청이 들어오면 DispatcherServlet이 해당 요청을 처리하고, 적절한 핸들러(컨트롤러)에게 전달하여 처리를 진행합니다. 이 패턴을 통해 애플리케이션의 흐름을 중앙 집중화하고, 요청과 응답의 처리를 효과적으로 관리할 수 있습니다.


스프링 MVC의 구성 요소

객체기능 개요
DispatcherServlet모든 요청을 수신하는 프런트 컨트롤러입니다.
Model컨트롤러에서 뷰에 넘겨주는 표시용 데이터 등을 저장하는 객체입니다.
(HttpServeltRequest 혹은 HttpSession 과 같은 기능을 제공합니다.)
컨트롤러요청에 대해서 처리할 내용이 있는 곳입니다.
서비스 처리데이터베이스에 접속해서 데이터를 취득 혹은 가공하는 등 여러 가지 작업을 실행합니다.
개발자가 설계하고 구현합니다.(스프링 MVC와 관계는 없습니다.)
화면 표시 처리를 수행합니다.
(구체적으로 JSP 등의 처리를 수행합니다.)

요청을 받고 응답을 보낼 때까지의 흐름

image-20231202163543074

  1. 모든 요청을 수신하는 프런트 컨트롤러인 DispatcherServlet이 클라이언트로부터 요청을 수신합니다.
  2. DispatcherServlet이 컨트롤러의 요청 핸들러 메서드를 호출합니다.
  3. 컨트롤러 비즈니스 로직 처리를 호출하고, 처리 결과를 받고(3) 처리 결과를 모델로 설정하고, 뷰 이름을 반환합니다.(4)
  4. 반환된 뷰 이름을 받아서 DispatcherServlet이 뷰 이름에 대응하는 뷰에 대해 화면 표시 처리를 의뢰합니다.

덧붙여 스프링 MVC는 내부에서 앞에서 언급한 클래스 외에도 다양한 클래스의 처리가 내부에서 발생하지만, DispatcherServlet과 모델에 주목하기 위해 생략했습니다. 번거로운 처리는 스프링 MVC가 담당하기 때문에 실제로 우리가 작성하는 부분은 컨트롤러, 비즈니스 로직 처리, 뷰의 세가지뿐인 것을 알 수 있습니다.


4. 스프링 MVC 사용

4.1 Controller 클래스 생성

컨트롤러는 POJO 클래스로 작성합니다. POJO(Plain Old Java Ojbect)는 특정한 기술에 종속되지 않고, 특정한 규약을 따르지 않은 간단하고 순수한 자바 객체를 의미합니다.

@Controller
@RequestMapping("hello")
public class HelloViewController {
    
    @GetMapping("view")
    public String helloView() {
        // 반환값으로 뷰의 이름을 반환
        return "hello";
    }
}
  • @Controler
    컨트롤러 인스턴스 생성 어노테이션입니다. 클라이언트와 데이터 입출력을 제어하는 어플리케이션 레이어의 컨트롤러를 부여합니다. 요청 핸들러 메서드의 반환값을 뷰 이름으로 하여 템플릿 엔진의 뷰가 응답 HTML을 생성합니다.
  • @RequestMapping
    클래스나 메서드에 부여하는 것으로 컨트롤러의 요청 핸들러 메서드와 URL을 매핑하게 됩니다.
    여러 가지 속성을 지정할 수 있지만 기본적으로 다음 표의 속성을 지정합니다.
    1. value
      • 매핑할 URL 경로 지정
      • 첫 앞부분의 / 생략이 가능
      • URL 경로만 지정하는 경우에는 속성에서 value 생략이 가능
      • URL 경로를 여러 개 지정이 가능
    2. method
      • GET과 POST 등의 HTTP 메서드를 지정
      • GET을 지정하는 경우에는 RequestMethod.GET 을 사용
      • POST를 사용하는 경우에는 RequestMethod.POST 를 사용
      • HTTP 메서드를 여러 개 지정이 가능
      • 클래스에 @RequestMapping을 부여하는 경우에 method 속성 사용이 불가능

4.2 value 속성 예 1

// value 속성에 처리 대상의 URL 경로를 매핑
@RequestMapping(value = "hello")

// value 속성만 지정하는 경우 생략 가능
@RequestMapping("hello")

// URL 경로를 여러 개 지정 가능
@RequestMapping(value = { "hello", "hellospring"})

// method에서 HTTP 메서드 'GET'을 지정
@RequsetMapping(value = "hello", method = RequestMethod.GET)

// 메서드 여러 개 지정이 가능
@RequestMapping(value = "hello", method = { RequestMethod.GET, ReqeustMethod.POST })

4.3 @GetMapping

@GetMapping@RequestMapping의 GET 요청용 어노테이션입니다.
@RequestMappingvalue 속성과 동일하지만, method 속성은 없습니다.


4.4 @GetMapping 예제 1

// value 속성만이라면 생략 가능합니다.
@GetMapping("hello")

// URL을 여러 개 지정할 수 있습니다.
@GetMapping(value = { "hello", "hellospring "})

@GetMapping은 스프링 프레임워크에서 사용되는 어노테이션 중 하나로, 특정 메서드가 HTTP GET 요청을 처리하는 핸들러 메서드임을 나타냅니다. 이 어노테이션은 보다 간편하고 명시적인 방법으로 GET 요청을 처리하는 메서드를 정의할 수 있게 해줍니다.

기존에는 @RequestMapping 어노테이션을 사용하여 메서드가 어떤 HTTP 메서드를 처리하는지 지정했었습니다. 예를 들면 다음과 같이 사용할 수 있습니다:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @RequestMapping(method = RequestMethod.GET)
    public String handleGetRequest() {
        // GET 요청을 처리하는 로직
        return "viewName";
    }
}

위 코드에서는 /example 경로에 대한 GET 요청을 처리하는 메서드를 정의하고 있습니다. 그러나 @RequestMapping은 모든 HTTP 메서드에 대한 처리를 지원하기 때문에 조금 더 간결한 방법이 필요하다는 요구가 있었습니다.

이에 따라 등장한 것이 @GetMapping 어노테이션입니다. 위 코드를 @GetMapping을 사용하여 다시 작성하면 다음과 같습니다:

javaCopy code@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping
    public String handleGetRequest() {
        // GET 요청을 처리하는 로직
        return "viewName";
    }
}

@GetMapping은 기본적으로 @RequestMapping을 상속받아서 GET 메서드에 특화된 단축 표현으로 볼 수 있습니다. 따라서 더 간결하고 가독성이 좋아집니다. 위의 예제에서는 /example 경로에 대한 GET 요청을 처리하는 메서드를 정의하고 있습니다.


4.5 @PostMapping

@RequestMapping의 POST 요청용 어노테이션이 @PostMapping입니다.
속성은 @RequestMappingvalue 속성과 동일하지만, method 속성은 없습니다.


4.6 @PostMapping 예제 1

// value 속성만이라면 생략 가능합니다.
@PostMapping("hello")

// URL을 여러 개 지정할 수 있습니다.
@PostMapping(value = { "hello", "hellospring "})

@PostMapping은 스프링 프레임워크에서 사용되는 어노테이션 중 하나로, 특정 메서드가 HTTP POST 요청을 처리하는 핸들러 메서드임을 나타냅니다. @GetMapping과 유사하게, 이 어노테이션을 사용하여 간편하게 POST 요청을 처리하는 메서드를 정의할 수 있습니다.

예를 들어, 다음은 @PostMapping을 사용하여 POST 요청을 처리하는 메서드를 정의한 예제입니다:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @PostMapping
    public String handlePostRequest() {
        // POST 요청을 처리하는 로직
        return "viewName";
    }
}

위 코드에서는 /example 경로에 대한 POST 요청을 처리하는 메서드를 정의하고 있습니다. 이 메서드는 handlePostRequest라는 메서드명을 가지며, 이 메서드에 @PostMapping 어노테이션이 부여되어 POST 요청을 처리한다는 것을 나타냅니다.

@PostMapping은 기본적으로 @RequestMapping을 상속받아서 POST 메서드에 특화된 단축 표현으로 볼 수 있습니다.
따라서 @RequestMapping(method = RequestMethod.POST)와 같은 의미를 갖습니다.


4.7 URL 매핑

HelloViewController 클래스는 클래스에 @RequestMapping("hello") 어노테이션을 부여하고 요청 핸들러 메서드에 @GetMapping("view") 어노테이션을 부여 했습니다. 이것으로 클라이언트가 URL(http://locahost:8080/hello/view)로 GET 메서드를 보내면 HelloViewController 클래스의 helloView 메서드가 호출됩니다.


4.8 뷰 생성

<!-- html 기본 템플릿 -->
<html>
    <head>
        <title>View Sample</title>
    </head>
    <body>
        <h1>Hello View!!!</h1>
    </body>
</html>

비즈니스 로직을 처리하는 부분은 아직 완성하지 않았지만, 컨트롤러와 뷰만 생성하여 클라이언트가 요청한 URL에 대응해서 요청 핸들러 메서드가 반환값으로 뷰 이름을 돌려주고, 대응하는 뷰를 표시하는 스프링 MVC의 흐름을 조금 이해할 수 있습니다.

image-20231202220901905
profile
필기하고, 타이핑하고, 말하면서 읽고, 코딩하고, 눈으로 읽고 오감으로 공부하기

0개의 댓글