본문 바로가기
SpringBoot/이론

[ Spring Boot ] C - V 간의 다양한 방법으로 데이터 주고 받기

by Hwanii_ 2023. 9. 14.
728x90

1.

HttpServletRequest 객체를 사용하는 방법.

 

>> 활용도가 낮다 == 구식의 방법 이다.

 

why ?

request 객체 자체가 Not POJO인 Servlet 의 객체 이기 때문의 경량이지 않다.

 

test01() 메서드

 

@RequestMapping(value = "/test01")
	public String test01(HttpServletRequest request, Model model) {	//	request 객체 사용 방식.
		
		//	request 자체가 Not POJO인 Servlet 객체 이기 때문에, 활용도가 낮다 (구식 이다)
		
		System.out.println("request : " + request);
		
		VO vo = new VO();
		
		System.out.println("vo : " + vo);
		
		vo.setId(request.getParameter("id"));
		
		System.out.println("id : " + vo.getId());
		
		model.addAttribute("apple", vo.getId());
		
		return "test01";	//	webapp/WEB-INF/views/test.jsp
	}

 

test01.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
   <head>
      <meta charset = "UTF-8">
      <title>test 01</title>
   </head>
   <body>

	<h1>${apple}</h1>

      	<form action="/test01" method="post">
         	<label for="id">ID : </label>
         	<input type="text" id="id" name="id">
         	<button type="submit">전송</button>
      	</form>
      
   </body>
</html>

 

[ 결과 ]

 

request : org.apache.catalina.connector.RequestFacade@5de68f2b
vo : VO(id=null, name=null)
id : null

 

 

 

request : org.apache.catalina.connector.RequestFacade@5de68f2b
vo : VO(id=null, name=null)
id :  테스트

 

2.

@RequestParam  어노테이션을 사용 하는 방법.

 

@RequestParam  어노테이션은 default 속성값으로 required가 true 이기 때문에,

id 파라미터 값과 name 파라미터 자체를 URL 요청에 같이 주지 않으면, 400 에러가 발생 하게 된다.

 

또한, 가독성 측면에서 좋지 않은 방법 이다.

 

test02() 메서드

 

@RequestMapping(value = "/test02")
public String test02(@RequestParam("id") String id, @RequestParam("name") String name, Model model) {	//	@RequestParam 사용 방식.	

    //	@RequestParam 어노테이션을 사용 하면 커맨드 객체를 사용하는것 하고 성능상에 차이는 없다.
    //	하지만 가독성 측면에서 안좋긴 하다. 그래서 사용을 잘 안할것 같지만, 또 은근히 사용 되고 있다.
    //	이것을 커맨드 객체로 바꾸는 작업을 할줄 알아야 한다.

    //	@RequestParam 어노테이션은 default 값이 required 이기 때문에,
    //	id 파라미터 값과 name 파라미터 값을 보내지 않으면, 404 에러가 발생 한다.

    System.out.println("id : " + id);
    System.out.println("name : " + name);

    model.addAttribute("apple", id);
    model.addAttribute("banana", name);

    return "test02";	//	webapp/WEB-INF/views/test.jsp
}

 

test02.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
   <head>
      <meta charset = "UTF-8">
      <title>test 02</title>
   </head>
   <body>

	<h1>${apple}</h1>
	<hr>
	<h1>${banana}</h1>

      	<form action="/test02" method="post">
         	<label for="id">ID : </label>
         	<input type="text" id="id" name="id">
		<label for="name">NAME : </label>
		<input type="text" id="name" name="name">
         	<button type="submit">전송</button>
      	</form>
      
      
   </body>
</html>

 

[ 결과 ]

 

 

.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'id' for method parameter type String is not present]

 

URL 에 필요한 값의 파라미터 자체를 보내지 않으면 400 에러가 뜨게 된다.

 

Bad Request ?

 

 

해결 방법 :

 

1) URL에 필요한 요청값을 반드시 실어서 보내기.

 

2) default 값을 required = true 가 아닌 required = false 로 명시 하기.

 

1) 부터 먼저 확인 하면, 아래와 같다.

 

 

위와 같이, 필요한 요청값의 파라미터만 보내줘도 400 에러는 해결된다.

 

id 파라미터와 name 파라미터의 값이 없으면 그냥 아래와 같이 뜨게 된다.

 

 

왜냐하면 값이 없기 때문 이다.

 

값을 실어서 보낸다면 ?

 

 

 

이런식으로 뜨는 것을 확인 할 수 있다.

 

2) 방법도 확인해보자.

 

@RequestMapping(value = "/test02")
public String test02(@RequestParam(required = false) String id, @RequestParam(required = false) String name, Model model) {	//	@RequestParam 사용 방식.	

    //	@RequestParam 어노테이션을 사용 하면 커맨드 객체를 사용하는것 하고 성능상에 차이는 없다.
    //	하지만 가독성 측면에서 안좋긴 하다. 그래서 사용을 잘 안할것 같지만, 또 은근히 사용 되고 있다.
    //	이것을 커맨드 객체로 바꾸는 작업을 할줄 알아야 한다.

    //	@RequestParam 어노테이션은 default 값이 required 이기 때문에,
    //	id 파라미터 값과 name 파라미터 값을 보내지 않으면, 404 에러가 발생 한다.

    System.out.println("id : " + id);
    System.out.println("name : " + name);

    model.addAttribute("apple", id);
    model.addAttribute("banana", name);

    return "test02";	//	webapp/WEB-INF/views/test.jsp
}

 

 

파라미터 자체가 없이 test02 요청만 보내도 400 에러가 사라진 모습을 확인 할 수 있다.

 

즉, required = false 를 설정하면,

해당 요청의 매개변수가 반드시 요청에 포함되지 않아도 되는,

선택적인 매개변수로 간주 하게 된다.

만약, 요청에 해당 매개변수가 없으면 파라미터를 null 값으로 설정 한다.

 

 

그외에 다른 속성들도 있다.

 

 

3.

@PathVariable 어노테이션 사용 방법.

 

@PathVariable 어노테이션은 @RequestParam 어노테이션의 진화 버전 이라고 생각 하면 된다.

 

@RequestMapping() 어노테이션의 괄호 안의 매핑을 받는 형식이 독특 하다.

 

{id 라는 파라미터명의 값} / {name 이라는 파라미터명의 값} 이다.

 

test03() 메서드

 

@RequestMapping(value = "/test03/{id}/{name}")
	public String test03(@PathVariable String id, @PathVariable String name, Model model) {	//	@PathVariable 사용 방식.
		
		//	http://localhost:8088/test03/아이디값/이름값
		//	http://localhost:8088/test03/%EC%95%84%EC%9D%B4%EB%94%94%EA%B0%92/%EC%9D%B4%EB%A6%84%EA%B0%92
		
		//	restAPI ? (path (경로 == URL) 에 데이터를 바로 보내는 방법을 사용 한다. (요새 이렇게 많이 한다)
		
		//	@PathVariable 어노테이션은 @RequestParam 어노테이션의 진화 버전 이라고 생각 하면 된다.
		
		//	@PathVariable 어노테이션은 default 값이 required 이기 때문에,
		//	id 파라미터 값과 name 파라미터 값을 보내지 않으면, 404 에러가 발생 한다.
		//	@RequestParam 어노테이션의 진화 버전 이라서 비슷하다고 생각 하면 된다.
		
		System.out.println("id : " + id);
		System.out.println("name : " + name);
		
		model.addAttribute("apple", id);
		model.addAttribute("banana", name);

		return "test03";	//	webapp/WEB-INF/views/test.jsp
	}

 

test03.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
   <head>
      <meta charset = "UTF-8">
      <title>test 03</title>
   </head>
   <body>

	<h1>${apple}</h1>
	<hr>
	<h1>${banana}</h1>

   </body>
</html>

 

[ 결과 ]

 

 

값이 없으면 얘는 400 에러가 뜨게 된다.

 

왜냐하면 요청값 자체가 형식이 안맞기 때문이다.

 

 

형식을 맞춰서 보내게 되면 ~

 

 

잘 나오게 된다.

 

그리고 추가로, @PathVariable 어노테이션은 required를 false로 설정해도,

URL 형식이 맞지 않으면 Spring MVC는 오류를 발생 시킨다.

 

 

URL 형식을 반드시 맞춰서 보내줘야 하는듯 하다. (공백값이 불가능)

 

 

메모 : 

 

아마도,

요청에서 해당 변수가 빠지는 경우에 대해서 형식 자체 때문이라도,

Controller 에서 @RequestMapping 어노테이션을 사용해서 value = "" 형식을 작성 하는 부분에서,

메서드를 다양하게 오버로딩 해서,

경로 변수 없이 요청을 처리할 메서드와,

경로 변수를 사용한 요청을 처리할 메서드를 구분지어줘야 할듯 싶다.

시간 될 때, 테스트 해보기..

 

[ 참고 ]

 

@PathVariable 어노테이션은, RESTful 웹 어플리케이션을 개발 할 때 주로 사용 한다.

 

RESTful 웹 어플리케이션에서 경로 변수는 URL 에 데이터를 포함시키는 간편하고 직관적인 방법을 제공 한다.

 

경로 변수를 사용해서, 리소스 식별 및 조작이 가능 하고,

이것은 RESTful 웹 어플리케이션의 주요 원칙중 하나인,

"URL 은 정보를 표현해야 한다" 를 지원 하는것을 의미 한다.

 

이러한 방식의 경로 변수 사용 방식은 가독성이 높은 특징을 가진다.

 

단점으로는,

선택적인 변수 처리의 어려움이 있다.

기본적으로 @PathVariable 어노테이션은 필수적으로 사용 되어야 하는 변수로 간주 된다.

그래서 선택적 변수를 처리 하려면 별도의 로직과 required = false 와 같은 속성 설정을 해야 한다.

 

또한,

경로 변수를 많이 사용 하게 되면, URL 디자인이 복잡해진다.

경로 변수의 수가 많고 중첩되면 URL은 길어지고 이해하기 어려워질 수 있기 때문 이다.

 

4.

command 객체를 사용한 방식.

 

그동안 쭉 이렇게 해왔었다.

 

test() 메서드

 

@RequestMapping(value = "/test")
public String test(VO vo, Model model) {		//	command 객체 사용 방식.

    //	살아있는 커맨드 객체에게 이름 부여 하기 => @ModelAttribute("")

    System.out.println("vo : " + vo);

    vo.setId("hwanii96");
    vo.setName("이름");

    System.out.println("vo : " + vo);

    model.addAttribute("apple", vo.getId());
    model.addAttribute("banana", vo.getName());
    model.addAttribute("vo", vo);

    return "test";	//	webapp/WEB-INF/views/test.jsp
}

 

test.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
   <head>
      <meta charset = "UTF-8">
      <title>test</title>
   </head>
   <body>

	<h1>${apple}</h1>
	<hr>
	<h1>${banana}</h1>
	<hr>
	<h2>${vo.id}</h2>
	<h2>${vo.name}</h2>
      
   </body>
</html>

 

[ 결과 ]

 

 

Controller 에서 set을 해줬기 때문에,

 

 

해당 값을 사용 할 수 있게 된다.

 

저 값을 실은 vo 객체를 model 객체를 통해서 View 으로 보내기 때문 이다.

반응형