MVC 프레임워크 8

Feb 20, 2023

4 mins read

스프링 MVC 컨트롤러 통합

StrpingMemberFormControllerV2

  • hello.servlet.web.springmvc.v2 패키지에 StrpingMemberFormControllerV2를 만든다.
  • StrpingMemberFormControllerV1의 @RequestMapping을 잘 보면 클래스 단위가 아니라 메서드 단위에 적용된 것을 확인할 수 있다.
    따라서 컨트롤러 클래스를 유연하게 하나로 통합할 수 있다.
  • (인프런 수업 듣는중)1
package hello.servlet.web.springmvc.v2;

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

@Controller
@RequestMapping("/springmvc/v2/members") //공통 부분은 클래스 단위로 지정할 수 있다.
public class SpringMemberControllerV2 {
	
	private MemberRepository memberRepository = MemberRepository.getInstance();
	
	//RequestMapping은 메서드 단위로 동작하기 때문에 다 합쳐놔도 정상 작동한다.
	@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");
		//편하게 Member오브젝트 넣어주는 메서드
		mv.addObject("member", member);
		return mv;
	}
	
	//"/springmvc/v2/members" 공통 부분 뒤에 아무것도 안붙으면 아래 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
    접속해보면 잘 동작을 하는걸 확인할 수 있다.

StrpingMemberFormControllerV3

  • 위 V2에서 ModelAndView를 직접 생성해서 반환 했는데 V3에서는 개발자가 편하게 뷰 이름만 String으로 반환하게 수정한다.
  • @RequestParam 사용 : 스프링은 HTTP 요청 파라미터를 @RequestParam 으로 받을 수 있다.
    @RequestParam(“username”) 은 request.getParameter(“username”) 와 거의 같은 코드라 생각하면 된다.
  • @RequestMapping(method=), @GetMapping, @PostMapping : GET, POST 방식을 지정해서 쓸수 있다.
package hello.servlet.web.springmvc.v3;

import java.util.List;

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

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

private MemberRepository memberRepository = MemberRepository.getInstance();
	
	//GET방식, POST방식을 지정할 수 있다.
	//@RequestMapping(value = "/new-form", method = RequestMethod.GET)
	@GetMapping("/new-form") //위와 똑같은 기능
	public String newForm() {
		return "new-form"; 	
	}
	
	//@RequestMapping(value = "/save", method = RequestMethod.POST)
	@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);
		return "save-result";
	}
	
	//@RequestMapping(method = GET)
	@GetMapping
	public String members(Model model) {
		
		List<Member> members = memberRepository.findAll();
		model.addAttribute("members", members);
		
		return "members";
	}
	
}
  • RequestMapping을 GET으로 지정한 new-form 메서드는 결과가 잘 나온다. postman_get_result

  • GET으로 지정한 new-form 메서드를 POST로 요청 해보면 에러가 난다. postman_post_err

  • http://localhost:8080/springmvc/v3/members/new-form
    http://localhost:8080/springmvc/v3/members
    접속해보면 잘 동작을 하는걸 확인할 수 있다.