[국비학원 기록/Spring] 스프링 어노테이션(Annotation) 정리, 로그인 기능 구현
my code archive
article thumbnail
반응형
스프링 어노테이션(Annotation)

 

1. 스프링 어노테이션(Annotation)

 

-기존 XML에서 빈 설정 => 어노테이션을 이용해 자바 코드에서 설정

-XML에서 설정하는 것보다 유지 보수에 유리

-현재 애플리케이션 개발에서는, XML 설정 방법 + 어노테이션 방법 혼합해서 사용

 

2. 스프링 어노테이션 제공 클래스

 

1) Handler Mapping : dispatcher servlet으로 들어온 요청을 각각의 Controller로 위임 처리

 

스프링 프레임워크에서 제공하는 Handler Mapping 클래스
DefaultAnnotaionHandlerMapping 클래스 레벨에서 @RequestMapping을 처리함
BeanNameUrlHandlerMapping 요청 URL과 빈의 이름을 비교 -> 일치하는 빈을 찾아줌.
ControllerBeanNameHandlerMapping BeanNameUrlHandlerMapping과 유사하지만,
빈 이름 앞에 자동으로 /이 붙어져 URL에 매핑된다.
ControllerClassNameHandlerMapping 빈의 클래스 이름을 URL에 매핑해주는 매핑 클래스
SimpleUrlHandlerMapping URL과 컨트롤러 매핑 정보를 한 곳에 모아놓을 수 있음

 

2) Handler Adapter : Handler Mapping에서 결정된 핸들러 정보로 해당 메서드를 직접 호출

스프링 프레임워크에서 제공하는 Handler Adapter 클래스
AnnotationMethodHandlerAdapter 메서드 레벨에서 @RequestMapping을 처리함
SimpleServletHandlerAdapter javax.servlet.Servlet을 구현한 클래스를 컨트롤러로
사용 시 사용되는 어댑터
HttpRequestHandlerAdapter HttpRequestHandler 인터페이스를 구현한 클래스를
컨트롤러로 사용 시 사용되는 어댑터
SimpleControllerHandlerAdapter Controller 인터페이스를 구현한 클래스를 컨트롤러로
사용 시 사용되는 어댑터

 

3) <context : component - scan>

: 패키지 이름을 지정하면 애플리케이션 실행 시

  해당 패키지에서 애너테이션으로 지정된 클래스를 빈으로 만들어줌.

 

4) action-servlet.xml 작성

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- <property name="prefix" value="/WEB-INF/views/anno/"/> -->
            <property name="prefix" value="/WEB-INF/views/member/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        
        <!-- 클래스 레벨에 @RequestMapping을 처리함 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
        <!-- 메서드 레벨에 @RequestMapping을 처리함 -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
        <!-- kr.co.ezenac 패키지에 존재하는 클래스에 애너테이션이 적용되도록 설정함 -->
        <context:component-scan base-package="kr.co.ezenac"/>
</beans>
cs

 

3. Annotation 종류

 

@ComponentScan

 

- @Component , @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean을

  찾아서 Context에 bean 등록을 해줌.

 

@Component

 

-지정한 class를 Bean으로 자동 변환함.

-@Bean과 다르게 name이 아닌 value를 이용해 Bean의 이름을 지정함.

 

@Bean

 

-외부 라이브러리 등을 Bean으로 만들 때 사용함.

 

@Autowired

 

-속성, setter method, 생성자(constructor)에서 사용

-Type에 따라 알아서 Bean을 주입해줌.

-Controller 클래스에서 DAO, Service에 대한 객체를 주입시킬 때 주로 사용함.

-코드에서 어노테이션으로 DI를 자동으로 수행함.

-별도의 setter나 생성자 없이 속성에 Bean 주입 가능함.

 

-XML에서 Bean을 주입해서 사용하면 XML 파일이 복잡해질 수 있음.

 

<Bean 주입 3가지 방식>
1. @Autowired

2. setter
3. 생성자

 

@Service

 

-지정한 class를 서비스 Bean으로 자동 변환함.

-서비스 레이어, 비즈니스 로직을 가진 클래스

 

@Controller

 

-스프링 컨테이너가 component-scan에 의해 지정한 클래스를 컨트롤러 빈으로 자동 변환함

-<bean> 태그와 동일한 역할 수행함.

-웹 애플리케이션에서 웹 요청과 응답을 처리하는 클래스

 

@Repository

 

-DAO class에서 쓰임.

-DB에 접근하는 method를 갖고 있는 class에서 쓰임.

-지정한 클래스를 DAO Bean으로 자동 변환함.

 

말고도 더 많지만 일단 수업시간에 배운 어노테이션은 여기까지.....

 

4.-1 스프링 어노테이션을 이용한 로그인 기능 구현

1. web.xml 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/config/action-mybatis.xml
        </param-value>
    </context-param>
    
        <!-- 한글 깨짐 방지 기능(필터) -->
    <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>
    
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
cs

 

2. MainController.java 작성

  • 위에서도 설명했듯이 <bean> = @Controller 이다.
1
2
3
4
5
6
7
8
9
xml 로 표현시
<bean id = "mainController" class="kr.co.ezenac.anno01.MainController">
</bean>
 
java식으로 표현시
@Controller("mainController")
public class MainController {
실행문
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller("mainController")
@RequestMapping("/anno")
public class MainController {
    
    @RequestMapping(value="/main1.do", method=RequestMethod.GET)
    public ModelAndView main1(HttpServletRequest request, HttpServletResponse response)throws Exception {
        ModelAndView mav = new ModelAndView();
        
        mav.addObject("msg","main1");
        mav.setViewName("main");
        return mav;
    }
    
    @RequestMapping(value="/main2.do", method=RequestMethod.GET)
    public ModelAndView main2(HttpServletRequest request, HttpServletResponse response) throws Exception{
        ModelAndView mav = new ModelAndView();
        
        mav.addObject("msg","main2");
        mav.setViewName("main");
        return mav;
    }
 
}
cs

 

3. main.jsp 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath"
    value="${pageContext.request.servletContext.contextPath}" />
 
<%
    request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>새해복 많이 받으세요</h1>
<h1>${msg }페이지 입니다.</h1>
 
</body>
 
cs

 

http://localhost:8080/~~/main1.do 로 요청 시 출력 화면

 

action-servlet.xml을 이렇게 설정했기 때문에 저 경로에 있는 .jsp로 끝나는 파일 찾아서 화면 출력

 

4.-2 스프링 어노테이션을 이용한 로그인 기능 구현

1. LoginVO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class LoginVO {
    
    private String userID;
    private String userName;
    
    public String getUserID() {
        return userID;
    }
    public void setUserID(String userID) {
        this.userID = userID;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    
 
}
cs

 

2. LoginController.java

  • 로그인 시 전송된 ID, 이름을 JSP에 출력하도록 하는 곳
  • method={RequestMethod.GET,RequestMethod.POST} : GET방식과 POST 방식을 모두 처리하도록 한다.
  • @RequestMapping(...) : 한 메소드에 여러개의 요청 URL을 설정하여 동시에 호출할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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={"/anno/loginForm.do","/anno/loginForm2.do"}, method= {RequestMethod.GET})
    public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
 
        ModelAndView mav = new ModelAndView();
 
        mav.setViewName("loginForm");
 
        return mav;
    }
 
    @RequestMapping(value="/anno/login.do",method= {RequestMethod.GET,RequestMethod.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;
    }
 
    @RequestMapping(value="/anno/login21.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login21(@RequestParam ("userID"String userID,
            @RequestParam("userName"String userName, 
            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);
 
        mav.addObject("userID",userID);
        mav.addObject("userName",userName);
        return mav;
    }
 
    @RequestMapping(value="/anno/login2.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login2(@RequestParam ("userID"String userID,
            @RequestParam(value="userName",required = trueString userName, 
            @RequestParam(value="email",required = falseString email,
            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);
        mav.addObject("email",email);
        return mav;
    }
    @RequestMapping(value="/anno/login3.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login3(@RequestParam Map<String,String> info, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        ModelAndView mav = new ModelAndView();
        mav.setViewName("result");
 
        String userID = info.get("userID");
        String userName = info.get("userName");
 
        System.out.println("userID:"+userID);
        System.out.println("userName:"+userName);
 
        mav.addObject("info",info);
 
        return mav;
    }
    @RequestMapping(value="/anno/login4.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login4(@ModelAttribute("info") LoginVO loginVO, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        ModelAndView mav = new ModelAndView();
        
        System.out.println("userID:"+loginVO.getUserID());
        System.out.println("userName:"+loginVO.getUserName());
        
        mav.setViewName("result");
 
        return mav;
    }
    @RequestMapping(value="/anno/login5.do", method= {RequestMethod.GET,RequestMethod.POST})
    public String login5(Model model, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        model.addAttribute("userID","test");
        model.addAttribute("userName","ezen");
        
 
        return "result";
    }
}
cs

3. loginForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath"
    value="${pageContext.request.servletContext.contextPath}" />
 
<%
    request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
    <form method="post" action="${contextPath }/anno/login5.do">
        <!-- <input type="hidden" name="email" value="ezen@gmail.com"/> -->
        <table width="400">
            <tr>
                <td>아이디<input type="text" name="userID" size="10"></td>
                <td>이름 <input type="text" name="userName" size="10"></td>
            </tr>
            <tr>
                <td><input type="submit" value="로그인"/>
                <input type="submit" value="다시입력"/></td>
            </tr>
        </table>
    
    </form>
</body>
</html>
cs

4. result.jsp

  • 로그인창에서 전송된 ID와 이름이 나타나는 결과창
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>아이디 : ${userID }</h1>
<h1>이름 : ${userName }</h1>
 
<%-- <h1>아이디 : ${info.userID }</h1>
<h1>이름 : ${info.userName }</h1> --%>
</body>
</html>
cs

 

http://localhost:8080/~~/anno/loginForm.do 로 요청 시 출력 화면

4-3. @RequestParam 사용
  • 매개변수의 수가 많아지면 일일이 getParameter() 메서드를 이용하는 방법은 불편함
  • @RequestParam을 메서드에 적용하면 쉽게 값을 얻을 수 있음
  • @RequestParam의 required 속성 : required 속성을 생략하면 기본값은 true임.
  • =>메서드 호출 시 반드시 지정한 이름의 매개변수를 전달해야함
  • required 속성을 false로 설정하면 
  • =>메서드 호출 시 지정한 이름의 매개변수가 전달되면 값을 저장하고
       없으면 null을 할당함

LoginController.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RequestMapping(value="/anno/login2.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login2(@RequestParam ("userID"String userID,
            @RequestParam(value="userName",required = trueString userName, 
            @RequestParam(value="email",required = falseString email,
            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);
        mav.addObject("email",email);
        return mav;
    }
cs
4-4. @RequestParam 이용해 Map에 매개변수 값 설정
  • 전송되는 매개변수의 수가 많을 경우 Map에 바로 저장해서 사용하면 편리함

LoginController.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequestMapping(value="/anno/login3.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login3(@RequestParam Map<String,String> info, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        ModelAndView mav = new ModelAndView();
        mav.setViewName("result");
 
        String userID = info.get("userID");
        String userName = info.get("userName");
 
        System.out.println("userID:"+userID);
        System.out.println("userName:"+userName);
 
        mav.addObject("info",info);
 
        return mav;
    }
cs
4-5. @ModelAttribute 이용해 VO에 매개변수 값 설정

LoginController.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping(value="/anno/login4.do", method= {RequestMethod.GET,RequestMethod.POST})
    public ModelAndView login4(@ModelAttribute("info") LoginVO loginVO, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        ModelAndView mav = new ModelAndView();
        
        System.out.println("userID:"+loginVO.getUserID());
        System.out.println("userName:"+loginVO.getUserName());
        
        mav.setViewName("result");
 
        return mav;
    }
cs
4-6. Model 클래스 이용해 값 전달
  • 메소드 호출 시 jsp로 값을 바로 바인딩하여 전달 가능함
  • addAttribute()로 데이터 바인딩함
  • Model 클래스는 따로 뷰 정보를 전달할 필요가 없을 때 사용.

LoginController.java 수정

1
2
3
4
5
6
7
8
9
10
@RequestMapping(value="/anno/login5.do", method= {RequestMethod.GET,RequestMethod.POST})
    public String login5(Model model, 
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("utf-8");
        model.addAttribute("userID","test");
        model.addAttribute("userName","테스트");
        
 
        return "result";
    }
cs
반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형