1. HTTP 요청과 응답

1) 브라우저에 URL 주소를 통해 요청 -> HTTP 요청 메시지를 생성
2) HTTP 요청 메시지가 서버에게 전달 (TCP/IP 연결)
- HTTP로 통신하려면 TCP/IP로 연결해야하고, 연결을 하면 두 개의 스트림(I/O스트림)이 생성된다.
하나는 요청, 하나는 응답할 때 쓰인다.
3) 서버가 요청을 받으면 요청한 hello.html파일의 내용을 읽어서 '바디'에 넣는다.(헤더는 톰캣이 자동 완성)
4) 출력 스트림을 통해 응답이 브라우저에게 전달된다.
2. HttpServletResponse로 응답하기 (1)
- 앞서 확인한 hello.html과 같은 파일을 '정적 리소스'라고 한다. 요청할 때마다 파일의 내용이 바뀌지 않기 때문이다.
- 요청하는 클라이언트마다 다른 결과를 보여줘야 할 때에는 프로그램을 이용해서 요청하는 클라이언트마다 다른
응답을 작성해줘야 한다.(동적리소스 - 웹프로그램)
-> 그럴 때 쓰는게 HttpServletResponse
1) URL에 요청을 입력 -> 브라우저가 Http요청 메시지를 만들어준다.
2) TCP/IP 연결을 통해 서버에게 전달된다.
3) 서버가 HttpServletRequest 객체를 생성한 다음 여기에 요청 정보를 담는다. (요청에 사용할 객체)
- 한 가지 객체를 더 만드는데 이게 HttpServletResponse이다. (응답에 사용할 객체)

4) 요청에 의해 해당 메소드가 실행된다.
5) 톰캣이 만든 HttpServletRequest가 매개변수에 전달되고, 마찬가지로 HttpServletRequest를 매개 변수로 선언해주면,
응답 객체를 전달해준다.
그러면 이 두 개의 매개 변수 request, response는 이 메소드 내에서 쭉 사용이 가능해진다.
- HttpServletResponse에는 응답에 필요한 출력 스트림을 HttpServletResponse에 담에서 주게 되어있다.
response.getWriter()로 이 응답을 얻을 수 있으며, 이걸 out이라는 변수에 담고 출력해주면 된다.
6) 출력한 내용을 가지고 톰캣이 Http응답 메시지를 만들어준다. (println()에 의해서 동적으로 만들어준다.)
- 요일을 자동으로 계산해서 알려줌. 요일은 매번 요청할때마다 내용이 달라진다.) -> '동적 리소스'
- 메소드가 호출 될 때마다 매번 다른 결과가 만들어져서 반환되는 것이다.

* 여기서 중요한 건 톰캣이 HttpServletResponse객체를 생성해서 줄 수 있다는 것이고,
이 객체는 우리가 브라우저한테 데이터를 보낼 수 있는 출력 스트림을 같이 넣어서 준다.
톰캣이 객체를 두 개(request, response)를 주는데 하나는 요청 정보, 하나는 응답하는데 사용할 수 있는 객체를 준다.
응답이 필요하면 response 객체를 이용해서 출력할 수 있게 해준다는 것을 알 수 있다.
7) 프로그램이 만들어낸 응답 결과를 가지고 톰캣이 http 응답 메시지를 만들어서 클라이언트한테 전달
(TCP/IP 출력 스트림을 이용)
8) 브라우저가 응답 메시지를 받아서 그 내용을 브라우저에 보여주게 된다.
-> 원래는 html인데 브라우저가 해석해서 보여주게 된다.

2. HttpServletResponse로 응답하기 (2)
- HttpServletResponse객체를 이용해서 HTTP 응답 메시지를 전송

* 헤더는 기본적으로 톰캣이 만들어주지만 아래와 같은 set 메소드들을 통해서 지정할수도 있다.
- setStatus() : 상태 코드 지정
- setContentType() : 응답의 형식이 어떤건지 알려주는게 MIME 타입이고, 이를 지정해주는 것
- setCharacterEncoding() : 우리가 보내려는 text의 인코딩이 utf-8이라는걸 지정해 주는 것.
-> 출력하기 전에 사용해야한다.
- getWriter() : 브라우저로의 출력 스트림 얻어오기(출력 통로)
3. HttpServletResponse의 메소드

<실습>

다음과 같이 실습 코드를 수정하고 브라우저에서 실행하여 값을 넘겨줘보자.



- 이런식으로 헤더 및 응답을 확인할 수 있다.
* 이번엔 코드를 다음과 같이 수정한다.
package com.fastcampus.ch2;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
// 년월일을 입력하면 요일을 알려주는 원격 프로그램
@RestController
public class YoilTeller {
@RequestMapping("/getYoil")
public void main(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. 입력
String year = request.getParameter("year");
String month = request.getParameter("month");
String day = request.getParameter("day");
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 2. 작업 - 요일을 계산
Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간을 갖는 cal
cal.clear(); // cal의 모든 필드를 초기화(정확한 계산을 위해)
cal.set(yyyy, mm-1, dd); // 월(mm)은 0부터 11이기 때문에 1을 빼줘야 함.
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); // 1-7을 반환. 1 : 일요일, 2 : 월요일
char yoil = "일월화수목금토".charAt(dayOfWeek-1); // 배열은 0부터 시작하니 1을 빼줌. 1~7 -> 0~6
// 3. 출력 - 작업 결과를 브라우저에 전송
response.setCharacterEncoding("ms949"); // 한글 윈도우 MS 949
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("year = " + year);
out.println("month = " + month);
out.println("day = " + day);
out.println("yoil = " + yoil);
out.println("</body>");
out.println("</html>");
}
}

이렇게 요일을 계산해서 값을 출력하는 코드를 작성할 수 있다.
'SpringBoot' 카테고리의 다른 글
| ch2 07. MVC로 관심사를 분리하기(2) - 이론 (0) | 2023.07.06 |
|---|---|
| ch2 06. MVC로 관심사를 분리하기 (1) - 실습 (0) | 2023.07.04 |
| ch2 04. HTTP 요청과 응답 (0) | 2023.07.04 |
| ch2 03. 원격 프로그램에 데이터 전달하기 (0) | 2023.06.27 |
| ch2 02. 클라이언트와 서버 (0) | 2023.06.23 |