IT 강의 정리/[스프링의 정석] 남궁성의 끝까지 간다

ch.02 Spring MVC 03~04 HTTP 요청과 응답

Nellie Kim 2022. 9. 28. 14:24
728x90

03. HTTP 요청과 응답 - 실습

지금까지는 원격프로그램의 결과를 톰캣의 콘솔에 출력했었는데, 이번엔 톰캣이 아니라 브라우저에 출력을 해보자!

 

연월일을 입력시 요일을 알려주는 프로그램 (클래스 YoilTeller)을 만들어 보자.

package com.spring.fastcampus.ch2;
 
import java.util.Calendar;
 
//연월일을 입력시 요일을 알려주는 프로그램
public class YoilTeller {
    public static void main(String[] args) {
        //1. 입력
        String year = args[0];
        String month = args[1];
        String day = args[2];
 
        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);
        //1.일요일, 2.월요일...
        char yoil = " 일월화수목금토".charAt(dayOfWeek);
        //3.출력
        System.out.println(year + "년 " + month + "월 " + day + "일은 ");
        System.out.println(yoil + "요일입니다.");
    }
}

target폴더(클래스가 컴파일된 결과가 만들어지는 곳) - 우클릭 - Show in - Terminal 

아래의 터미널에 cd classes 입력하여 classes로 이동

java com.fastcampus.ch2.YoilTeller 2022 10 1 입력시

"토요일입니다" 출력!

 

작동원리는 ?

java 인터프리터가 YoilTeller클래스의 main()를 호출할때, 매개변수인 2022 10 1 (문자열 배열) 을 받아서 args에게 넘겨준다. 그럼 args는 이 배열을 가리키게 된다. 그래서 main메소드 안에서 이 문자열 배열을 쓸 수 있게 되는 것이다!

 

브라우저 요청도 마찬가지다.

url로 원격 요청을 하면 톰캣이 알아서 HttpServletRequest 객체를 만들고 정보를 담아서  main메서드 매개변수(HttpServletRequest request)에 넘겨준다.

그래서 그 밑에 request객체를 만들었다고 생각하고 .get~~~()해서 정보를 출력 할 수 있는것!

 

HttpServletRequest의 메서드이다. 

자세히 알 필요는 없고, 이런 정보를 어떤 메서드가 주는지만 보자. 필요할때 참고할 것!

 

자주 쓰이는 HttpServletRequest의 메서드. 참고하기.

package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.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()); // 원격 포트
    }
}

서버에 돌려보면 브라우저에는 이렇게 나오지만, 

콘솔을 보면, 이렇게 HttpServletRequest메서드를 사용했을때 아래와 같이 정보가 잘 얻어와지는 것을 알 수 있다.

파라미터의 정보를 가져오는 HttpServletRequest의 메서드는 아래와 같이 .getParameter()이다.

 

 

 

이제 작동원리를 배웠으니 , 

처음 만들었던 YoilTeller.java를 로컬프로그램에서 원격프로그램으로 호출할 수 있게 바꿔보자!

YoilTeller클래스에서 코드를 아래와 같이 변경해주고, 우클릭 - Run on Server로 실행

package com.fastcampus.ch2;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
//연월일을 입력시 요일을 알려주는 프로그램
@Controller //어노테이션으로 프로그램 등록을 해주기
public class YoilTeller {
	@RequestMapping("/getYoil")  //맵핑어노테이션붙이고 url키워드 안에 써주기
    public void main(HttpServletRequest request, HttpServletResponse response) 
    		throws IOException{ //static지우고, String[] args 대신 request, response써주기. 예외를 던지게 되어있어서 throws문도 추가.
        //1. 입력
        String year = request.getParameter("year"); //args[0]지우고 request.getParameter()
        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);
        //1.일요일, 2.월요일...
        char yoil = " 일월화수목금토".charAt(dayOfWeek);
        
        //3.출력
        response.setContentType("text/html"); //브라우저에게 text보낸다는걸 알려줌
        response.setCharacterEncoding("utf-8");//브라우저에게 utf-8로 읽어달라고 알려줌
        PrintWriter out = response.getWriter(); //response객체에서 브라우저로의 출력 스트림을 얻는다.
        out.println(year + "년 " + month + "월 " + day + "일은 "); //System.지우기
        out.println(yoil + "요일입니다.");
    }
}

브라우저에서도 잘 출력 되었다! 

 

 

04. HTTP 요청과 응답 - 예제

화면을 새로고침 할때마다 주사위 2개가 랜덤으로 나타나는 프로그램을 만들어보자.

TwoDice클래스 생성하고, 깃허브에 dice.zip파일받아서 STS안에 다음경로로 폴더에 붙여넣어서 이미지파일 준비하기

코드를 아래와 같이 줄줄 써주기  (익숙치 않으니 연습 많이 해야할듯!)

package com.fastcampus.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TwoDice {
    @RequestMapping("/rollDice")
    public void main(HttpServletResponse response) throws IOException{
        int idx1 = (int)(Math.random()*6)+1;
        int idx2 = (int)(Math.random()*6)+1;

        response.setContentType("text/html"); //이 2줄은 자동으로 써주자
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html>"); //브라우저에게 html파일을 만들어서 출력해주기 위해서...
        out.println("<head>");
        out.println("</head>");
        out.println("<body>");
        out.println("<img src= 'resources/img/dice"+ idx1 +".jpg'>");//준비한 이미지파일을 랜덤값으로 불러오도록
        out.println("<img src= 'resources/img/dice"+ idx2 +".jpg'>");
        out.println("</body>");
        out.println("</html>");
    }
}

새로고침 시마다 랜덤 주사위가 잘 출력 되었다.

 

여기서 동적리소스정적리소스를 볼 수 있는데,

내가 만든 TwoDice라는 프로그램은 실행시마다 랜덤값으로 결과가 변하는 동적리소스라고 볼수있다.

이와같은 프로그램, 스트리밍(라이브방송) 등이다.

가져온 6장의 주사위이미지는 변하지 않는 정적 리소스이다. 이미지파일, js, css, html 등이 있다.

이와같이 리소스에는 동적리소스, 정적리소스가 있다.

 

 

출처 : [패스트캠퍼스] 스프링의 정석 : 남궁성과 끝까지 간다