MVC, dispatcherServlet와 helper class

0

개념정리

목록 보기
24/33
post-thumbnail

기본 프로젝트 설정

  • context root : url의 path로 사용될 주소
  • 기본 spring lib외에 spring mvc 라이브러리가 있어야 한다.
    -> dynamic web으로 하면 lib폴더에 파일을 다 넣어야하는데 그러기엔 너무 많으니까 maven프로젝트로 바꿔보자~
    • war: web archive , jar : java archive

DispatcherServlet, View Resolver

  • 톰캣실행하면 요청이 들어오면 dispatcherServlet이 알아서 스프링 컨테이너를 자동 구동해주는 클래스다.

  • 요청에 대한 handler, controller 를 전달하는 역할 (frontController)

  • 위의 역할을 해준다. 디스패처로 설정하면 위에 코드 안적어줘도 됨
    /mvc/a라고 요청이 들어오면 < url-pattern>와 매핑되어있는 servlet-name을 찾고 servlet-name의 class를 찾아서 클래스의 객체가 존재하는지 확인함. 없으면 만들고 param-name, value로 xml파일을 읽어서 스프링 컨테이너를 구동함

    • 위처럼 말고 ! 최초의 요청이 오기전에 미리 객체를 만들어 두자 (너무 오래걸리니까)
      <load-on-startup>1</load-on-startup>  <!-- 톰캣이 켜지자마자 dispatcherServlet의 객체를 미리 만들어 두는 것 -->
  • db와는 어떻게 연결하고 dao와는 어떻게 service하고 어떻게 연결할지만 들어가있음
    -> web에 관한 설정(controller)이 더 필요하다.

TestController 예제


-> view resolver가 없으면 뜨는 에러

-> xml에 view resolver를 추가해준다.

  • 요청데이터로는 one, two로 코드에서는 a, b로 받음. name="", value=""는 같고, 꼭 들어가지 않아도되는(선택)값은 required=false 처리해준다. -> 이때 안받아올때의 설정 기본값은 defaultValue로 사용
  • 요청데이터의 기본 형은 String, 따라서 defaultValue도 String 형태로 정해줘야함. 그대신 알아서 형변환 되어 들어올 것임.



-> 같은 변수로 여러개의 데이터 받아오기
-> 리스트도 포문형태 동일!! String[] strArr -> List<String> strArr 로만 변경해주면 됨


dispatcherServlet의 작동 방법

1) /mvc/a로 요청하면 일단 servlet으로 설정된 dispatcherServlet이 받음 -> HandlerMapping으로 보냄. dispatcherServlet은 보내고 아무일도 안함 (거의 일을 시키는애)
2) HandlerMapping이 요청을 받아서 해당 url에 해당하는 컨트롤러용 메서드를 찾아냄 (요청용 컨트롤러 메서드 찾기), 요구되는 매개변수가 있을 경우(url뒤에 ?로 받아온 데이터) 요청을 받아낸 핸들러 매핑이 전달이 잘 될 수 있도록 requstParam으로 해당하는 요청 전달 데이터를 변수에 자동연결시켜주고 메서드 호출.
3) dispatcherServlet에게 알려줌. 어떤 handler(controller)를 쓸지 찾아내고, 핸들러어답터의 도움을 받아서(일을맡김) 컨트롤러의 해당 메서드를 호출.
4) return되는 특정 값으로 view name으로 돌려주고 handlerAdapter가 다시 그 return값(String)을 받아옴.
5) dispatcherServlet가 viewResolver의 도움을 받아서 (suffix, prefix)를 붙여서 해당 view를 찾아냄. -> viewResolver가 jsp를 찾아냈다고 dispatcher에게 전달하고, dispatcher가 forwarding방법으로 이동 -> view가 응답

  • dispatcherServlet은 요청만 받을 뿐, HandlerMapping, Handler Adapter, viewResolver 클래스 (헬퍼클래스, 도우미 클래스의 도움을 받음. 규격화될 수 밖에 없지만, 전달자료들이 도와줘서 해낼 수 있는 것. -> 얘네가 없으면 개발자가 해야됨;
  • 매개변수가 객체라면, handler adapter가 객체(customer)를 만들고, 요청시 전달되는 값들을 세팅해줌 -> 개발자가 하는게 아니라 핸들러의 도움으로 할 수 있는 것이다!!!!!!!!!!!!!!

@ResponseBody

  • 응답받은 문자열을 viewname - viewResolver-> view로 응답하는 시스템을 사용하지 않겠다.
  • 회색부분을 거치지 않겠다는 의미. 5, 6, 7
    -> json형태로 응답해줄 것


  • json문자열로 응답을 '받'기 위해서는 @RequestBody, 응답을 하기 위해서는(return) @ResponseBody

    ↳ application/json타입으로 json형태의 data를 보낼거다. 라고 설정했기 때문에 일반 String 전달데이터는 넣어서 보낼 데가 없음.
  • 요청을 할 때 요청 전달데이터만 보내거나 json만 보내거나 둘중 하나는 할 수 있지만, 둘이 합쳐서 요청 전달 데이터 & json 같이는 불가능.


    ↳ 절대 불가능.
    ↳ url뒤에 ? queryString으로 붙어서 이동하는 것은 가능, 하지만 data : Json.stringify({}) 로는 불가능하다.
    ↳ 일반 문자열도 보내려면 쿼리스트링으로 보내라~
    ↳ 이런얘길 하는 이유는 나중에 이미지 업로드할때 이미지와 글을 같이 올리고싶다~할때를 대비해서 한것. 그때는 form data이용해야 한다.
  • 핸들러 어댑터가 model을 만들고 그걸 controller에 전달. model.Attribute를 통해 attr1을 세팅.
profile
백엔드를 공부하고 있습니다.

0개의 댓글