컨트롤러

김회민·2023년 2월 11일
0

Spring

목록 보기
3/25

Controller

@Component
public @interface Controller {
	@AliasFor(annotation = Component.class)
	String value() default "";
}
  • Spring MVC 모델의 C에 해당한다.
  • Model ( Service, Repository )과 View( JSP, Thymeleaf .. ) 사이를 이어주는 역할을 담당한다.
  • 클래스 앞에 @Controller 애노테이션을 작성하여 사용한다.
  • @Component 를 상속받아, Spring Bean으로 등록된다.
  • 문자열을 반환하면, ViewResolver 과정을 거친다.
    • src/main/resource/static 경로에서 해당 문자열과 같은 이름의 파일을 찾아 ModelAndView를 생성한다.

RestController

@Controller
@ResponseBody
public @interface RestController {
	@AliasFor(annotation = Controller.class)
	String value() default "";
}
  • 클래스 앞에 @RestController 애노테이션을 작성하여 사용한다.
  • ControllerResponseBody 를 상속받으며,
    클라이언트에게 String, Map, JSON 등의 형태로 응답할 때 사용된다.
  • 클라이언트에게 응답을 보낼 때, ReturnValueHandler 과정을 거친다.
    • HttpMessageConverter를 통해 반환 타입에 맞는 데이터를 생성한다.

RequestMapping

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

@Controller
public class SpringMemberSaveControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members/save")
    public ModelAndView process(
            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;
    }
}

@Controller
public class SpringMemberListControllerV1 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping("/springmvc/v1/members")
    public ModelAndView process() {
        List<Member> members = memberRepository.findAll();

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

메소드와 클래스앞에 애노테이션을 붙여서 사용한다.

  • 메소드에 매핑하면 해당 URL을 요청하면 해당 메소드가 호출된다.
  • 클래스에 매핑하면 모든 맴버 메소드의 Root URL가 매핑이 된다.

value 프로퍼티를 통해 URL을 매핑한다.

  • 필수는 아니지만, 생략할 경우 해당 메서드의 Root URL을 등록한다.
  • @RequestMapping(value = "/hello-basic")
  • @RequestMapping({"/hello-basic", "/hello-go"})
    • 배열 형태로 입력하면 여러 URL을 매핑할 수 있다.

여러 프로퍼티를 통해 요청의 조건을 제한할 수 있다.

  • method
    • 필수는 아니지만, 생략할 경우 모든 HTTP Method에서 호출이 된다.
    • RequestMethod.GET 을 입력해서 GET 요청만 받도록 제한할 수 있다.
    • 배열 형태로 입력하면 여러 HTTP Method를 매핑할 수 있다.
    • 축약 애노테이션을 제공한다.
      • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping
  • params
    • 파라미터의 조건을 설정할 수 있다.

      params="mode"mode 파라미터를 포함해야 한다.
      params="!mode"mode 파라미터가 없어야 한다.
      params="mode=debug"?mode=debug 를 포함해야 한다.
      params="mode!=debug"mode 파라미터는 있어도 되지만, 값이 debug면 안된다.
      params={"mode=debug","data=good"}배열 형태로 입력해서 여러 조건을 설정할 수 있다.
  • headers
    • 요청 헤더의 조건을 설정할 수 있다.
  • consumes
    • 요청 Content-Type 조건을 설정할 수 있다.
    • application/json, text/plain, 등
  • produces
    • 요청 Accept 조건을 설정할 수 있다.
    • text/html, 등
profile
백엔드 개발자 지망생

0개의 댓글