5-4. 스프링 MVC 컨트롤러 정리

shin·2025년 7월 27일

Spring MVC

목록 보기
22/25

1) 스프링 MVC - 시작하기


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

  • 과거에는 자바 언어에 애노테이션이 없기도 했고, 스프링도 처음부터 이런 유연한 컨트롤러를 제공한 것은 아님

@RequestMapping

  • 스프링은 애노테이션을 활용한 매우 유연하고 실용적인 컨트롤러를 만들었는데, 이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러임

  • 여담: 과거에는 스프링의 MVC 기능이 약했기 때문에, 스트럿츠 같은 다른 프레임워크와 함께 사용하는 경우가 많았음

    • 하지만 @RequestMapping 기반 컨트롤러가 도입되면서 스프링 MVC의 입지가 확고해졌음

주요 컴포넌트

  • @RequestMapping

  • RequestMappingHandlerMapping

  • RequestMappingHandlerAdapter

  • 스프링 MVC에서 가장 우선순위가 높은 핸들러 매핑과 어댑터

  • 실무에서는 99.9% 이 방식의 컨트롤러를 사용함


SpringMemberFormControllerV1 - 회원 등록 폼

package hello.servlet.web.springmvc.v1;

import org.springframework.stereotype.Controller;
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 : 스프링 빈 자동 등록 + 애노테이션 기반 컨트롤러 인식
• @RequestMapping : 요청 URL 매핑
• ModelAndView : 뷰 이름 + 모델 데이터 반환


다양한 등록 방식

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

또는 빈 직접 등록:

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

⚠️ 주의: 스프링 3.0 이상

  • 스프링 부트 3.0부터는 클래스 레벨에 @RequestMapping만 있는 경우 스프링 컨트롤러로 인식하지 않음
  • @Controller 또는 @RestController가 반드시 있어야 함

빈 직접 등록 예시

@Bean
SpringMemberFormControllerV1 springMemberFormControllerV1() {
    return new SpringMemberFormControllerV1();
}

실행 URL


SpringMemberSaveControllerV1 - 회원 저장

@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() 를 통해 모델 데이터 추가

SpringMemberListControllerV1 - 회원 목록

@Controller
public class SpringMemberListControllerV1 {

    private 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;
    }
}
  • 회원 목록 뷰 반환

실행 URL



2) 스프링 MVC - 컨트롤러 통합


  • @RequestMapping을 메서드 단위로 작성했기 때문에, 여러 요청을 하나의 컨트롤러로 통합할 수 있음

SpringMemberControllerV2

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

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @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 mav = new ModelAndView("save-result");
        mav.addObject("member", member);

        return mav;
    }

    @RequestMapping
    public ModelAndView members() {
        List<Member> members = memberRepository.findAll();

        ModelAndView mav = new ModelAndView("members");
        mav.addObject("members", members);

        return mav;
    }
}

조합 방식

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

클래스 레벨과 메서드 레벨 @RequestMapping 조합

  • /springmvc/v2/members/new-form
  • /springmvc/v2/members/save
  • /springmvc/v2/members

실행 URL



3) 스프링 MVC - 실용적인 방식


  • v3에서는 ModelView를 직접 반환하는 불편함을 개선하고, 더 실용적인 컨트롤러 구조를 사용할 수 있음
  • 실무에서는 주로 아래 방식을 사용함

SpringMemberControllerV3

@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @GetMapping("/new-form")
    public String newForm() {
        return "new-form";
    }

    @PostMapping("/save")
    public String save(@RequestParam("username") String username,
                       @RequestParam("age") int age,
                       Model model) {

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

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

    @GetMapping
    public String members(Model model) {
        List<Member> members = memberRepository.findAll();
        model.addAttribute("members", members);
        return "members";
    }
}

주요 포인트

  • Model 파라미터 자동 주입
  • 뷰 이름 직접 반환 (String)
  • @RequestParam 으로 요청 파라미터 바인딩
  • @GetMapping, @PostMapping 으로 HTTP Method 구분

@RequestMapping vs @GetMapping

@RequestMapping(value = "/new-form", method = RequestMethod.GET)

다음과 같이 단축 가능:

@GetMapping("/new-form")
  • PostMapping, PutMapping, DeleteMapping, PatchMapping 도 존재

실행 URL

profile
Backend development

0개의 댓글