관리 메뉴

거니의 velog

(19) 스프링 애너테이션 기능 2 본문

Java_Spring Framework part1

(19) 스프링 애너테이션 기능 2

Unlimited00 2023. 11. 11. 16:25

3. 스프링 애너테이션 이용해 로그인 기능 구현하기

* 이번에는 스프링 애너테이션을 이용해 로그인 기능을 구현해 보자.

1. 다음은 로그인 기능과 관련된 자바 파일과 JSP 위치이다.

2. 실습 시 한글 깨짐 현상을 방지하기 위해 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>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

3. 스프링 애너테이션 기능을 이용해 로그인 시 전송된 ID와 이름을 JSP에 출력하도록 LoginController 클래스를 작성한다. method={RequestMethod.GET, RequestMethod.POST}) 설정은 GET 방식과 POST 방식을 모두 처리할 수 있다. 또한 @RequestMapping(...)을 사용하면 한 메서드에 여러 개의 요청 URL을 설정하여 동시에 호출할 수 있다.

package com.spring.ex02; // com.spring 하위 패키지에 클래스가 위치해야 애너테이션이 적용된다.

import java.util.Map;

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

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller("loginController") // 컨트롤러 빈을 자동으로 생성한다.
public class LoginController {
	
	@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET }) // /test/loginForm.do와 /test/loginForm2.do로 요청 시 loginForm()을 호출한다.
	public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("loginForm");
		return mav;
	}
	
    @RequestMapping(value = "/test/login.do", method={RequestMethod.GET, RequestMethod.POST}) // GET 방식과 POST 방식 요청 시 모두 처리한다.
	public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView();
		mav.setViewName("result");
		String userID = request.getParameter("userID");
		String userName = request.getParameter("userName");
		mav.addObject("userID", userID);
		mav.addObject("userName", userName);

		return mav;
	}
    
 }

4. 로그인창에서 ID와 이름을 전송하도록 loginForm.jsp를 다음과 같이 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
  request.setCharacterEncoding("UTF-8");
%>

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>로그인창</title>
</head>

<body>
    <form method="post" action="${contextPath}/test/login.do">
        <!-- <input  type="hidden"  name="email" value="hong@test.com" /> -->
        <table width="400">
            <tr>
                <td>아이디 <input type="text" name="userID" size="10"></td>
            </tr>
            <tr>
                <td>이름 <input type="text" name="userName" size="10"></td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="로그인">
                    <input type="reset" value="다시입력">
                </td>
            </tr>
        </table>
    </form>
</body>

</html>

5. 로그인창에서 전송된 ID와 이름이 결과창에 나타나도록 result.jsp를 다음과 같이 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>

<%
  request.setCharacterEncoding("UTF-8");
%>

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>결과창</title>
    </head>

    <body>
        <h1>아이디 : ${userID }</h1>
        <h1>이름 : ${userName }</h1>
    </body>

</html>

6. 다음의 주소로 요청하여 로그인 창에 ID와 이름을 입력한 후 로그인을 클릭한다.

- http://localhost:8090/pro26/test/loginForm.do

7. http://localhost:8090/pro26/test/login.do로 요청을 보낸다.


(1) 메서드에 @RequestParam 적용하기

* 지금까지는 브라우저에서 매개변수를 전송하면 getParameter() 메서드를 이용해 값을 얻었다. 그런데 전송되어 온 매개변수의 수가 많아지면 일일이 getParameter() 메서드를 이용하는 방법은 불편하다. 이번에는 @RequestParam을 메서드에 적용해 쉽게 값을 얻는 방법을 알아보자. @RequestParam을 이용해 로그인창에서 전송받은 매개변수를 설정한 후 브라우저에서 매개변수를 전달하면 지정한 변수에 자동으로 값이 설정된다. 그러면 getParameter() 메서드를 이용하지 않아도 된다.

1. spring.ex02 패키지를 만들고 LoginController 클래스를 다음과 같이 작성한다.

	@RequestMapping(value = "/test/login2.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView login2(@RequestParam("userID") String userID, // @RequestParam을 이용해 매개변수가 userID이면 그 값을 변수 userID에 자동으로 설정한다.
			                   @RequestParam("userName") String userName, // @RequestParam을 이용해 매개변수가 userName이면 그 값을 변수 userName에 자동으로 설정한다.
			                   HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView();
		mav.setViewName("result");
		
		// String userID = request.getParameter("userID");
		// String userName = request.getParameter("userName"); // getParameter() 메서드를 이용할 필요가 없다.
		
		System.out.println("userID: "+userID);
		System.out.println("userName: "+userName);
		mav.addObject("userID", userID);
		mav.addObject("userName", userName);

		return mav;
	}

2. 로그인 창에서 ID와 이름을 컨트롤러로 전송하도록 loginForm.jsp를 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
  request.setCharacterEncoding("UTF-8");
%>

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>로그인창</title>
</head>

<body>
    <form method="post" action="${contextPath}/test/login2.do">
        <!-- <input  type="hidden"  name="email" value="hong@test.com" /> -->
        <table width="400">
            <tr>
                <td>아이디 <input type="text" name="userID" size="10"></td> <!-- @RequestParam에서 설정한 userID와 같다. -->
            </tr>
            <tr>
                <td>이름 <input type="text" name="userName" size="10"></td> <!-- @RequestParam에서 설정한 userName과 같다. -->
            </tr>
            <tr>
                <td>
                    <input type="submit" value="로그인">
                    <input type="reset" value="다시입력">
                </td>
            </tr>
        </table>
    </form>
</body>

</html>

3. 다음의 주소로 요청하여 ID와 이름을 입력하고 로그인을 클릭한다.

- http://localhost:8090/pro26/test/loginForm.do

4. 그러면 http://localhost:8090/pro26/test/login2.do로 요청을 보내어 다음과 같은 결과 화면을 출력한다.


(2) @RequestParam의 required 속성 사용하기

* 로그인하는 경우 ID와 비밀번호 같은 정보는 반드시 컨트롤러에 전달되어야 한다. @RequestParam의 required 속성을 이용하면 반드시 전달해야 하는 필수 매개변수인 경우와 그렇지 않은 경우를 설정할 수 있다.

- @RequestParam 적용 시 required 속성을 생략하면 기본값은 true 이다.

- required 속성을 true로 설정하면 메서드 호출 시 반드시 지정한 이름의 매개변수를 전달해야 한다(매개변수가 없으면 예외가 발생한다).

- required 속성을 false로 설정하면 메서드 호출 시 지정한 이름의 매개변수가 전달되면 값을 저장하고 없으면 null을 할당한다.

1. loginController 클래스를 다음과 같이 작성한다.

	@RequestMapping(value = "/test/login2.do", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView login2(@RequestParam("userID") String userID, // required 속성을 생략하면 required의 기본값은 true 이다.
                               @RequestParam(value="userName", required=true) String userName, // required 속성을 명시적으로 true로 설정한다.
			                   @RequestParam(value="email", required=false) String email, // required 속성을 명시적으로 false로 설정한다.
			                   HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView();
		mav.setViewName("result");
		System.out.println("userID: "+userID);
		System.out.println("userName: "+userName);
		System.out.println("email: "+ email);
		mav.addObject("userID", userID);
		mav.addObject("userName", userName);
		return mav;
	}

2. 로그인 창에서 <hidden> 태그를 이용해 이메일 정보를 컨트롤러로 전송한다.

[loginForm.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
  request.setCharacterEncoding("UTF-8");
%>

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>로그인창</title>
</head>

<body>
    <form method="post" action="${contextPath}/test/login2.do">
        <input type="hidden"  name="email" value="hong@test.com" />
        <table width="400">
            <tr>
                <td>아이디 <input type="text" name="userID" size="10"></td> <!-- @RequestParam에서 설정한 userID와 같다. -->
            </tr>
            <tr>
                <td>이름 <input type="text" name="userName" size="10"></td> <!-- @RequestParam에서 설정한 userName과 같다. -->
            </tr>
            <tr>
                <td>
                    <input type="submit" value="로그인">
                    <input type="reset" value="다시입력">
                </td>
            </tr>
        </table>
    </form>
</body>

</html>

3. 브라우저에 요청하여 로그인 창이 나타나면 ID와 비밀번호를 입력하고 로그인을 클릭하면 콘솔에 이메일 정보를 출력한다.

- http://localhost:8090/pro26/test/loginForm.do

4. 로그인 창에서 이메일 관련 <hidden> 태그를 주석 처리한 후 요청하면 이메일 정보를 null로 출력한다.