스프링 공부 (인프런 김영한 선생님)/스프링 MVC 1편

[스프링 웹 MVC 1편] 18. 스프링 MVC - 시작

2023. 5. 30. 09:22

스프링이 제공하는 컨트롤러는 애노테이션 기반으로 매우 유연하고 실용적이다.

@RequestMapping 에노테이션을 사용한다.

 

@RequestMapping (밑의 2가지 이용) - 둘 다 우선순위가 가장 높음

- RequestMappingHandlerMapping - @RequestMapping 또는 @Controller가 클래스 레벨에 붙는 경우 매핑정보로 인식

- RequestMappingHandlerAdapter

 

 

package hello.servlet.web.springmvc.v1;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class SpringMemberFormControllerV1 {

    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process(){
        return new ModelAndView("new-form");
    }

}

@Controller - 스프링이 자동으로 스프링 빈으로 등록한다

내부를 들어가보면 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 된다.

스프링 MVC에서 애노테이션 기반 컨트롤러로 인식하게 된다.

 

== @Component + @RequestMapping

 

@RequestMapping - 요청 정보를 매핑한다.

해당 URL이 호출되면 이 메서드가 호출되고 애노테이션을 기반으로 동작하기 때문에 메서드 이름은 임의로 지정해도 된다.

 

ModelAndView - 모델과 뷰 정보(뷰 논리이름)을 담아서 반환하면 된다

 

컴포넌트 스캔 없이 스프링 빈으로 직접 등록해도 동작한다. (ServletApplication에 return new SpringMember...ControllerV1(); 추가


package hello.servlet.web.springmvc.v1;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.ModelView;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class SpringMemberSaveControllerV1 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(HttpServletRequest request, HttpServletResponse response){
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }

}

mv.addObject("member", member)

-> 스프링이 제공하는 ModelAndView를 통해 Model에 데이터를 추가할 때는 .addObject() 메서드를 사용하면 된다.

이 데이터는 이후 뷰를 렌더링 할때 사용된다.

 

package hello.servlet.web.springmvc.v1;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import hello.servlet.web.frontcontroller.ModelView;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class SpringMemberListControllerV1 {

    MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members")
    public ModelAndView process() {
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }

}

스프링 MVC 컨트롤러 통합

 

@RequestMapping 애노테이션을 잘 보면, 클래스 단위가 아니라 메서드 단위로 적용한 것을 알 수 있다.

이 때 /springmvc/v1/ 항목이 중복되는 것을 볼 수 있는데 이런 컨트롤러 클래스를 유연하게 하나로 통합이 가능하다.

 

package hello.servlet.web.springmvc.v2;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    //@RequestMapping("/springmvc/v2/members/new-form")
    @RequestMapping("/new-form")
    public ModelAndView newForm(){
        return new ModelAndView("new-form");
    }

    @RequestMapping("/save")
    public ModelAndView save(HttpServletRequest request, HttpServletResponse response){
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }

    @RequestMapping
    public ModelAndView members() {
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }

}

 

스프링 실용적인 방식

V3에서 봤던 ModelAndView(ModelView)를 반환하는 대신 V4에서 사용한대로 뷰의 논리이름만 반환하는 방식을 사용할 수 있다

-> 실무에서는 이런 방식을 많이 사용한다.

package hello.servlet.web.springmvc.v3;

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.ModelAndView;

public class SpringMemberControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    //@RequestMapping("/springmvc/v2/members/new-form")
    @RequestMapping("/new-form")
    public String newForm(){
        return "new-form";
    } // ModelAndView vs String -> 뷰 이름으로 알고 프로세스 진행

    @RequestMapping("/save")
    public String save(@RequestParam("username") String username,
        @RequestParam("age") int age, Model model){
        // String username = request.getParameter("username");
        // int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        //ModelAndView mv = new ModelAndView("save-result");
        //mv.addObject("member", member);

        model.addAttribute("member", member);
        return "save-reesult";
    }

    @RequestMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        //ModelAndView mv = new ModelAndView("members");
        //mv.addObject("members", members);
        model.addAttribute("members", members);
        return "members";
    }

}

Model 파라미터

- save(), members() 를 보면 Model을 파라미터로 받는 것을 알 수 있다, 이는 스프링이 제공하는 편의기능이다!

 

@RequestParam 을 통해 파라미터를 request.getAttribute()하는 대신에 직접 바인딩으로 받을 수 있다.

 

@RequestMapping -> @GetMapping, @PostMapping을 통해 HTTP Method의 구분이 가능하다

또는 RequestMapping에 method 인자를 주는 방법도 있다.

'스프링 공부 (인프런 김영한 선생님) > 스프링 MVC 1편' 카테고리의 다른 글

[스프링 웹 MVC 1편] 20. 스프링 MVC - 기본기능 (요청매핑)  (0) 2023.06.03
[스프링 웹 MVC 1편] 19. 스프링 MVC - 기본 기능 (로깅)  (0) 2023.06.01
[스프링 웹 MVC 1편] 17. 스프링 MVC - 핸들러 매핑과 어댑터 / 뷰 리졸버  (0) 2023.05.29
[스프링 웹 MVC 1편] 16. 스프링 MVC - V1 ~ V5와 비교했을 때 (구조 이해)  (0) 2023.05.29
[스프링 웹 MVC 1편] 15. MVC 프레임워크 제작해보기 - v5  (0) 2023.05.23
'스프링 공부 (인프런 김영한 선생님)/스프링 MVC 1편' 카테고리의 다른 글
  • [스프링 웹 MVC 1편] 20. 스프링 MVC - 기본기능 (요청매핑)
  • [스프링 웹 MVC 1편] 19. 스프링 MVC - 기본 기능 (로깅)
  • [스프링 웹 MVC 1편] 17. 스프링 MVC - 핸들러 매핑과 어댑터 / 뷰 리졸버
  • [스프링 웹 MVC 1편] 16. 스프링 MVC - V1 ~ V5와 비교했을 때 (구조 이해)
ProgYun.
ProgYun.
인내, 일관성, 그리고 꾸준함을 담습니다.
ProgYun.
Perseverance, Consistency, Continuity
ProgYun.
전체
오늘
어제
  • 분류 전체보기
    • 칼럼
    • 일상생활
      • 월별 회고
      • 인생 이야기 (대학생활)
      • 취준
      • 운동인증
      • 제품 사용 후기와 추천
    • 스프링 공부 (인프런 김영한 선생님)
      • 스프링 핵심원리
      • 스프링 MVC 1편
      • 스프링 MVC 2편
    • 면접 준비
    • 전공
      • OOP 정리
      • Design Pattern
    • 스터디
    • English
      • Electronics(Laptop)
      • 1일 1단어

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 컴공
  • 윈도우재설치
  • ssd
  • 윈도우10
  • 포맷
  • 코로나
  • 자존감
  • 해외직구
  • mason
  • 일상
  • 오미크론
  • 하이닉스
  • 코로나19
  • 피로그래밍
  • 확진자
  • NVME
  • 대학생
  • 자가격리
  • p31
  • 편입생

최근 댓글

최근 글

hELLO · Designed By 정상우.
ProgYun.
[스프링 웹 MVC 1편] 18. 스프링 MVC - 시작
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.