[Spring] HTTP 요청을 받아 화면에 출력하기

2024. 7. 8. 15:55WebBack/Spring

Spring 주제 URL
원격 프로그램은 어떻게 실행될까? https://ycraah.tistory.com/37
AWS에 배포하기 https://ycraah.tistory.com/38

 

앞에서 System.out.println은 콘솔에 출력을 하는 명령어라고 배웠다. 그러면 외부에서 요청을 받아 결과를 화면에는 어떻게 출력할 수 있을까?

 

1. 콘솔에 입력하여 출력하기

Java에서처럼 콘솔에 입력하는 방법은 다음과 같다. 클래스의 컴파일링 파일은 target에 저장되기 때문에 우클릭하고 [show in Local Terminal] -> [Terminal]을 클릭하자. 

 

 

그러면 다음과 같은 콘솔창이 뜬다. 

 

콘솔창을 통해 클래스를 직접 실행할 파일을 찾아야 한다. 먼저, 클래스 파일이 모여있는 classes 폴더로 들어가야한다. 

이를 위해 콘솔창에 cd classes를 입력한다. 그 뒤에 java (패키지 경로).(클래스 이름) (입력할 값) 이렇게 입력하면 된다. 

'입력할 값'은 자바에서 configuration을 이용하던 것을 생각하면 된다. 만약 '입력할 값'에 2024 7 8을 입력하면 자바가 이를 객체로 저장한다. ([0] = 2024 [1] = 7 [2] = 8) 그러면 이를 불러들어서 코드를 실행할 수 있다. 

 

2. HttpServletRequest

그런데 콘솔창으로 매번 입력하기는 번거롭다. HttpServletRequest를 통해 이를 쉽게 실현할 수 있다. 사용하는 방법은 아래와 같다. 

@Controller
public class YoilTeller {
	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request)

 

main의 매개변수는 흔히 String[] args를 사용한다. 그런데 이번에 매개변수는 HttpServletRequest request로 바뀌어있다. 이제 URL을 입력하면 콘솔창에 입력한 것과 마찬가지로 객체를 만들어 그 값을 저장한다. 이제 request 변수를 통해 입력된 값을 이용할 수 있다. 아래는 HttpServletRequest 클래스가 가진 메서드이다. 

 

 

이를 코드로 읽기 쉽게 정리하면 다음과 같다. 

@Controller
public class RequestInfo {
    @RequestMapping("/requestInfo")
    //    public static void main(String[] args) {
    public void main(HttpServletRequest request) {
        System.out.println("request.getCharacterEncoding()="+request.getCharacterEncoding()); // 요청 내용의 인코딩
        System.out.println("request.getContentLength()="+request.getContentLength());  // 요청 내용의 길이. 알수 없을 때는 -1
        System.out.println("request.getContentType()="+request.getContentType()); // 요청 내용의 타입. 알 수 없을 때는 null

        System.out.println("request.getMethod()="+request.getMethod());      // 요청 방법
        System.out.println("request.getProtocol()="+request.getProtocol());  // 프로토콜의 종류와 버젼 HTTP/1.1
        System.out.println("request.getScheme()="+request.getScheme());      // 프로토콜

        System.out.println("request.getServerName()="+request.getServerName()); // 서버 이름 또는 ip주소
        System.out.println("request.getServerPort()="+request.getServerPort()); // 서버 포트
        System.out.println("request.getRequestURL()="+request.getRequestURL()); // 요청 URL
        System.out.println("request.getRequestURI()="+request.getRequestURI()); // 요청 URI

        System.out.println("request.getContextPath()="+request.getContextPath()); // context path
        System.out.println("request.getServletPath()="+request.getServletPath()); // servlet path
        System.out.println("request.getQueryString()="+request.getQueryString()); // 쿼리 스트링

        System.out.println("request.getLocalName()="+request.getLocalName()); // 로컬 이름
        System.out.println("request.getLocalPort()="+request.getLocalPort()); // 로컬 포트

        System.out.println("request.getRemoteAddr()="+request.getRemoteAddr()); // 원격 ip주소
        System.out.println("request.getRemoteHost()="+request.getRemoteHost()); // 원격 호스트 또는 ip주소
        System.out.println("request.getRemotePort()="+request.getRemotePort()); // 원격 포트
    }
}

 

여기서 주목해야할 것은 QueryString이다. QueryString은 값을 전달할 때 사용한다.

 

3. getParameter

 

쿼리 스트링은 '?' 이후에 등장하고, &을 기점으로 name과 value로 구분된다. 이런 규칙이 있으니 나중에 파싱할 때 편하다. 위의 코드에서는 year, month, day가 name이고 2021, 10, 1이 value이다. getParameter 메서드를 사용하면 name과 페어인 value값을 저장할 수 있다. 그래서 이제 아래와 같은 코드가 가능하다. 

	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request) 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);

 

 

이제는 콘솔을 이용하지 않고 URL만 사용해서 값을 넘겨주는 것이 가능하다. 

 

 

4. HttpServletRequest

자, 이제 브라우저에 출력을 하는 방법을 알아보자. 앞에서 HttpServletRequest를 통해서 요청을 받을 수 있었다면 이제는 클라이언트에게 값을 전달하기 위한 객체를 만드는 것이 필요하다. 이를 위해 사용해야하는 것이 HttpServletRespons response이다. 사용 방식은 HttpServletRequest와 똑같이 매개변수로 넣어주면 된다. 

 

public class YoilTeller {
	@RequestMapping("/getYoil")
	public void main(HttpServletRequest request, HttpServletResponse response)
}

 

5. 출력 하기

그러면 response 객체에서 브라우저의 출력 스트림을 얻을 필요가 있다. 이를 위해서 PrintWriter out = response.getWriter()을 사용한다. 이제 printout이 아니라 out을 사용해서 클라이언트에 문자열을 전송할 수 있게 되었다. 

그리고 출력할 내용의 타입을 정해주어야 한다. 출력할 내용이 html이므로 "text/html"로 지정해주었다. 그리고 글자가 깨지는 것을 방지하기 위해 인코딩도 "utf-8"로 정해주었다. 

response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<body>");
out.println(year + "년 " + month + "월 " + day + "일은 ");
out.println(yoil+ "요일입니다.");	
out.println("</body>");
out.println("</head>");	
out.println("</html>");

 

6. 결과

@Controller
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.set(yyyy, mm - 1, dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		char yoil = " 일월화수목금토".charAt(dayOfWeek);
		
		//3.출력
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<body>");
		out.println(year + "년 " + month + "월 " + day + "일은 ");
		out.println(yoil+ "요일입니다.");	
		out.println("</body>");
		out.println("</head>");	
		out.println("</html>");
	}

}

 

URL을 다음과 같이 입력한다. 

 

이걸 실행하면 다음과 같이 실행된다. 

 

이렇게 우리가 볼 수 있는 내용은 응답받은 내용이 HTML이기 떄문인데 실제 응답받은 내용을 확인해보면 다음과 같다. 

<html>
<head>
<body>
2021년 7월 1일은 
목요일입니다.
</body>
</head>
</html>