본문 바로가기
스프링/스프링 웹

[Spring] 스프링 MVC 컨트롤러 통합

by drCode 2023. 5. 31.
728x90
반응형

@RequestMapping을 잘 보면 클래스 단위가 아니라 메서드 단위에 적용된 것을 확인할 수 있다.

 

따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.

 

SpringMemberControllerV2

package helloMVC.servlet.web.springmvc.v2;

import helloMVC.servlet.domain.member.Member;
import helloMVC.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 클래스 단위 -> 메서드 단위
 * @RequestMapping 클래스 레벨과 메서드 레벨 조합
 */

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

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v2/members/new-form")
    public ModelAndView newForm() {
        System.out.println("SpringMemberFormControllerV1.process");
        return new ModelAndView("new-form");
    }

    @RequestMapping("/springmvc/v2/members/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.getModel().put("member", member);
        mv.addObject("member", member);

        return mv;
    }

    // /springmvc/v2/members
    @RequestMapping("/springmvc/v2/members")
    public ModelAndView members() {

        List<Member> members = memberRepository.findAll();

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

        return mv;
    }
}

 

 

컨트롤러 클래스를 통합하는 것을 넘어서 조합도 가능하다.

 

아래의 코드는 /springmvc/v2/members 라는 부분에 중복이 있다.

 

  • @RequestMapping("/springmvc/v2/members/new-form")
  • @RequestMapping("/springmvc/v2/members")
  • @RequestMapping("/springmvc/v2/members/save")

 

물론 이렇게 사용해도 되지만, 컨트롤러를 통합한 예제 코드를 보면 어떻게 제거했는지 확인할 수 있다.

 

클래스 레벨에 다음과 같이 @RequestMapping 을 두면 메서드 레벨과 조합이 된다.

 

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

조합 결과

 - 클래스 레벨 @RequestMapping("/springmvc/v2/members")

   : 메서드 레벨 : @RequestMapping("/new-form") → /springmvc/v2/members/new-form

   : 메서드 레벨 : @RequestMapping("/save") →  /springmvc/v2/members/save

   : 메서드 레벨 : @RequestMapping →  /springmvc/v2/members

 

package helloMVC.servlet.web.springmvc.v2;

import helloMVC.servlet.domain.member.Member;
import helloMVC.servlet.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 클래스 단위 -> 메서드 단위
 * @RequestMapping 클래스 레벨과 메서드 레벨 조합
 */

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

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/new-form")
    public ModelAndView newForm() {
        System.out.println("SpringMemberFormControllerV1.process");
        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.getModel().put("member", member);
        mv.addObject("member", member);

        return mv;
    }

    // /springmvc/v2/members
    @RequestMapping
    public ModelAndView members() {

        List<Member> members = memberRepository.findAll();

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

        return mv;
    }
}

http://localhost:8080/springmvc/v2/members/new-form

 

http://localhost:8080/springmvc/v2/members/save

 

http://localhost:8080/springmvc/v2/members

728x90
반응형

댓글