Spring MVC - Controller 통합

shinyeongwoon·2022년 12월 27일
0

spring MVC

목록 보기
21/32

Spring MVC - Controller 통합

@RequestMapping을 잘 보면 클래스 단위가 아니라 메서드 단위에 적용된 것을 확인할 수 있다.
따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.

SpringMemberControllerV2

경로 : hello.servlet1.web.springmvc.v2

package hello.servlet1.web.springmvc.v2;

import hello.servlet1.domain.member.Member;
import hello.servlet1.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;

/**
 * 클래스 단위 -> 메서드 단위
 * @RequestMapping 클래스 레벨과 메서드 레벨 조함
 */
@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;

    }

}

조합

컨트롤러 클래스를 통합하는 것을 넘어서 조합도 가능하다.
/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 SpringMemberContollerV2{}

조합 결과
클래스 레벨 @RequestMapping("/springmvc/v2/members)

  • 메서드 레벨 @RequestMapping("/new-form") -> /springmvc/v2/members/new-form
  • 메서드 레벨 @RequestMapping("/save") -> /springmvc/v2/members/save
  • 메서드 레벨 @RequestMapping -> /springmvc/v2/members

실행 )
등록 : http://localhost:8080/springmvc/v2/members/new-form
목록 : http://localhost:8080/springmvc/v2/members

스프링 MVC - 실용적인 방식

실무에서는 지금 부터 설명하는 방식을 주로 사용

SpringMemberControllerV3

경로 : hello.servlet.web.springmvc.v3

package hello.servlet1.web.springmvc.v3;

import hello.servlet1.domain.member.Member;
import hello.servlet1.domain.member.MemberRepository;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * v3
 * Model 도입
 * ViewName 직접 반화
 * @RequestParam 사용
 * @RequestMapping -> @GetMapping, @PostMapping
 */

@Controller
@RequestMapping("/springmvc/v2/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 파라미터

save(), members()를 보면 Model을 파라미터로 받는 것을 확인할 수 있다.
스프링 MVC도 이런 편의기능을 제공한다.

ViewName 직접 반환

뷰의 논리 이름을 반환할 수 있다.

@RequestParam 사용

스프링은 HTTP 요청 파라미터를 @RequestParam으로 받을 수 있다.
@RequestParam("username")request.getParameter("username")와 거의 같은 코드라 생각하면 된다.
물론 GET 쿼리 파라미터, POST Form 방식을 모두 지원

@RequestMapping -> @GetMapping, @PostMapping

@RequestMapping은 URL만 매칭하는 것이 아니라, HTTP Method도 함께 구분할 수 있다.
예를 들어서 URL이 new-form이고, HTTP Method가 GET인 경우를 모두 만족하는 매핑하려면 다음과 같이 처리하면 된다.

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

이것을 @GetMapping,@PostMapping으로 더 편리하게 사용할 수 있다.
참고록 GET,Post,Put,Delete,Patch 모두 애노테이션을 준비되어 있다.

실행 )
등록 : http://localhost:8080/springmvc/v3/members/new-form
목록 : http://localhost:8080/springmvc/v3/members

0개의 댓글