본문 바로가기

SpringBoot

ch2 03. 원격 프로그램에 데이터 전달하기

1. HttpServletRequest - HTTP 요청 정보를 제공

- 브라우저 URL를 통해 요청을하면 톰캣이 요청 정보를 받아서 HttpServletRequest객체를 만든다. 

이 객체에 요청 정보를 담아서 전달해주게 된다. 

/requestInfo라는 프로그램을 요청하면, 해당 URL에 해당하는 프로그램한테 해당 요청 정보가 전달된다.

 

우리가 원격 프로그램 메소드를 작성할때는 우리가 필요한 것을 매개변수 목록에 적어주면, 그걸 Spring이 제공해준다. 

그러면 그 객체에 있는 메소드들을 사용할 수 있게 된다. 

(우리가 원하는 걸 적으면 Spring이 알아서 제공 -> 편리하다!)

 

 

2. HttpServletRequest의 메소드(1)

- getScheme() : 프로토콜이 무엇인지 반환 

- getServerName() : IP 

- getServerPort() : 서버 포트

- getContextPath() : webapplication 루트 시작 경로(ContextPath를 지정하지 않을 수도 있지만,

하나의 WAS에 여러 웹 애플리케이션이 배포될 수 있기 때문에 각 애플리케이션마다 경로를 다르게 주어야한다.

보통 명시되어 있지만, ContextPath를 WAS의 root로 지정하면 생략될 수 있다.)

- getRequestURL() : serverName과 serverPort를 제외한 부분

- getQueryString() : ?부터 URL끝까지(GetQueryString()메소드를 이용하면 얻을 수 있다.)

 

2. HttpServletRequest의 메소드(2)

- getQueryString() 으로 원격 프로그램에 data를 전달할 수 있다. (&는 구분자)

- 원격 프로그램에서는 getParameter()메소드를 이용해서 읽는다. 

- Names는 name들만 모아서 반환한다. 

- Enumeration는 Iterater의 old 버전이다. (같은 기능)

- getParameterMap()을 하면 key와 value 형태로 저장이 된다. 

K V
"year" "2021"
"month" "10"
"day" "1"

 

2. HttpServletRequest의 메소드(3)

- getParameterValues()는 name이 같은게 여러개일 경우 사용한다.

그러면 이 메소드가 배열 형태로 반환하게 된다. 

"2021" "2022" "2023"

IF) getParameter()를 사용하면 첫 번째 값인 "year"만 얻어오게 된다. 

 

 name은 같아도 상관없지만, 이 값들을 다 읽어오려면 getParameterValues() 사용해야 값을 다 얻을 수 있다.

예를 들어 체크 박스 형태로 취미를 선택하는 경우 컴퓨터, 미술, 음악을 체크할 수 있다고 가정한다면,

hobby=computer & hobby = music.. 이런식으로 구성될 때 활용할 수 있다. 

 

 

<실습>

- getYoil 클래스 생

package com.fastcampus.ch2;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

// 년월일을 입력하면 요일을 알려주는 원격 프로그램
@RestController
public class YoilTeller {
    @RequestMapping("/getYoil")
    public String main(HttpServletRequest request){
        String year = request.getParameter("year");
        String month = request.getParameter("month");
        String day = request.getParameter("day");

        System.out.println("year = " + year);
        System.out.println("month = " + month);
        System.out.println("day = " + day);

        return "Monday";
    }
}

 

해당 코드를 실행한 결과는 다음과 같다. (지금은 Monday를 반환하도록 하드코딩 한 것)

쿼리스트링으로 입력한 year, month, day가 요청에 포함돼서 getParameter()로 읽은 것이다. 

요청이 원격 프로그램에 잘 전달이 된 것이며, 값을 꺼내서 출력해주게 된다. 

 

 

3. HTTP 요청 방법 - GET, POST

- URL에 직접 입력하는 것 외에도 다른 방법들이 존재한다. 

ex) <a> 태그를 이용하면 브라우저 URL창에 직접 입력하지 않아도 클릭만하면 바로 원격 프로그램을 호출할 수 있다. 

(단, 값 변경 불가 -> html 직접 수정 필요)

(URL 직접 입력, <a> -> GET)

ex) <form> 태그를 이용해서 입력&수정이 가능하게 하는 방법 존재. 값을 입력하고 보내기 버튼을 클릭하면

action에 적혀있는 URL로 데이터가 넘어간다. 

입력된 값들이 쿼리 스트링으로 만들어져서 /getYoil이라는 URL과 연결된 프로그램한테 전달된다. 

(GET, POST)

 

IF) <form>에 action 속성을 주지 않으면, yoil.html 자기 자신에게 보내기한 내용이 전송되고, 페이지가 refresh된다. 

 

- HTTP METHOD : 요청방법 

원격 서버에게 요청하는데, 요청하는 방법이 GET, POST가 있다. 
* GET : 읽기(R) -> 디폴트

* POST : 쓰기(W)  -> POST로 전송하는 경우 디폴트가 GET이기 때문에 적어줘야한다. 

 

 

<실습>

- resources -> static 폴더에 yoil.html 파일 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<q>
  <a href="http://localhost:8080/getYoil?year=2023&month=6&day=1">요일을 알고 싶으면 출력</a>
</q>
<p>
  <form action="http://localhost:8080/getYoil" method="get">
    <input type="text" name="year">년<br>
    <input type="text" name="month">월<br>
    <input type="text" name="day">일<br>
    <input type="submit" value="보내기">
  </form>
</p>

</body>
</html>

해당 코드를 실행한 결과는 다음과 같다. 

<a> 태그 부분 실행 결과

- 아까와 달리 쿼리 스트링이 들어간 것을 확인할 수 있다. 

 

다음은 값을 입력한 후 보내기를 클릭해서 결과를 확인해보자. 

쿼리 스트링이 만들어지고, 입력한 값이 제대로 넘어온 것을 확인할 수 있다. 

GET방식으로 전송이 됐기 때문에 보내기 했을 때 URL 창에 쿼리스트링이 보여지는 것이다. 

POST 방식으로 전송하면, 전송한 데이터가 URL창에 나타나지 않는다. 

 

yoil.html 파일에서 get방식을 post 방식으로 수정해서 결과를 확인해보자. 

아까와 똑같은 값을 입력했지만, URL에 쿼리스트링이 나오지 않는 것을 확인할 수 있다. 

'SpringBoot' 카테고리의 다른 글

ch2 05. 원격 프로그램으로 응답하기  (0) 2023.07.04
ch2 04. HTTP 요청과 응답  (0) 2023.07.04
ch2 02. 클라이언트와 서버  (0) 2023.06.23
ch2 01. 원격 프로그램의 작성과 실행  (0) 2023.06.23
ch1. 환경설정  (0) 2023.06.09