데이터융합 JAVA응용 SW개발자 기업 채용연계 연수과정 58일차 강의 정리

misung·2022년 6월 9일
0

Spring

요청 구분 (GET, POST) 과 파라미터 읽기 실습

form에서 요청을 보낼 때 GET인지 POST인지 구분할 방법이 현재까지 배운 방법 중에는 길이 없다.

하지만 다음과 같은 방법을 이용하면 가능하다.

RequestController.java

package com.spring.basic.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
// import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.spring.basic.model.UserVO;

@Controller
@RequestMapping("/request")	// 컨트롤러 자체에 공통된 URI를 매핑
public class RequestController {
	
	public RequestController() {
		System.out.println("RequestCon 생성!");
	}
	
	@RequestMapping("/test")
	public String testCall() {
		System.out.println("/request/test 요청이 들어옴!");
		return "test";
	}
	
	/*
    	만약 사용자가 /request/req 요청을 보내 왔을 때
    	views폴더 아래에 request폴더 안에 존재하는
    	req-ex01.jsp파일을 열도록 메서드를 구성해 보세요.
    */
	
	@RequestMapping("/req")
	public String req() {
		System.out.println("/request/req 처리중");
		return "req-ex01";
	}
	
	//@RequestMapping(value="/request/basic01", method=RequestMethod.GET)
	@GetMapping("/basic01")
	public String basicGet() {
		System.out.println("/request/basic01 요청이 들어옴! (GET 요청)");
		return "req-ex01";
	}
	
	//@RequestMapping(value="/request/basic01", method=RequestMethod.POST)
	@PostMapping("/basic01")
	public String basicPost() {
		System.out.println("/request/basic01 요청이 들어옴! (POST 요청)");
		return "req-ex01";
	}
	
	// ----------------------------------------------------
	
	/*
	@GetMapping("/join")
	public String register() {
		System.out.println("/request/join: GET");
		return "request/join";
	}
	*/
	
	/*
	 	컨트롤러 내의 메서드 타입을 void로 선언하는 경우
	 	요청이 들어온 URI 값을 뷰 리졸버에게 전달한다.
	 */
	@GetMapping("/join")
	public void register() {
		System.out.println("/request/join: GET");
	}
	
	/*
	 	요청 URI 주소가 같더라도, 전송 방식에 따라 맵핑을 다르게 진행하므로
	 	같은 주소를 사용하는 것이 가능하다. (GET -> 화면 처리, POST -> 입력값 처리)
	 */
	
	/*
	 	1. 전통적인 jsp/servlet 방식의 파라미터 읽기 처리 방법.
	 	- HttpServletRequest 객체를 활용. (우리가 jsp에서 활용하던 방식)
	 
	 	@PostMapping("/join")
		public void register(HttpServletRequest request) {
		System.out.println("/request/join: POST");
		
		System.out.println("ID : " + request.getParameter("userId"));
		System.out.println("P : " + request.getParameter("userPw"));
		System.out.println("HOBBY: " + Arrays.toString(request.getParameterValues("hobby")));
	}
	 */
	
	/*
	 	2.	@RequestParam 아노테이션을 이용한 요청 파라미터 처리.
	 		@RequestParam("파라미터 변수명") 값을 받아서 처리할 변수
	 		
	 	@PostMapping("/join")
		public void register(@RequestParam("userId") String id,
						 @RequestParam("userPw") String pw,
						 @RequestParam(value="hobby", required = false, defaultValue = "no hobby person") List<String> hobbies) {
		System.out.println("ID : " + id);
		System.out.println("PW : " + pw);
		System.out.println("hobby : " + hobbies);
	}
	 */
	
	
	/*
	 	3. 커맨드 객체를 활용한 파라미터 처리
	 	- 파라미터 데이터와 연동되는 VO 클래스가 필요하다.
	 */
	@PostMapping("/join")
	public void register(UserVO user) {
		System.out.println("ID : " + user.getUserId());
		System.out.println("PW : " + user.getUserPw());
		System.out.println("NAME : " + user.getUserName());
		System.out.println("Hobby : " + user.getHobby());
	}
	
	// ----------------------------------------------------
	
	
}

일단 첫번째로, 클래스에 @RequestMapping 이라는 아노테이션을 추가함으로써

@RequestMapping("/request")	// 컨트롤러 자체에 공통된 URI를 매핑

컨트롤러에 공통된 URI를 매핑하여 이하의 매핑 아노테이션들에서 /request 를 생략할 수 있도록 했다.

get, post를 구분할 때는 @GetMapping @PostMapping 으로 구분하였다.

파라미터 값을 땡겨오는 경우에는 3가지 선택지가 있었는데, 1번의 경우 너무 올드하고, 2번은 자주 쓰고 3번은 2번과 병행하여 사용하는 편이었다.

join.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>요청 파라미터값 테스트!</h2>
	
	<form action="/basic/request/join" method="post">
		<fieldset>
			<legend>회원 가입 양식</legend>
			<p>
				#ID: <input type="text" name="userId" size="10"> <br>
				#PW: <input type="password" name="userPw" size="10"> <br>
				#NAME: <input type="text" name="userName" size="10"> <br>
				#HOBBY:
				<input type="checkbox" name="hobby" value="soccer"> 축구 &nbsp;
				<input type="checkbox" name="hobby" value="read"> 독서 &nbsp;
				<input type="checkbox" name="hobby" value="music"> 음악감상 &nbsp;
				<br>
				<input type="submit" value="확인">
			</p>
		</fieldset>
	</form>
</body>
</html>

RequestController 클래스를 작동시킬 때 예시로 써먹을 jsp 페이지이다.

한글 인코딩 해결

아마 위 예제를 진행하다가 NAME 부분에 한글을 넣으면 깨졌을텐데, 이를 해결하기 위해서 web.xml에 다음과 같은 태그를 넣는다.

<!-- 한글 인코딩 필터 설정(톰캣 내부의 한글처리) -->
   <filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>
         org.springframework.web.filter.CharacterEncodingFilter
      </filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
      </init-param>
   </filter>
   <!-- 위에 지정한 encodingFilter이름을 모든 패턴에 적용 -->
   <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

필터를 통해서 해결하도록 한다.

연습문제 1.

1. RequestController에 현재 파일을 화면에 열어주는 메서드를 선언.
	      - url: /request/quiz: GET
	      - view: /request/req-quiz.jsp
	      - method name: quiz()
	      
2. RequestController에 전송된 아이디, 비밀번호 파라미터를 받아
로그인을 처리하는 메서드를 선언. (폼태그는 직접 작성)
	      - url: /request/quiz: POST
	      - views: 
	         성공시: /request/login-success.jsp
	         실패시: /request/login-fail.jsp
	      - method name: quiz()
	      
3. 로그인 성공 조건
	      - id: abc1234, pw: aaa1111

RequestController.java 메서드 생성

...
@GetMapping("/quiz")
	public String quiz() {
		System.out.println("quiz() 호출!");
		return "request/req-quiz";
	}
	
@PostMapping("/quiz")
	public String quiz(@RequestParam("userID") String id,
					   @RequestParam("userPW") String pw) {
		if (id.equals("abc1234") && pw.equals("aaa1111")) {
			return "request/login-success";
		} else {
			return "request/login-fail";
		}
	}
...

로그인 성공 및 실패 페이지는 페이지 안에 그냥 h1 태그로 성공, 실패라고만 적어두었다.

req-quiz.jsp

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

	<%--
	      # 문제
	      1. RequestController에 현재 파일을 화면에 열어주는 메서드를 선언.
	      - url: /request/quiz: GET
	      - view: /request/req-quiz.jsp
	      - method name: quiz()
	      
	      2. RequestController에 전송된 아이디, 비밀번호 파라미터를 받아
	      로그인을 처리하는 메서드를 선언. (폼태그는 직접 작성)
	      - url: /request/quiz: POST
	      - views: 
	         성공시: /request/login-success.jsp
	         실패시: /request/login-fail.jsp
	      - method name: quiz()
	      
	      3. 로그인 성공 조건
	      - id: abc1234, pw: aaa1111
    --%>

	<h3>파라미터값 처리하기 문제!</h3>
	
	<form action="/basic/request/quiz" method="post">
		<input type="text" name="userID" size="10" placeholder="ID"> <br>
		<input type="password" name="userPW" size="10" placeholder="PW"> <br>
		<input type="submit" value="로그인">
	</form>
</body>
</html>

Model

모델 객체를 사용하면 화면에 데이터를 전송할 수 있는데, 이전에 setAttribute() 와 비슷한 효과를 가지지만 forward() 를 할 필요가 없고 알아서 전달되게 된다.

Model 실습

RequestController.java

package com.spring.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/response")
public class ResponseController {

	@GetMapping("/res-ex01")
	public void resEx01() {}
	
	// 1. Model 객체를 사용하여 화면에 데이터를 전송하기.
	@GetMapping("/test")
	public void test(@RequestParam("age") int age, Model model) {
		model.addAttribute("age", age);
		model.addAttribute("nick", "멍멍이");
	}
}

현재 RequestController 에서는 res-ex01 페이지에서 test 요청을 받을 때 age 파라미터를 끌어오고 스프링으로부터 모델 객체를 받아오고 있다.

age 의 경우 test 페이지에서 은 파라미터를 통해 설정해주고 있고, nick 의 경우 받은 것은 없지만 메서드에서 새로이 지정하여 주고 있다.

이제 모델 객체를 통해 설정한 어트리뷰트가 잘 확인되나 테스트 페이지를 통해 확인해보면 된다.

res-ex01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>Model 객체에 대해서 알아보기</h2>
	
	<a href="/basic/response/test?age=30">테스트1 페이지로~</a>
</body>
</html>

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>test.jsp 페이지 입니다.</h2>
	<p>
		지정된 별명은 ${nick}입니다. 그리고 나이는 ${age}세 입니다.
	</p>
</body>
</html>

좀 더 작성한 부분으로

/*
	// 1. Model 객체를 사용하여 화면에 데이터를 전송하기.
	@GetMapping("/test")
	public void test(@RequestParam("age") int age, Model model) {
		model.addAttribute("age", age);
		model.addAttribute("nick", "멍멍이");
	}
	*/
	
	// 2. @ModelAttribute를 사용한 화면에 데이터 전송 처리
	// @RequestParam + model.addAttribute 처럼 작동
	@GetMapping("/test")
	public void test(@ModelAttribute("age") int age, Model model) {
		model.addAttribute("nick", "야옹이");
	}
	
	@GetMapping("/test2")
	public void test2(@ModelAttribute("info") UserVO vo) {
		System.out.println("메서드 내의 콘솔 출력: " + vo);
	}
	
	// 3. ModelAndView 객체를 활용한 처리
	@GetMapping("/test3")
	public ModelAndView test3() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("userName", "김철수");	// addAttribute()와 동일한 효과
		mv.addObject("userAge", 30);		// addAttribute()와 동일한 효과
		mv.setViewName("/response/test3");
		return mv;
	}

여기까지 작성했는데, @ModelAttribute 아노테이션을 사용하면 @RequestParam + model.addAttribute 와 비슷한 효과를 누릴 수 있다.

페이지에서 폼 입력을 통해 넘어온 age 를, ModelAttribute 를 통해 "age" 로 포장하여 보내고, 그 와중에 "야옹이" 라는 이름을 "nick" 으로 동시에 포장해서 보내고 있다.

ModelAndView 객체를 활용한 처리의 경우 다수의 값을 처리하고 있다. 그리고 view를 선택할 수 있는데, 위의 2번 선택지와 다르게 ModelAndView 를 사용하는 이유가 있긴 있다.

ModelAndView를 사용하는 이유

  • 지금 당장은 모를 수 있겠지만, 나중에 비동기 방식을 쓸 때 문제가 됨
  • 리턴 타입으로 페이지를 응답할 수 없는 경우가 생김
  • 따라서 그러한 상황에 ModelAndView를 사용

연습문제 res-quiz01.

응답 시에 어떻게 데이터를 정의할 것인지에 대한 문제라고 함

   1. res-quiz01 파일의 화면처리를 할 수 있는 메서드부터 생성하세요.
   (맵핑url은 res-quiz01로, 메서드 이름은 맘대로)
   2. 폼 태그 작성해서 아이디와 비밀번호를 받으세요.
    action: res-login으로 맵핑, POST 전송
   3. ID:kim123, PW: 1234라면 res-quiz02페이지로 이동해서
   "로그인 성공! kim123님 환영합니다!" 를 출력.
   4. 아니라면 res-quiz03페이지로 이동해서
   "로그인 실패! '작성한 id'는 회원이 아닙니다."
   '작성한 id' 는 저렇게 똑같이 쓰라는게 아니고, 사용자가 입력한 id를 보내셔야 합니다.

일단 먼저 jsp 페이지부터 작성하기로 함.

res-quiz01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%--
   1. res-quiz01 파일의 화면처리를 할 수 있는 메서드부터 생성하세요.
   (맵핑url은 res-quiz01로, 메서드 이름은 맘대로)
   2. 폼 태그 작성해서 아이디와 비밀번호를 받으세요.
    action: res-login으로 맵핑, POST 전송
   3. ID:kim123, PW: 1234라면 res-quiz02페이지로 이동해서
   "로그인 성공! kim123님 환영합니다!" 를 출력.
   4. 아니라면 res-quiz03페이지로 이동해서
   "로그인 실패! '작성한 id'는 회원이 아닙니다."
   '작성한 id' 는 저렇게 똑같이 쓰라는게 아니고, 사용자가 입력한 id를 보내셔야 합니다.
    --%>
    
    <form action="/basic/response/res-login" method="post">
    	<p>
	    	아이디 : <input type="text" name="userId"> <br>
	    	비밀번호 : <input type="password" name="userPw"> <br>
	    	<input type="submit" value="확인">
    	</p>
    </form>
</body>
</html>

POST 방식으로 전송하고 있고 res-login 요청 보내도록 했음. id, pw는 각각 userId , userPw 로 보냄.

다음은 Controller에 메서드를 추가할 차례.

ResponseController.java 수정

...
@GetMapping("/res-quiz01")
	public void quiz01() {}
	
	/*
	// 커맨드 객체와 Model을 사용
	@PostMapping("/res-login")
	public String quizLogin(UserVO vo, Model model) {
		String id = vo.getUserId();
		String pw = vo.getUserPw();
		
		model.addAttribute("userId", id);
		
		if (id.equals("kim123") && pw.equals("1234")) {
			return "response/res-quiz02";
		} else {
			return "response/res-quiz03";
		}
	}
	*/
	
	@PostMapping("/res-login")
	public String resLogin(@ModelAttribute("userId") String id,
							@RequestParam("userPw") String pw) {
		if (id.equals("kim123") && pw.equals("1234")) {
			return "response/res-quiz02";
		} else {
			return "response/res-quiz03";
		}
	}
...

quiz01() 의 경우 처음엔 내부를 구현했었는데 생각해보니까 리다이렉트만 해 주면 되니까 뭐 따로 구현할 것은 없었음.

밑의 두 메서드가 (주석처리 포함) 처음에 내가 구현한 것과 많이 달랐는데, ModelAndView 를 직전에 가르쳐주셨으니 그걸 써야 한다고 생각해서 썼었지만 전혀 관계 없었음..

어쨌거나 응답해서 나가는 페이지에서 '{userId} 님 환영합니다!' 라는 멘트를 쓸 테니까, userId 의 경우에는 @ModelAttribute 아노테이션으로 받는게 맞고, pw의 경우엔 뭐 그럴 필요까진 없으니 @RequestParam 으로 받았다.

그리고 로직 부분은 간단하니 따로 서술하지 않겠다.

응답 페이지는 {userId} 님 환영 / {userId} 는 없는 ID입니다 라는 페이지 두 개로 분할하여 구현했다.

연습문제 birth

<%--
      1. BirthController를 생성 후, 현재 페이지를 열어주는 메서드를 선언.
      (/birth: GET)
      
      2. 다음 생년월일을 받아서 콘솔에 출력을 진행하는 메서드를 생성. (/birth: POST)
      조건) BirthVO 커맨드 객체를 활용.
      콘솔창에는 전송된 값을 붙여서 출력합니다. ex) 19921013, 19940604
      (한 자리 숫자일 때는 앞에 0이 붙어야 한다는 사실. setter메서드를 조작)
      3. birth-result.jsp 페이지에
      "당신의 생일은 XXXX년 XX월 XX일 입니다." 를 브라우저에 출력하세요.
    --%>

일단 jsp 페이지를 먼저 만들었음.

birth-form.jsp

WEB-INF/views/birth 디렉토리를 만들고 하위에 배치함.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/basic/birth" method="post">
		<fieldset>
			<legend>생일 등록 양식</legend>
			<p>
				# 생년월일 <br>
				<input type="text" name="year" size="6" maxlength="4" placeholder="연도(YYYY)">
				
				<select name="month">
					<c:forEach var="m" begin="1" end="12">
						<option value="${m}">${m}</option>
					</c:forEach>
				</select>
				
				<select name="day">
					<c:forEach var="d" begin="1" end="31">
						<option value="${d}">${d}</option>	
					</c:forEach>
				</select>
				
				<input type="submit" value="확인">
			</p>
		</fieldset>
	</form>
</body>
</html>

POST 방식으로 전송되고 요청은 /basic/birth 이다.

jstl을 써서 월, 일에 대한 선택을 반복문을 통해 구성해주었다.

BirthController.java

package com.spring.basic.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.spring.basic.model.BirthVO;

@Controller
public class BirthController {
	
	@GetMapping("/birth")
	public String birth() {
		return "birth/birth-form";
	}
	
	@PostMapping("/birth")
	public String birthResult(@ModelAttribute("birth") BirthVO vo) {
		System.out.println(vo.getYear() + vo.getMonth() + vo.getDay());		
		return "/birth/birth-result";
	}
}

음.. 여기서는 솔직히 좀 처음에 구현했던 클래스 상태가 너무 지저분했다. (현재 코드는 강사님 코드)

일단 어디가 차이났었냐 하면, 위의 메서드 말고 아래의 메서드가 문제였다.

@ModelAttribute 아노테이션을 써서 BirthVO 를 포장해서 뷰로 보내면 될 텐데, 매개변수로 Model 을 받아 메서드 내에서 addObject() 를 진행했었다.

굳이 그럴 필요가 없는 건, VO<form> 에서 전달되는 값들하고 id가 정확히 일치하는 멤버변수가 있으면, 알아서 값이 전달되는 부분을 간과하고 있었다.

하여간에 그렇게 되면 @ModelAttribute("birth") BirthVO vo 이렇게 매개변수를 받아서 해결할 수 있었다.

BirthVO.java

package com.spring.basic.model;

public class BirthVO {
	
	private String year;
	private String month;
	private String day;
	
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getMonth() {
		return month;
	}
	public void setMonth(String month) {
		if (Integer.parseInt(month) < 10) {
			this.month = ("0" + month);
		} else {
			this.month = month;
		}
	}
	public String getDay() {
		return day;
	}
	public void setDay(String day) {
		if (Integer.parseInt(day) < 10) {
			this.day = ("0" + day);
		} else {
			this.day = day;
		}
	}
}

setter() 메서드 중 월, 일 부분에 대해 수정이 필요했으므로 요구사항에 맞추어 수정함.

실습. 응답을 할 수 있는 추가 방법

redirect-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<%--
		form 태그의 action을 작성하지 않으면
		마지막 요청(현재 화면을 보기 위해 요청한 url 주소)
		url과 동일하게 서버로 요청이 들어간다.
	 --%>

	<form method="post">
      <p>
         # ID: <input type="text" name="userId" size="10"> <br>
         # 비밀번호: <input type="password" name="userPw" size="10"> <br>
         # 비밀번호 확인: <input type="password" name="userPwChk" size="10"> <br>
         <input type="submit" value="로그인">
      </p>
	</form>
	
	<p style="color: red";>
		${msg}
	</p>
</body>
</html>

이런 <form> 이 존재한다고 쳤을 때, 이 상태에서 ID 가 공란으로 전송되거나, PWPWCHK 가 서로 달랐을 때 아래의 msg 에 메시지를 전달하고 싶은데, 이 페이지로 그대로 리다이렉트를 하려고 한다.

ResponseController.java 추가

...
// Redirect 처리
	// 폼 화면을 보여주는 메서드
	@GetMapping("/login")
	public String login() {
		System.out.println("/login: GET 요청 발생!");
		return "response/res-redirect-form";
	}
	
	@PostMapping("/login")
	public String login(@RequestParam("userId") String id,
						@RequestParam("userPw") String pw,
						@RequestParam("userPwChk") String pwChk,
						RedirectAttributes ra) {
		System.out.println("/login: POST 요청 발생");
		System.out.println("ID: " + id);
		System.out.println("PW: " + pw);
		System.out.println("CHK: " + pwChk);
		
		/*
		 	redirect 상황에서 model 객체를 사용하게 되면,
		 	model 내부의 데이터가 재 요청이 들어올 때 파라미터 값으로 붙어서 들어온다.
		 	데이터가 URL 주소 뒤에 ?와 함께 노출되어 전달된다.
		 */
		if (id.equals("")) {
			// model.addAttribute("msg", "아이디는 필수값입니다.");
			
			/*
			 	redirect 상황에서 일회성으로 데이터를 전송할 때 사용하는 메서드.
			 	url 뒤에 데이터가 붙지 않고, 한 번 이용 후에는 알아서 소멸한다.
			 */
			ra.addFlashAttribute("msg", "아이디는 필수값입니다.");
			return "redirect:/response/login";
		} else if (!pw.equals(pwChk)) {
			ra.addFlashAttribute("msg", "비밀번호 확인란을 체크하세요.");
			return "redirect:/response/login";
		} else {
			return null;
		}
	}
...

login() 메서드는 단순히 뷰와 연결해주는 역할만 하고 있다.

아래의 @PostMapping 방식의 메서드가 실질 역할을 할 부분인데, @RequestParam 으로 값을 끌어오고 확인용으로 콘솔에 한번 찍어둔다.

만약 id가 공란인 경우 메시지를 저장해서 같은 페이지로 다시 보내주고 싶은데, model 에다 붙여서 보내면 GET 방식으로 가는 바람에 URL 뒤에 붙어서 메시지가 나타나게 되고 msg 자체는 전송이 아예 안된다.

그래서 같은 페이지로 redirect 되는 상황에서 일회성으로 테이터를 전송할 일이 있으면, RedirectAttributes 를 사용하고, addFlashAttribute() 메서드를 써서 값을 넘겨주게 된다.

0개의 댓글