JSP&Servlet/BASIC

GET방식 POST방식 / <input type="hidden">

유혁스쿨 2020. 8. 29. 01:49
728x90
반응형

 

GET or POST 전송방식

 

GET

-<form>태그에서 입력한 파라미터 name과 값이 주소창에노출됩니다.

-이것을 활용하면 서블릿에서 request.getParameter로 혹은 주소창에 ?파라미터이름=값 을 지정하여 값을 송,수신 할 수 있습니다.

-예를들어 현재 페이지상의 게시글을 삭제할때 현재 페이지의 게시글 번호를 확인 할때 활용합니다

 

1. 자바스크립트 location객체에 의해서 이동하는 경우.

2. 하이퍼링크로 이동하는 경우.

3. 서블릿의 response.sendRedirect()로 이동하는 경우.

4. form태그의 method="get"인 경우나 생략된경우.

5. 아작스 get방식인 경우.

6. spring의 redirect이동하는 경우는 모두 get방식. (서블릿자바에서는 SendRedirect)

 

POST

-form태그에 입력한 파라미터 name과 값이 주소창에 노출되지 않습니다.

-주로 가입 혹은 수정페이지에서 데이터를 주소창에 노출시키지 않게 하기 위할때 사용하는 방식입니다.

-네임파라미터 값이 주소창이 아닌 HTTP 바디를 통해 데이터가 넘어가게 됩니다.

-POST방식으로 전송한 네임파라미터에 담은 데이터 또한 컨트롤러의 메서드에서 request.getParameter()로 네임파라미터로넘긴 값을 읽어올수 있습니다.

 

1. form태그의 method=post인경우

2. 아작스 post방식인 경우 (아작스 데이터를 POST방식으로 불러온다)

3. 이진파일 업로드 할때 씁니다.

 

u-it.tistory.com/entry/%EC%9A%94%EC%B2%AD-%ED%8C%8C%EB%9D%BC%EB%AF%B8%ED%84%B0-%EC%B2%98%EB%A6%AC%EB%B2%95-Sevlet-%EC%9E%90%EB%B0%94API-requestgetParameter-%EA%B3%BC-SpringAPI-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-RequestParam-command%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1-%EB%B0%A9%EC%8B%9D

 

추가로 정리하겠습니다.

전송방식과 hidden 태그

get방식은 주소창에 파라미터가 전달되고 post방식은 HTTP body영역의 데이터를 넘겨줍니다.

우리가 <input type="hidden" name=""> 이라는 태그를 사용해서 파라미터를 넘길때

이것은 get방식,post방식 모두 파라미터를 넘길 수 있습니다.

get방식은 주소창에 파라미터와 값이 노출됩니다 그러므로 주소창의 파라미터와 값을 임의로 조작할수 있다는 점이 있습니다.

post방식은 주소창에 파라미터와 값이 노출되지 않습니다. 하지만 파라미터값은 전달합니다. 다만 주소창의 파라미터가 노출되지 않아 넘겨받는 도중 브라우저상에서 파라미터와 값을 임의로 조작하지 못한다는것 입니다.

 

만약 get방식으로 hidden으로 네임파라미터를 넘겨준다고 할 때 넘기는과정에서 주소창에 hidden의 네임파라미터가 노출되는데 이때 주소창에 뜨는 값을 임의로 변경해버리면 값이 변경되서 넘어가게 됩니다.

POST 방식으로도 똑같이 hidden으로 넘길수 있습니다.

 

hidden옵션을 주로 POST방식에서 쓰긴 하지만 hidden옵션은 GET이냐 POST냐에 따라서 사용되는 옵션이 아닙니다.

프로그래밍으로 만들어진 특수한 수(사용자가 지정한 수가 아님)를 넘겨줘야하는데 사용자는 굳이 알필요가없으니까 hidden으로 숨겨서 보내주는 느낌이라고 말할 수 있습니다.

예를들어 게시글을 수정한다고 했을 때, 수정할 게시글의 기준이되는 키는 게시글 번호가됩니다.

게시글 번호를 기준으로 수정을 하는것이 됩니다.

이때, 게시글 번호는 '보여주는 GET방식 페이지인' 게시글 목록 에서 이미 노출이 되긴 했지만 '사용자에게 보여주면 안되는 페이지인' 수정 하는곳 에서는 게시글 번호가 보일필요는없기 때문에 POST방식에서는 hidden으로 숨겨서 그냥보내는느낌입니다.

 

GET방식일때는 뷰페이지단에서 페이지전환시 파라미터를 어떻게 넘기느냐 하고 궁금할수 있는데 이때는

<input type="hidden" name="page" value="${page}"/>

value속성을 사용하여 String으로 값 넘길 값을 지정해주거나, 넘겨받은 값같은 경우에는 ${넘겨줄값} EL표현식으로 넘겨줄값 을 value에 담아 넘깁니다.

<input type="button" value="목록" onclick="location='/controller/board/board_list?page=${page}'" />

<input type="button" location=""> button태그의 location속성으로 url에 파라미터를 지정하여 넘겨줄수 있습니다.

<a href="/controller/board/board_list?page=${a}">

 

혹은 하이퍼링크로 지정하여 넘길수도 있습니다.


하지만 이렇게 일차적으로 정리한 개념은 스프링에서 응용할때 돌발적인 오류를 범하거나 개념적인 부분에서 오해를 일으키곤 합니다

 

GET으로 보내면 회원가입을 열어줘! POST로 보내면 DB로 넣어줘!

POST : 등록, insert할때는 POST를 씁니다

GET : read할때는 보통 GET을 씁니다

 

바로 이 부분에서 오류가 생길수있는데

GET 방식은 기본적으로 주소창에 매핑주소를 입력하여서 해당 뷰페이지를 출력할때의 디폴트 방식이 바로 GET 방식 입니다.

또한 폼태그로 부터 전송받을때 @RequestMapping(RequestMethod.GET)이라고 지정해 줄 필요가없습니다.

@GetMapping을 쓰거나 메서드방식이 생략이 가능합니다

 

뷰페이지를 출력시켜줄수있는 메서드는 default값인 GET방식이 맞으며

띄워주는 메서드가 @GetMapping 혹은 @RequestMapping(RequestMethod.GET) 두가지입니다.

이렇게 설정하면 해당 뷰페이지를 GET방식으로 띄워주게됩니다.

이것은 default값이기때문에 생략이 가능한 것입니다.

만약에 이걸 POST로하면 500 혹은 405 오류가 뜨게됩니다.

그렇기 때문에 주소창을 통해 입력받은 uri에 대한 뷰페이지를 띄울때는 무조건 GET방식이라고 생각하면 됩니다.

보통 직접적으로 입력한다면 메인페이지가 되겠지요?

www.naver.com/ 이거나 www.daum.net/ 등이 되겠습니다.

 

저는 컨트롤러 내에 선언된 메서드가 실행되어 해당 뷰페이지를 출력하거나, 다른 메서드로 넘어갈 때 에는 요청방식을 지정하지 않는다고 생각했습니다.

단순히 JSP단 에서 전송될때 <form>태그의 메서드방식에 따라 전송받을 메서드에서도 uri주소와 메서드방식을 맞춰준다. 이때에 해당 방식이 맞고 매핑 주소가 일치하는 메서드를 실행이 되는거다.

이렇게 생각했지만 메서드의 방식에 따라서 뷰페이지도 그 방식을 따라가 띄우는게 확인이 됩니다.

지금부터는 개념이 미궁으로 빠집니다.

 

가장 처음 주소창에 uri 매핑주소를 입력하게되면 해당 매핑주소와 일치하는 메서드를 찾게되며 그 메서드에 선언된 뷰페이지를 출력하게 됩니다. 이때는 클라이언트(view)가 아닌 다른 무언가로부터 요청을 받아오게 됩니다.

그리고 무조건 GET방식으로 받아오게됩니다

아마 클라이언트가 아닌 서버로부터 요청을 받는거같습니다.

만약 @PostMappind이든 @RequestMapping(method = RequestMethod.POST) 이와같이 POST를 지정해주고 해당 uri를 직접 입력하면 500 Error가 발생하게 됩니다.

그래서 서버로 부터 처음 실행되는 요청방식은 default값이 GET 방식 인거 같습니다.

서버가 GET방식으로 요청을보냈는데 POST로 받으려하니 동일한 방식의 메서드가 없어 오류가 나는거 같습니다

 

그리고 POST방식인 @PostMapping, @RequestMapping(method=RequestMethod.POST)

어노테이션이 선언되있을때 return 반환한 뷰페이지 파일을 POST방식으로 불러오는거처럼 보입니다.

이것을 보면 앞서 말했듯 메서드에 선언된 어노테이션의 method전송방식에 따라서 출력시켜주는 뷰페이지마저도 컨트롤러 메서드에 선언된 어노테이션 전송방식으로 출력하게 되는게 아닐까 하고 의문이 들어버립니다.


도저히 미궁이라 코드와 결과물을 비교해가면서 질문하겠습니다.

<body>
	<form action="/web/basic01" method="get">
		<p>
			<input type="submit" value="GET 방식 요청!!" />
		</p>
	</form>
	<form action="/web/basic01" method="post">
		<p>
			<input type="submit" value="POST 방식 요청!!" />
		</p>
	</form>
	<form action="/web/basic02" method="post">
		<p>
			<input type="submit" value="POST로 req-ex02.jsp 요청" />
		</p>
	</form>
</body>

 

@Controller
public class Controller2 {
	
	
	@RequestMapping(value="/basic00", method = RequestMethod.GET)
	public String basicGet1() {
		System.out.println("클라이언트가 url매핑주소를 직접 입력하였습니다.");
		System.out.println("서버로부터 요청이 들어옴 : GET");
		
		return "request/req-ex01";
	}
	
	@RequestMapping(value="/basic01", method = RequestMethod.GET)
	public String basicGet2() {
		System.out.println("Form으로부터/basic01요청이 들어옴 : GET");
		
		return "request/req-ex01";
	}
	
	@PostMapping("/basic01")
	public String basicPost1() {
		System.out.println("Form으로부터/basic01요청이 POST방식으로 들어옴");
		
		return "request/req-ex01";
	}

	@PostMapping("/basic02")
	public String basicPost2() {
		System.out.println("Form으로부터/basic01요청이 POST방식으로 들어옴");
		System.out.println("/req-ex02.jsp파일을 POST방식으로 요청");
		
		return "request/req-ex02";
	}

}

 

코드는 총 4가지로

1. /basic00을 주소창에 입력했을 때 서버로부터 받은 요청방식을 확인하기위한 메서드 입니다.

2. 뷰 페이지에서 폼태그의 GET 방식으로 요청하는 버튼을 클릭 하였을때 요청을 받는 메서드입니다.

3. 뷰 페이지에서 폼태그의 POST 방식으로 요청하는 버튼을 클릭 하였을때 요청을 받는 메서드입니다.

4. 뷰 페이지에서 폼태그의 POST방식으로 요청하며 버튼을 클릭 하였을 때 req-ex02.jsp 뷰페이지 파일을 열어 뷰 페이지로 출력 시켜주는 메서드입니다.

 

 

우선 /basic00을 입력하여 매핑주소를 입력하였을 때 페이지가 처음 실행되는 메서드의 default 방식을 확인해보겠습니다.

 

 

주소창에 url 매핑주소인 /basic00 입력
/basic00의 뷰페이지 출력과 GET방식 확인

 

 

 

 

콘솔창에 로그 출력 : url 매핑을 입력했을때 서버로부터 받은 전송방식이 default 메서드 방식인 GET방식

다음은 두번째 메서드를 실행하도록 하겠습니다. GET 방식 요청 !! 버튼을 클릭합니다.

 

 

 

당연하다는 듯 GET방식으로 요청이 처리된것을 확인할 수 있습니다.

 

 

세번째 입니다. POST방식 요청!! 버튼을 클릭해보겠습니다.

 

 

 

너무나도 당연하게 POST방식으로 요청을 처리했다는게 확인됩니다.

 

네번째로 페이지를 전환해주는 버튼인 POST로 req-ex02.jsp버튼을 클릭합니다.

 

 

 

새로운 뷰페이지를 출력하는데 이 요청은 post방식으로 진행됩니다.

 

 

<form action="/web/basic01" method="post">

분명 Post방식으로 요청을 보냈고 해당 요청이 컨트롤러로 넘어와 메서드방식이 post방식인 /basic02의 uri를 찾고 그 메서드를 실행하여 req-ex02.jsp파일을 실행하여 뷰페이지에 출력합니다.

근데 이게 어떻게 된 일이죠? 로직처리를 완료하고 새로운 뷰페이지를 출력시켰는데 POST를 띄우고있네요...

 

제가 햇갈리는게 바로 이부분입니다.

Controller에 선언된 메서드가 만약 PostMapping과 같은 어노테이션으로 POST방식을 넘겨받을때

다른페이지를 띄우는것도 POST방식이 되는걸까요?

아닐수도 있는데 정확하게 모르겠습니다.

조금햇갈립니다..

 

이게 버튼을 눌렀을때 <form method=post/>가 작동하여 컨트롤러로 넘어와 메서드로 POST방식으로 넘겨왔을때까지의 상태만 말하는것인지

아니면 POST로 받은 후 메서드로직이 실행되는 방식마저도 POST방식으로 마지막에 return 뷰를 요청을해서 저 view페이지를 띄워주는건지.

 

더 공부해봐야할 부분인것 같습니다.

 

전자가 맞는데 자꾸 후자인것 같아서 햇갈립니다 이부분이...

 

단순히 JSP뷰페이지파일의 <form>태그로부터 요청을 받을때 <form>태그의 메서드 전송방식과 컨트롤러 내부의 요청을 받는 메서드의 메서드전송방식이

동일해야 하며 메서드에서 jsp파일을 열거나 redirect할때는 default가 GET방식이다 라고 생각했지만

그게아닌거일수도 있을것 같습니다.

 

제가 궁금해하는 부분을 파악하시고 도움주실수 있는분들은 댓글로 설명좀 부탁드릴게요...

Form으로부터 컨트롤러의 메서드로 매핑되어 전송받을때까지만 유효한것인지.

전송받은 후 메서드에서 뷰리졸버로 뷰페이지를 바꿀때도 post방식으로 요청방식을 유지 하는것인지...

 

 

 

728x90
반응형