컨트롤러의 발전 과정

김회민·2023년 2월 11일
0

Spring

목록 보기
4/25

Controller Interface

public interface Controller {
    ModelAndView handleRequest(
				HttpServletRequest req, 
				HttpServletResponse resp
		) throws Exception;
}
@Component("/springmvc/old-controller")
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(
            HttpServletRequest request,
            HttpServletResponse response
    ) throws Exception {
        System.out.println("OldController.handleRequest");
        return null;
    }
}
  • 스프링 초기에 사용되던 컨트롤러 인터페이스이다.
  • @Component 애노테이션을 사용해 Spring Bean으로 등록한다.
    • name 프로퍼티에 값을 입력하면, 그 값을 URL에 매핑한다.
  • Controller를 상속받아 handleRequest를 오버라이딩하여 구현하는 방식이다.

Controller Annotation

@Component
public @interface Controller {
	@AliasFor(annotation = Component.class)
	String value() default "";
}
  • 현재 가장 많이 사용되고 있는 방식이다.
  • 클래스 앞에 @Controller 애노테이션을 작성하여 사용한다.
  • @Component 를 상속받아, Spring Bean으로 등록된다.
  • Controller로 등록된 클래스 내의 메서드에서 문자열을 반환하면,
    src/main/resource/static 경로에서 해당 문자열과 같은 이름의 파일을 찾아
    ModelAndView를 생성하여 반환한다.

컨트롤러 통합

@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 req,
            HttpServletResponse resp
    ) {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));

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

        ModelAndView mv = new ModelAndView("save-result");
        mv.addObject("member", member);
        return mv;
    }

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

        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }
}
  • Class 단위로 @RequestMapping을 등록하면 맴버 메소드들은 그 URL을 접두사로 자동 등록한다.
    • /new-form/springmvc/v2/members/new-form
  • 메서드 단위로 동작하여 서로 관련된 URL을 묶어서 관리할 수 있다.

Get, Post, Put, Patch, Delete Mapping

@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";
    }
}
  • @GetMapping 이나 @PostMapping을 사용하여 HTTP Method를 설정할 수 있다.
  • @RequestMapping(method = RequestMethod.GET) 의 축약어라 생각하면 편하다.
profile
백엔드 개발자 지망생

0개의 댓글