Spring mvc 작성

강정우·2023년 12월 2일
0

Spring-boot

목록 보기
29/73

컨트롤러 어노테이션

@Controller
public class SpringMemberFormControllerV1 {
    @RequestMapping("/springmvc/v1/members/new-form")
    public ModelAndView process() {
        return new ModelAndView("new-form");
    }
}
  • @Controller 는 내부에 @Component가 내장되어있어서 스프링이 뜰 때 컨포넌트 스캔에 걸린다. 그래서 자동으로 스프링 빈으로 등록이 된다.
    또한 RequestMappingHandlerMapping에 걸려줘서 매핑 정보로 인식하게 된다.

  • 즉, @Controller의 기능은 @Controller + @RequestMapping이다.
  • @RequestMapping 은 요청 정보를 매핑한다.
    해당 URL이 호출되면 이 메서드가 호출되며 애노테이션을 기반으로 동작하기 때문에 메서드의 이름은 임의로 지으면 된다.

  • 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 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");
        mv.addObject("member",member);
        return mv;
    }

    @RequestMapping
    public ModelAndView members(HttpServletRequest request, HttpServletResponse response) {
        List<Member> members = memberRepository.findAll();
        ModelAndView mv = new ModelAndView("members");
        mv.addObject("members", members);
        return mv;
    }

}
  • 매우 아름답지 않은가? 앞서 우리는 SOLID 원칙을 지키며 개발을 하고자 굉장히 다양한 인터페이스를 구축했고
    이를 구현하여 굉장히 다양한 클래스를 만들었다.

  • 하지만 스프링을 쓰면 프레임웤이 모든걸 알아서 다 해준다. 그래서 우리가 작성할 코드가 위 하나의 자바 클래스로 줄었다.

스프링 어노테이션의 위대함

@Controller
@RequestMapping("/springmvc/v3/members")
public class SpringMemberControllerV3 {
    private MemberRepository memberRepository = MemberRepository.getInstance();

    @RequestMapping(value = "/new-form", method = RequestMethod.GET)
    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";
    }

}
  • 앞서 언급했듯 스프링 OCP을 정확하게 구현하려면 정말 잘 짜여진 인터스페이스들이 있어야한다고 했다. 그리고 @RequestMappging이 아주 휼룽하게 짜여진 인터페이스이다. ModelandView를 반환할 수 있지만 그걸 일일이 적는게 귀찮으니 String을 반환하더라도 반환타입을 감지해 알아서 MV로 바꿔주는 것이다.

  • 또한 @RequestParam이라는 어노테이션으로 Map 객체를 생성하여 iter를 돌며 일일이 값을 넣어주지 않아도, 알아서 값을 잘 갖고온다.
    그리고 method 속성을 받아서 사이드이펙트가 없도록 더 단단하게 로직을 작성할 수 있다.

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글