Spring 입문 1-2 (MVC)

SJ.CHO·2024년 9월 25일

MVC

  • Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나

  • Model

    • 데이터와 비즈니스 로직을 담당.
    • DB와 연동하여 데이터를 저장하고 불러오는 작업을 함.
  • View

    • 사용자의 UI를 담당.
  • Controller

    • 모델과 뷰사이의 상호작용을 조정하고 제어
    • 유저의 입력을 받아 모델에 전달, 결과를 바탕으로 View 업데이트
  • 코드 재사용성을 높이고, 협업을 용이하게 한다.

Spring MVC

  • 'Spring 에서 MVC 패턴을 적용하여 HTTP 요청을 효율적으로 처리한다.'
  • Servlet (서블릿)은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양

  • DispatcherServlet (Front Controller)

  1. Client 의 HTTP 요청이 들어오면 DispatcherServlet 객체가 헤더부분의 요청을 분석.
  2. DispatcherServlet 객체는 데이터를 토대로 Mapping 된 Controller 를 찾아 요청전달
    • 직접 Servlet 객체를 구현하지 않아도 요청처리 메소드를 수행한다.
  3. Controller → DispathcerServlet
    • 요청 처리에대한 결과(데이터'Model', 'View' 정보)를 전달
  4. DispatcherServlet → Client
    • ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달

Controller

  • 모델과 뷰사이의 상호작용을 조정하고 제어

  • 유저의 입력을 받아 모델에 전달, 결과를 바탕으로 View 업데이트

  • 경로의 경우 HTTP 메소드가 다를경우 겹칠순 있지만 같을경우 사용불가.

  • @ResponseBody

    • 반환을 일반 String으로 할경우 resource 의 팀플릿에서 HTML 파일을 찾는다.
    • 해당 문자열의 HTML을 반환하라는 뜻으로 받아들임.
    • 문자열 자체를 반환하기 위하여 사용!
  • @RequestMapping

@Controller
@RequestMapping("/api")
public class HllowController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello World!!";
    }
	// "/api/get" 과 동일.
    @GetMapping("/get")
    @ResponseBody
    public String get() {
        return "get 메소드 요청!";
    }
  • 중복되는 URL 경로를 Class 하위메소드들에게 묶어주어서 중복되는 경로를 처리한다.

Servlet VS Controller

  • Servlet :
    • Spring이 개발되기전 Java WAS를 통한 동적 웹을 만들기위해 개발된 도구.
    • 개발자가 직접 관리하거나 사용하기가 어려워 사용 난이도가 높음
      (URL 마다 서블릿을 생성해서 사용했다.)
  • Controller :
    • Spring이 개발되고 MVC 패턴과 좀 더 높은 추상화를 위해 생겨난 도구
    • 그중에 사용자의 요청을 받고 서블릿 앞단에서 서블릿을 좀더 편하게 사용 가능하며 그냥 응답을 보내는것이 아닌 뷰를 이용하여 응답을 진행.
    • 유사한 성격의 API를 하나의 컨트롤러만으로 URL을 관리가능하다.

Controller vs Service

  • Controller 자체에 비즈니스로직을 둘수는 있지만 이는 객체지향관점에서 컨트롤러가 너무많은 책임을 가짐.
  • Controller 는 비즈니스로직이 알맞는 서비스를 호출만 하는 역할을 담당.

참조 : https://velog.io/@dbsrud9126/Spring-MVC

정적페이지 vs 동적페이지

  • 정적페이지

    • html파일 요청시 해당 html 파일을 static 폴더에서 찾아서 반환
    • Controller 를 통해 반환이 가능은 하지만 굳이..?
  1. 의존성 주석화
  • implementation 'org.springframework.boot:spring-boot-starter-thymeleaf’
    해당 dependency를 주석 처리.
  • thymeleaf 는 동적 페이지를 위한 템플릿 엔진임.
  • 해당 코드를 없앨시 static 폴더에서 html을 찾아 반환한다.
@GetMapping("/static-hello")
public String hello() {
    return "hello.html";
}
  1. Redirect
  • 템플릿 엔진을 사용하면서 Controller 통해 처리하고싶을시 사용.
  • Redirect 요청을 문자열로 반환하면 요청이 재수행되며 static 폴더 파일을 반환한다.
@GetMapping("/html/redirect")
public String htmlStatic() {
    return "redirect:/hello.html";
}
  1. Template engine 에 View 전달
  • Template 폴더에 정적 html 파일을 추가하고 해당 html의 파일 명 인 hello 문자열을 반환하여 처리 (형식자는 생략가능!)
@GetMapping("/html/templates")
public String htmlTemplates() {
    return "hello";
}
  • 동적 페이지

    • Client 의 요청을 Controller에서 Model 로 처리
    • Template engine(Thymeleaf) 에게 View, Model 전달
        1. View: 동적 HTML 파일
        1. Model: View 에 적용할 정보들
        1. View에 Model을 적용 → 동적 웹페이지 생성
    • Client(브라우저)에게 View(동적 웹 페이지, HTML)를 전달
private static long visitCount = 0;

...

@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
    visitCount++;
    model.addAttribute("visits", visitCount);
    return "hello-visit";
}
<div>
  (방문자 수: <span th:text="${visits}"></span>)
</div>
  • HTML의 변수가 연결되어 상호작용한다
profile
70살까지 개발하고싶은 개발자

0개의 댓글