스프링 MVC 전체 구조

직접 만든 MVC 프레임워크 구조

 

Spring MVC 구조

 

사실상 명칭만 조금씩 다를 뿐 같은 구조이다

 

스프링 MVC의 핵심 - DispatcherServlet

DispatcherServlet 의 요청 흐름과 동작 순서

 

스프링 MVC - 시작하기

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

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

 

@RequestMapping

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

이것이 바로 @RequestMapping 애노테이션을 사용하는 컨트롤러이다.

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

 

스프링 MVC - 컨트롤러 통합

@RequestMapping 은 클래스 단위 뿐 아니라 메서드 단위로도 적용할 수 있다.

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

/**
 * 클래스 단위 -> 메서드 단위
 * @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;
	}
    
	@RequestMapping
	public ModelAndView members() {
		List<Member> members = memberRepository.findAll();
        
		ModelAndView mav = new ModelAndView("members");
		mav.addObject("members", members);
		return mav;
	}
}

위와 같은 컨트롤러에서는 아래와 같이 조합 된다

 

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

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

 

스프링 MVC - 실용적인 방식

스프링 MVC는 개발자가 편리하게 개발할 수 있도록 수 많은 편의 기능을 제공한다.

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

/**
 * v3
 * Model 도입
 * ViewName 직접 반환
 * @RequestParam 사용
 * @RequestMapping -> @GetMapping, @PostMapping
 */
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {

	private MemberRepository memberRepository = MemberRepository.getInstance();
    
	@RequestMapping("/new-form")
	public String newForm() {
		return "new-form";
	}
    
	@RequestMapping("/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도 함께 구분할 수 있다

+ Recent posts