스프링 어노테이션(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 로 요청 시 출력 화면
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 = true) String userName,
@RequestParam(value="email",required = false) String 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 = true) String userName,
@RequestParam(value="email",required = false) String 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 |
'📒 education archive > 🌿Spring' 카테고리의 다른 글
[국비학원 기록/Spring] 타일즈 (Tiles) 설정 과정 및 사용 방법 (0) | 2022.01.12 |
---|---|
[국비학원 기록/Spring] 메이븐(Maven), 스프링 log4j 정리 (0) | 2022.01.09 |
[국비학원 기록/Spring] 트랜잭션(Transaction), 두 개의 계좌에 대한 동시 계좌이체 구현 예제 (0) | 2022.01.04 |
[국비학원 기록/Spring] 마이바티스 MyBatis Framework 사용, 회원 정보 조회, 수정, 삭제 예제 (0) | 2022.01.04 |
[국비학원 기록/Spring] 스프링 MVC 패턴, model1, model2 (0) | 2022.01.02 |