본문 바로가기

SpringBoot

ch2 05. 원격 프로그램으로 응답하기

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의 메소드

 

 

<실습>

YoilTeller 클래스

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

값 입력 전
값 입력 후

- 이런식으로 헤더 및 응답을 확인할 수 있다. 

 

 

* 이번엔 코드를 다음과 같이 수정한다. 

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>");

    }
}

이렇게 요일을 계산해서 값을 출력하는 코드를 작성할 수 있다.