Springboot 개념정리 - 응답(Response)하는 방법

Yuri Lee·2020년 9월 11일
0

Springboot 개념정리

목록 보기
10/10


스프링부트 강좌 with JPA 14강(마지막) - 응답(Response)하는 방법

(8) 요청 주소에 따른 적절한 컨트롤로 요청 (Handler Mapping)
GET요청 => http://localhost:8080/post/1

해당 주소 요청이 오면 적절한 컨트롤러의 함수를 찾아서 실행한다.

(9) 응답
html파일을 응답할지 Data를 응답할지 결정해야 하는데 html 파일을 응답하게 되면 ViewResolver가 관여하게 된다.

응답에 대한 패턴을 만들어준다.
ViewResolver 는 어떤 파일에 대한 패턴을..

예를 들어 응답할 data가 .jsp 파일이라면 앞에 .jsp가 있는 그 경로가 prefix로 붙고 뒤에 .jsp로 확장자가 붙어서

해당 어떤 string 값에 대한 return 값에 대한 , 주소 요청에 대해 파일을 리턴해주는 패턴을 만들어주는 게 ViewResolver이다.


dispachServlet이 컴포넌트 스캔을 해서 A라는 클래스가 메모리에 떴다. 이게 hello라는 함수를 들고 있고 리턴값이 String이다.

A {
 String Hello() {
  	return "hello";
 }
}

서블릿이 컴포넌트 스캔을 통해 A를 메모리에 띄우고 주소 분배를 하기 위해 handlerMapping에게 넘긴 후 적절한 함수를 찾는다. 그럼 이 스택이 실행된다. 단순하게 hello라는 메세지밖에 없는데 결국 이게 response될텐데 응답될때 그냥 메시지뿐이기 때문이 이게 리턴된다. 데이터니까.

근데 이게 hello라는 파일을 리턴하고 싶다면 ViewResolver가 관여를 한다. hello 파일 앞뒤로 Web-INF/views/hello.jsp 등을 붙인다. 뒤에다가 .jsp....~~

ViewResolver가 관여하지 않게 할 수도 있다. 그래서 내가 직접적으로 경로를 적을 수도 있지만 굳이 그렇게까지 할 필요는..

하지만 Data를 응답하게 되면 MessageConverter가 작동하게 되는데 메시지를 컨버팅할 때 기본전략은 json이다.

데이터를 리턴할때는 앞에 @ResponseBody를 붙인다. 어노테이션.. 그럼 이 리턴값 hello를 파일로 보지 않고 데이터로 본다.

홍길동은 그냥 hello라는 메시지를 받게 되는 것이다. 만약 user라는 엔티티가 있다고 하자.

user {
	int id  = 1;
    String name="홍길동";
}

이런 엔티티를 내가 new해서 return할 때.. return 타입도 user로 바뀌어야 하겠지...
이렇게 되면

A {
 user Hello() {
  	return user;
 }
}

그럼 MessageConverter가 그럼 return 하는게 string 이 아니라 객체인데? 그럼 객체를 홍길동이 이해 못할거야. 그럼 MessageConverter가 이를 json으로 바꿔서 응답해준다.

{
  "id":1, 
  "name":"홍길동"
}

응답할때 Data를 return 하게 되면 Jackson 이라는 얘가 동작한다. 그래서 json으로 컴버터 해서 주는데 이것을 Jackson 이라고 안부르고 MessageConverter라고 부른다.

왜 그럴까? 여기다가 jsackson을 바로 넣게 되면... 기존의 프로그램을 다 수정해야 한다. 더 좋은 게 나온다면..?! 그래서 MessageConverter를 사용하여..(추상화 객체로 놓는다) 그리고 Jackson을 밑에 놓는다. 만약 나중에 더 좋은 기술이 나오면 이것을 Jackson을 대신하면 된다.

1번은 톰켓 실행시

web.xml이 문지기 역할을 한다. 근데 .. 내가 해야할 일이 너무 많은데 ? 이걸 좀 분배해줄 수 없을까? 이 상황에서 2번이 contextLoaderListener이 create 된다. applicationContext.가 읽어진다. 이때 root-context.xml이 읽어지는데 이때는 db 관련된 객체들을 컴포넌트 스캔해서 메모리에 올린다.

ServiceImpL, DAO, Vo 등등.. db에 연결되어서 처리하는 얘들이다. 메모리로 띄어놓는다.

그리고 그 다음에 request 요청이 들어오는 것이다. 다 실행이 되고 나서 ..
5. request from client, 요청이 딱 들어오면 dispathcerServlet이 동작하게 되는데 이것은 sevlet-context.xml 파일에 의해서 읽힌다. 이렇게까지 복잡하게 생각할 필요 없다.

톰켓이 실행되면 문지기가 web.xml 파일을 읽고 자기가 해야할 일을 한다. 이때 db관련 얘들을 메모리에 띄어놓는다. 그 다음에 사용자 요청이 들어오면 .....

dispatcherServlet이 문지기가 해야 할일을 조금 분배를 해서(frontController패턴..) 자기가 대신 일을 한다. 웹과 관련된 얘들을 메모리에 띄운다. 그리고 주소 분배를 한다. 그리고 나서 모든 요청이 끝나게 되면 응답을 해야 된다. 응답을 하게 될대 data로 리턴할지, html파일로 리턴할지 이것에 대한 결정ㅇ이 끝나면 정상적으로 실행된다 .

web.xml이 문지기 역할을 한다. 이 문지기 역할을 해서 로딩을 하고 나면 제일 처음에 ContextLoaderListner이 호출된다. 이것은 그냥 톰켓이 실행할 때의 일이다. 사용자가 요청하는 일이 아님. 미리 서버가 켜져있어야 하기 때문.. 그리고 하나의 성이 만들어진 것이다.

핵심은 .. 어차피 이런 것들 눈으로 보면서 세팅해야 하는 일이 초반뿐이다. 그 다음에 비지니스 로직을 짜는 게 중요하다. 이런것들과 아무런 상관이 없다.

자기가 해야할일을 기억하고 .. 일감도 주고.. 등등 ..
이런 것들을 한다. 추상적으로 이런 것들을 알고 있으면 된다.

-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-

profile
Step by step goes a long way ✨

0개의 댓글