Wanna be Brilliant Full-Stack Developer
2/28 Spring 마지막 응답(Response)하는 방법! 본문
요청 주소에 따른 적절한 컨트롤러 요청을 하는데 그떄 Handler Mapping이라는 애가 특정한 함수를 찾아준다!
특정한 함수를 찾아줘서 예를들어
GET요청 => http://localhost:8080/post/1 이라는 주소 요청이 오면
해당 주소 요청이 오면 적절한 컨트롤러의 함수를 찾아서 실행한다.
실행이 되고 응답이 되면 html파일을 응답할지 Data를 응답할지 결정해야 하는데 html 파일을 응답하게 되면 ViewResolver가 관여하게 된다.
그 응답의 패턴을 만들어주는다. 어떤 타입인지에 대한 파일 패턴을 만들어준다
만약에 응답할 데이터가 .jsp파일이라면 앞에 .jsp파일이 있는 경로가 Prefix 붙고 뒤에 있는 뒤에있는 suffix로 .jsp 합성자가 붙어서 해당 어떤 스트링값에 대한 리턴 값에 대한 어떤 주소 요청에 대한 파일을 리턴할수 있는 패턴을 만들어주는것이 ViewResolver이다.
예를 들어서 DispatchServlet이 컴포넌트 스캔을 해서 A라는 클래스가 메모리에 떴다.
Hello라는 함수를 가지고 있고 리턴타입이 String인 상태에서 return을 hello라는걸 리턴 한다면 단순한 함수이다.
DispatchServlet이 컴포넌트 스캔을 통해서 A를 메소드에 띄우고 그다음에 주소 분배를 하기 위해서는 자기가 하는것보다는 HandlerMapping에 넘긴다.
HandlerMapping이라는 애가 적절한 함수를 찾고 찾았으면 실행을 한다.이 stack이 실행되면 실행될떄 단순히 Hello라는 메시지밖에 없으니 그러면 이 리턴이 Hello라는 메시지가 요청한사람한테 Response될텐데 response될떄 hello라는 메시지가 요청한쪽으로 응답이 될것이다.
Hello라는 메시지가 아니라 Hello라는 파일을 리턴하고 싶으면?
ViewResolver가 관여를 하여서 VeiwResolver가 Hello라는 파일 앞뒤로 Web_INF/views/hello.jsp 파일이 있는데 viewReslover가 hello 앞에다가 Web-Inf/view라는걸 붙여주고 뒤에다가 Web-Inf/view/hello 이렇게 리턴값을 집어넣고
prefix로 .jsp를 붙여서 Web-inf/view/hello.jsp 붙여주는것이 ViewResolver이다.
ViewResolver가 관여하지 않게 할수도있다. 내가 직접적으로 경로를 적어서 Response를 할수도있지만 굳이 그럴필요는 없다.
하지만 Data를 응답하게 되면 MessageConverter가 작동하게 되는데 메시지를 컨버팅할 때 기본전략은 json이다.
@ResponseBody라는걸 붙이면 리턴값 Hello를 파일로 안보고 데이터를 본다.
MessageConverter가 Hello는 String이네? 그러면 요청한 사람한테 hello라는 메시지를 그냥 받게 된다.
여기서 재미있는게 유저라는 Entity가 있는데 id , name 이런걸 가지고 있는데 int id =1 . String name. = "홍길동"
이런 엔티티를 new를 해서 리턴할때 user를 리턴하게 해주면 MessageConverter가 이걸 확인하고 이게 객체라는걸 확인하고 객체를 요청한 홍길동이 이해를 못하니까 그러니까 이 user를 JSON으로 바꿔주고 응답을 해준다
그러면 User객체가 { "id : 1 , "name" : "홍길동" }이렇게 바꿔주는 역할이 MessageConverter의 역할이다!
알아서 JSON으로 바꿔서 리턴을 해준다는것이다
여기서 정리해자면 응답할때 Data를 응답할지 Html파일을 응답할지 결정해야 하는데 Html파일을 응답하게 되면 결국 J우리는 JSP를 쓸건데 JSP를 응답하게되면 ViewResolver가 관여하게 되고 suffix. prefix를 붙여서 해당파일을 리턴하게 되는데 이떄 해당파일은 클라이언트는 웹브라우저를 요청할거기때문에 웹브라우저는 .jsp파일을 이해를 못하기 떄문에
그떄 톰캣이 .jsp파일을 html파일로 변환해서 Return해준다.
하지만 Data를 응답하게 되면 MessageConverter가 작동하게 되는데 JSON으로 응답하게 된다. 왜냐하면 기본전략이 Jackson라이브러리 가 존재한다.
응답할떄 데이터를 리턴하게 되면 Jackson이라는 애가 동작하게되면 JSON으로 컨버팅해서 주는데
이거를 잭슨이라고 안하고 MessageConverter라고 부른다 왜냐하면 여기다가 Jackson이라는 거를 바로 넣게 되면 Jackson보다 더 좋은 중간 데이터가 나중에 나와서 그것을 사용하려면 기본의 프로그램을 다 수정해줘야하는데
MessageConverter라는 애를 두면 애를 추상화 객체로 넣고 밑에다가 Jackson넣고 나중에 Myson이라는 이상한 데이터타입이 나와서 바꿔야한다면 Jackson을 날려버리고 MYson바꿔넣어주면 코드는 변함없이 사용할수 있다.
톰캣 실행시에 Web.xml이 문지기 역할을 해서 로딩이 되고나면 ContextLoaderListner가 호출이 되는데 이거는 톰캣이 실행을 할때 일이다. 사용자의 요청할떄 의 일이 아니다.
사용자가 요청을 하기전에 서버가 켜지고 로딩이 되어있어야하는데 서버가 켜질때 Web.xml이 호출되고 그리고 나서 안에 성이 만들어지는것이다. 그 성이 만들어질떄 두번째로 ContextLoaderListener이 만들어지고 두번쨰로 호출될때
제일 처음에 보면 톰캣이 실행시에 Web.xml이 로딩되서 문지기가 해야할 문서들을 쭉 읽고 해야할일이 너무많으면 분배해줄생각을 하고 있는데 2번쨰로 ContextLoaderListener가 크레이트 되고 applicationContext가 읽어진다.
applicationContext 가 읽어 질떄 Root-context-xml이 읽어지는데 여기에서는 보통 데이터베이스 관련된 어떤 객체들을 컴포넌트 스캔해서 메모리에 올린다 그때 ServiceImpl이나 DAO , VO가 메모리에 뜬다.
이런애들이 나중에 DB에 연결이 되어서 처리를 하는 애들이다.
이들을 메모리에 띄운후 그다음에 다 실행이 되고 있는 상태에서 5번 Request from Client 사용자한테 리퀘스트 요청이 들어온다.
요청 딱 들어오면 기존에 떠있는 DispatcherServlet이 동작이 되는데 이게 누구에 의해서 동작이 되냐면 servlet-context.aml에 의해서 읽히는데 이렇게까지 복잡하게 생각할 필요 없다.
쉽게 이야기하면 톰캣이 실행되면 web.xml 파일을 읽고 자기가 해야할일들을 하고 DB에 관련된 아이들을 메모리에 띄어놓고 그다음에 사용자 요청이 들어오면 주민들이 성안에 들어오고 있으면 DispatcherServlet이 문지기가 해야할일을 조금 분배에서 FrontController패턴으로 분배를 하고 자기가 대신일을 한다. 웹과 관련된일들을 메모리에 띄어놓는다.
띄우고 주소 분배를 한다. 너 일로가 , 너 일로가 이렇게 컨트롤러에 분배를 하고 모든 요청이 끝난뒤
Response를 해야하는데 응답할때는 이거를 Data로 리턴할지 Html파일로 리턴할지 결정하고나서 정상적인 로직이 진행이 된다! 이것을 너무 자세하게 알필요없고 코드를 치면서 자연스럽게 머리에 들어올것이다.
꼭 기억해야할것은 무엇인가??
이런것들을 눈으로 보면서 셋팅할일은 초반 세팅 프로젝트 세팅 밖에 없다.
그다음에는 비즈니스 로직을 짜는것이 중요한데.. 비즈니스 로직짜는것과는 이거는 상관이 없다.
최초 입구에서는 Web.xml이 자기 해야할일을 기억하고 그다음에 자기 해야할일이 너무많으니까 DispatcherServlet에 넘겨서 애한테 일감을 주고 그리고 미리 띄어놔야 되는것들은 ContextLoaderListener를 통해서 데이터베이스 관련된것들을 띄어놓고 이런것들을 한다 추상적인 개념만 알고있으면 된다!
'Some Memos > Spring 개념' 카테고리의 다른 글
2/28 SPRING 스프링 컨테이너 에서 'ApplicationContext'은 무엇인가? (0) | 2022.02.28 |
---|---|
2/28 SPRING DispatcherServlet은 무엇인가? (0) | 2022.02.28 |
2/24 SPRING HTTP 쿼리 스트링, 주소 변수매핑! 에대해 알아보자 ! (0) | 2022.02.24 |
2/24 SPRING HTTP 4가지 요청방식 (0) | 2022.02.24 |
2/24 SPRING Controller 기본 동작 이해하기! (0) | 2022.02.24 |