티스토리 뷰

Spring

[Spring]스프링 애너테이션

dev23 2024. 8. 17. 23:00
반응형

- 스프링 2.5까지는 DI AOP 같은 기능은 따로 XML 파일로 설정한 애플리케이션에서 사용했다.

- 그러나 애플리케이션의 기능이 복잡해짐에 따라 XML 설정 파일의 내용도 복잡해졌고 관리에도 문제가 생기기 시작했다.

- 따라서 스프링 3.0부터는 DI 같은 자바 코드와 관련된 설정은 직접 코드에서 있게 애너테이션 기능을 제공한다.

- 현재 스프링 기반 애플리케이션에서는 XML에서 설정하는 방법과 애너테이션 기능을 사용하는 방법 가지를 혼합해서

사용하고 있다.

 

스프링 애너테이션 제공 클래스

 - 스프링에서 애너테이션을 사용하려면 먼저 스프링에서 제공하는 애너테이션 관련 클래스를 XML 설정 파일에서

 빈으로 설정해야 한다.

브라우저 URL 요청 처리 애너테이션 관련 클래스

클래스 기능
DefaultAnnotationHandlerMapping 클래스 레벨에서 @RequestMapping 처리한다.
AnnotationMehtodHandlerAdapter 메서드 레벨에서 @RequestMapping 처리한다.

<context:component-scan> 태그 기능

 - <context:component-scan> 태그를 사용해 패키지 이름을 지정하면 애플리케이션 실행 해당 패키지에서

애너테이션으로 지정된 클래스를 빈으로 만들어 준다.

<context:component-scan base-package="패키지 이름" />

 

- 다음 표는 <context:component-scan> 태그로 지정한 패키지에 위치하는 클래스에 지정하는 여러 애너테이션이다.

애너테이 기능
@Controller 스프링 컨테이너가 component-scan 의해 지정한 클래스를 컨트롤러 빈으로 자동 변환한다.
@Service 스프링 컨테이너가 component-scan 의해 지정한 클래스를 서비스빈으로 자동 변환한다.
@Repository 스프링 컨테이너가 component-scan 의해 지정한 클래스를 DAO 빈으로 자동 변환한다.
@Component 스프링 컨테이너가 component-scan 의해 지정한 클래스를 빈으로 자동 변환한다.

 - 위 애너테이션이 설정된 클래스들은 실행 자동으로 빈으로 생성된다.

 

애너테이션 URL 요청

- 스프링 애너테이션 기능을 이용해 실습한다.

 

* web.xml

<?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">
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
	</servlet>
	
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</web-app>

 

* action-servlet.xml

- 스프링에서 제공하는 DefaultAnnotationHandlerMapping AnnotationMethodHandlerAdapter 클래스의 빈을 설정한다.

- <contenxt:component-scan base-package="com.spring" /> 태그를 이용해 com.spring 하위 패키지에 애너테이션이

적용되도록 설정한다.

<?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="/test/" />
		<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" />
	
	<!-- com.spring 패키지에 존재하는 클래스에 애너테이션이 적용되도록 설정한다. -->
	<context:component-scan base-package="com.spring" />
</beans>

 

* MainController.java

- @Controller("mainController") 애너테이션은 주로 Controller 클래스에 위치해 빈을 만든다.

- @RequestMapping("/test") URL 요청 번째 단계의 요청이 /test이면 mainController 빈에게 요청을 전달한다.

- 그리고 @RequestMapping(value="/main1.do", method=RequestMethod.GET) 메서드에 위치시킨 요청을

구분하여 메서드를 호출한다.

package com.spring;

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") // @Controller 애너테이션을 이용해 MainController클래스를 빈으로 자동 변환한다. 빈 id는 mainController이다.
@RequestMapping("/test") // @RequestMapping을 이용해 첫 번째 단계의 URL요청이 /test이면 mainController 빈을 요청한다.
public class MainController {
	// 두 번째 단계의 URL 요청이 /main1.do이면 mainController 빈의 main1() 메서드에게 요청한다. GET방식으로 메서드가 호출된다.
	@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;
	}
	
	// 두 번째 단계의 URL 요청이 /main2.do이면 mainController 빈의 main2() 메서드에게 요청한다. GET방식으로 메서드가 호출된다.
	@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;
	}

}

 

* main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    
<%
	request.setCharacterEncoding("utf-8");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
	<h1>안녕하세요!</h1>
	<h1>${msg }페이지입니다!</h1>
</body>
</html>

 

- 코드 작성 후 /test/main1.do와 /test/main2.do에 접속해 본다.

/test/main1.do
main2.do

 

로그인 기능 구현

- 스프링 애너테이션을 이용해 로그인 기능을 구현해 본다.

- 먼저 실습 시 한글 꺠짐 현상을 방지하기 위해 web.xml에 한글 필터 기능을 설정한다.

 

* web.xml

<?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">
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
	</servlet>
	
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	<!-- 필터 적용 -->
	<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>
</web-app>

 

* LoginController.java

- 스프링 애너테이션 기능을 이용해 로그인 전송된 ID 이름을 JSP 출력하도록 LoginController 클래스를 작성한다.

- method={RequestMethod.GET, RequestMethod.POST} 설정은 GET 방식과 POST 방식을 모두 처리할 있다.

- 또한 RequestMapping( ... ) 사용하면 메서드에 여러 개의 요청 URL 설정하여 동시에 호출할 있다.

package com.spring;

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

}

 

* 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 }" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<form method="post" action="${contextPath }/test/login.do">
		<table width="400px">
			<tr>
				<td>아이디 <input type="text" name="userID" size="10" / ></td>
			</tr>
			<tr>
				<td>이름 <input type="text" name="userName"  size="10" /></td>
			</tr>
			<tr align="center">
				<td><input type="submit" value="결과 전송" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

* result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
	<h1>아이디 : ${userID }</h1>
	<h1>이름 : ${userName }</h1>
</body>
</html>


- /test/loginForm.do 또는 /test/loginForm2.do로 접근 시 로그인 페이지가 나타난다.

/test/loginForm.do 요청 시

 

/test/loginForm2.do 요청 시

 

- 아이디와 이름 입력 후 [결과 전송] 버튼을 누르면 입력한 값들이 출력된다.

출력 결과

 

@RequestParam

- 지금까지는 브라우저에서 매개변수를 전송하면 getParameter() 메서드를 이용해 값을 얻었다.

- 그러나 전송되어 매개변수의 수가 많아지면 일일이 getParameter() 메서드를 이용하는 방법은 불편하다.

- 이번에는 @RequestParam 메서드에 적용해 쉽게 값을 얻는 방법은 알아본다.

- @RequestParam 이용해 로그인창에서 전송받은 매개변수를 설정한 브라우저에서 매개변수를 전달하면

 지정한 변수에 자동으로 값이 설정된다. 그러면 getParameter() 메서드를 사용하지 않아도 된다.

 

* LoginController.java

- login2 메서드를 작성한다. 이 메서드는 @RequestParam 애너테이션을 사용한다.

package com.spring;

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.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller("loginController") // 컨트롤러 빈을 생성한다.
public class LoginController {
	// /test/loginForm.do와 /test/loginForm2.do로 요청 시 loginForm()을 호출한다.
	@RequestMapping(value= {"/test/loginForm.do", "/test/loginForm2.do"}, method= {RequestMethod.GET})
		public ModelAndView loginForm(HttpServletRequest req, HttpServletResponse res) throws Exception{
			ModelAndView mav = new ModelAndView();
			mav.setViewName("loginForm");
			return mav;
		}
	
	// GET 방식과 POST 방식 요청 시 모두 처리한다.
	@RequestMapping(value="/test/login.do", method= {RequestMethod.GET, RequestMethod.POST})
	public ModelAndView login(HttpServletRequest req, HttpServletResponse res) throws Exception{
		req.setCharacterEncoding("utf-8");
		ModelAndView mav = new ModelAndView();
		mav.setViewName("result");
		String userID = req.getParameter("userID");
		String userName = req.getParameter("userName");
		mav.addObject("userID",userID);
		mav.addObject("userName",userName);
		return mav;
	}
	
	// @RequestParam을 이용해 매개변수가 userID이면 그 값을 변수 userID에 자동으로 설정한다.
	// @RequestParam을 이용해 매개변수가 userName이면 그 값을 변수 userName에 자동으로 설정한다.
	@RequestMapping(value = "/test/login2.do", method= {RequestMethod.GET, RequestMethod.POST})
	public ModelAndView login2(@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");
			
		/*
		 	String id = request.getParameter("userID"); 
			    String name = request.getParameter("userName");
		 */
			
			System.out.println("userID : " + userID);
			System.out.println("userName : " + userName);
			mav.addObject("userID",userID);
			mav.addObject("userName",userName);
			return mav;
	}

}

 

* 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 }" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<form method="post" action="${contextPath }/test/login2.do">
		<table width="400px">
			<tr>
				<td>아이디 <input type="text" name="userID" size="10" ></td>
			</tr>
			<tr>
				<td>이름 <input type="text" name="userName" size="10"/></td>
			</tr>
			<tr align="center">
				<td><input type="submit" value="결과 전송" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

- /test/loginForm.do 또는 /test/loginForm2.do로 접근 시 로그인 페이지가 나타난다.

/test/loginForm.do 요청 시

 

/test/loginForm2.do 요청 시

 

- 아이디와 이름 입력 후 [결과 전송] 버튼을 누르면 입력한 값들이 출력된다.

출력 결과

 

@RequestParam required 속성

- 로그인하는 경우 ID 비밀번호 같은 정보는 반드시 컨트롤러에 전달되어야 한다.

- @RequestParam required 속성 이용하면 반드시 전달해야 하는 필수 매개변수인 경우와 그렇지 않은 경우를

설정할 있다.

  • @RequestParam 적용 시 required 속성을 생략하면 기본값은 true 이다.
  • requried 속성을 true로 설정하면 메서드 호출 시 반드시 지정한 이름의 매개변수를 전달해야 한다.(매개변수가
    없으면 예외 발생)
  • required 속성을 false로 설정하면 메서드 호출 시, 지정한 이름의 메개변수가 전달되면 값을 저장하고, 없으면 null을 할당한다.

* LoginController.java

// required 속성을 생략하면 기본값은 true이며 필수적으로 전달되어야 한다.
@RequestMapping(value = "/test/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");
		
	/*
	 	String id = request.getParameter("userID"); String name=
	  	request.getParameter("userName");
	 */
		
		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;
}

 

 

@RequestParam 이용해 Map 매개변수 설정하기

- 전송되는 매개변수의 수가 많을 경우 일일이 변수를 지정해서 사용하려면 불편하다.

- 이번에는 전달되는 매개변수 값들을 Map 저장해 본다.

 

- @RequestParam Map<String, String> info 이름이 info Map 매개변수 이름을 key, 매개변수 값을

 value 저장하는 구문이다.

 

* LoginController.java

@RequestMapping(value="/test/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();
	String userID = info.get("userID");
	String userName = info.get("userName");
	System.out.println("userID : " + userID);
	System.out.println("userName : " + userName);
	mav.addObject("info", info);
	mav.setViewName("result");
	return mav;
}

 

* loginForm.do

<%@ 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 }" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<form method="post" action="${contextPath }/test/login3.do">
		<table width="400px">
			<tr>
				<td>아이디 <input type="text" name="userID" size="10" ></td>
			</tr>
			<tr>
				<td>이름 <input type="text" name="userName" size="10"/></td>
			</tr>
			<tr align="center">
				<td><input type="submit" value="결과 전송" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

* result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
	<h1>아이디 : ${info.userID }</h1>
	<h1>이름 : ${info.userName }</h1>
</body>
</html>

 

@ModelAttribute 이용해 VO 매개변수 설정

- 이번에는 여러 개의 매개변수를 전달한다. 우선 @ModelAttribute 이용해 VO 클래스의 속성에 매개변수 값이 자동으로 설정되도록 한다.

 

- @ModelAttribute("info") LoginVO loginVO 전달된 매개변수에 대해 LoginVO 클래스 객체를 생성한다.

- 이어서 매개변수 이름과 같은 속성에 매개변수 값을 설정한 info 이름으로 바인딩한다.

- 예를 들어 로그인창에서 전달된 매개변수 이름이 userID이고, 값이 hong 경우, @ModelAttribute LoginVO

지정하면 전달 LoginVO 속성 userID 전달된 hong 자동으로 설정해 준다.

 

* LoginController.java

// @ModelAttribute를 이용해 전달되는 매개변수 값을 LoginVO 클래스와 이름이 같은 속성에 자동으로 설정한다.
// addObject()를 이용할 필요 없이 info를 이용해 바로 JSP에서 LoginVO 속성에 접근할 수 있다. ( info라는 이름으로 LoginVO 객체를 포워딩 시킴 )
@RequestMapping(value="/test/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;
}

 

* LoginVO.java

package com.spring;

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;
	}
	
}

 

* result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
	<h1>아이디 : ${info.userID }</h1> // info로 바로 접근 가능
	<h1>이름 : ${info.userName }</h1> // info로 바로 접근 가능
</body>
</html>

 

Model 클래스 이용

- Model 클래스를 이용하면 메서드 호출 JSP 값을 바로 바인딩하여 전달할 있다.

- Model 클래스의 addAttribute() 메서드는 ModelAndView addObject() 메서드와 같은 기능 한다.

- Model 클래스는 따로 정보를 전달할 필요가 없을 사용하면 편리하다.

 

* LoginController.java

@RequestMapping(value="/test/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", "hong");
	model.addAttribute("userName","홍길동");
	return "result";
}

 

* result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
	<h1>아이디 : ${userID }</h1>
	<h1>이름 : ${userName }</h1>
</body>
</html>

 

@Autowired

- XML에서 빈을 설정한 애플리케이션이 실행될 빈을 주입해서 사용하면 XML 파일이 복잡해지면서 사용 관리가

 불편해진다.

 

- 현재 스프링에서는 @Autowired 이용해서 개발자가 만든 클래스들의 빈을 직접 자바 코드에서 생성하여 사용한다.

- @Autowired 특징

  • 기존 XML 파일에서 각가의 빈을 DI로 주입했던 기능을 코드에서 애너테이션으로 자동으로 수행한다.
  • @Autowired를 사용하면 별도의 setter나 생성자 없이 속성에 빈을 주입할 수 있다.

* Web.xml

 - ContextLoaderListener 이용해 애플리케이션이 실행될 action-mybatis.xml 읽어 들이도록 설정한다.

<?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>
	
	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
	</servlet>
	
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	<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>
</web-app>

 

* action-servlet.xml

<?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="/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" />

<!-- com.spring 패키지에 존재하는 클래스에 애너테이션이 적용되도록 설정한다. -->
<context:component-scan base-package="com.spring" />

</beans>

 

* action-mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans">

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<value>/WEB-INF/config/jdbc.properties</value>
	</property>
</bean>

<bean id="dataSource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
	<property name="driver" value="${jdbc.driverClassName}" />
	<property name="url" value="${jdbc.url}" />
	<property name="username" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" >
	<property name="dataSource" ref="dataSource" />
	<property name="configLocation" value="classpath:mybatis/model/modelConfig.xml" />
	<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
</beans>

 

* memberControllerImpl.java

package com.spring.member.controller;

import java.util.List;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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;

import com.spring.member.service.MemberServiceImpl;
import com.spring.member.vo.MemberVO;

@Controller("memberController")
public class MemberControllerImpl{
	
	// @Autowired를 이용해 id가 memberService인 빈을 자동 주입한다.
	@Autowired
	private MemberServiceImpl memberService;
	// @Autowired를 이용해 id가 memberVO인 빈을 자동 주입한다.
	@Autowired
	MemberVO memberVO;
	
	@RequestMapping(value="/member/listMembers.do", method=RequestMethod.GET)
	public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response ) throws Exception{
		String viewName = getViewName(request);
		List membersList = memberService.listMembers();
		ModelAndView mav = new ModelAndView(viewName);
		mav.addObject("membersList",membersList);
		return mav;
	}
	
	@RequestMapping(value="/member/addMember.do", method=RequestMethod.POST)
	public ModelAndView addMember(@ModelAttribute("member") MemberVO member, HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		int result = 0;
		result = memberService.addMember(member);
		// 회원 정보 추가 후 ModelAndView 클래스의 redirect 속성을 이용해 /member/listMembers.do로 리다이렉트한다.
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
		return mav;
	}
	
	@RequestMapping(value="/member/removeMember.do", method=RequestMethod.GET)
	public ModelAndView removeMember(@RequestParam("id") String id,HttpServletRequest request, HttpServletResponse response) throws Exception{
		request.setCharacterEncoding("utf-8");
		memberService.removeMember(id);
		ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
		return mav;
	}
	
	@RequestMapping(value="/member/*Form.do", method=RequestMethod.GET)
	public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String viewName = getViewName(request);
		ModelAndView mav = new ModelAndView();
		mav.setViewName(viewName);
		return mav;
	}
	
	private  String getViewName(HttpServletRequest request) throws Exception {
	      String contextPath = request.getContextPath();
	      String uri = (String)request.getAttribute("javax.servlet.include.request_uri");
	      if(uri == null || uri.trim().equals("")) {
	         uri = request.getRequestURI();
	      }
	      
	      //http://localhost:port/member/listMember.do로 요청시
	      int begin = 0;  //
	      if(!((contextPath==null)||("".equals(contextPath)))){
	         begin = contextPath.length();  // 전체 요청명 의 길이를 구함
	      }

	      int end;
	      if(uri.indexOf(";")!=-1){
	         end=uri.indexOf(";");  //요청 uri에 ';'가 있을 경우 ';'문자 위치를 구함
	      }else if(uri.indexOf("?")!=-1){
	         end=uri.indexOf("?");   //요청 uri에 '?'가 있을 경우 '?' 문자 위치를 구함
	      }else{
	         end=uri.length();
	      }

	      //http://localhost:8090/member/listMember.do로 요청시 먼저 '.do'를 제거한 http://localhost:8090/member/listMember를 구한 후,
	      //다시 http://localhost:8090/member/listMember에서 역순으로 첫번째 '/' 위치를 구한 후, 그 뒤의 listMember를 구한다.
	      String fileName=uri.substring(begin,end);
	      if(fileName.indexOf(".")!=-1){
	         fileName=fileName.substring(0,fileName.lastIndexOf("."));  //요청명에서 역순으로 최초 '.'의 위치를 구한후, '.do' 앞에까지의 문자열을 구함
	      }
	      if(fileName.lastIndexOf("/")!=-1){
	         fileName=fileName.substring(fileName.lastIndexOf("/"),fileName.length()); //요청명에서 역순으로 최초 '/'의 위치를 구한후, '/' 다음부터의 문자열을 구함  
	      }
	      return fileName;
	   }

}

 

* memberServiceImpl.java

package com.spring.member.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import com.spring.member.dao.MemberDAOImpl;
import com.spring.member.vo.MemberVO;

@Service("memberService")
public class MemberServiceImpl {
	@Autowired
	private MemberDAOImpl dao;
	
	/*
	 	public void setMemberDAO(MemberDAOImpl dao) { this.dao = dao; }
	 */
	
	public List listMembers() throws DataAccessException{
		List membersList = dao.selectAllMemberList();
		return membersList;
	}
	
	public int addMember(MemberVO memberVO) throws DataAccessException {
	     return dao.insertMember(memberVO);
	   }


	   public int removeMember(String id) throws DataAccessException {
	      return dao.deleteMember(id);
   }
}

 

* memberDAOImpl.java

package com.spring.member.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import com.spring.member.vo.MemberVO;

@Repository("dao")
public class MemberDAOImpl {
	@Autowired
	private SqlSession sqlSession;

	/*
	 * public void setSqlSession(SqlSession sqlSession) { 
	 * this.sqlSession = sqlSession; }
	 */

	public List selectAllMemberList() throws DataAccessException {
		List<MemberVO> membersList = null;
		membersList = sqlSession.selectList("mapper.member.selectAllMemberList");
		return membersList;
	}

	public int insertMember(MemberVO memberVO) throws DataAccessException {
		int result = sqlSession.insert("mapper.member.insertMember", memberVO);
		return result;
	}

	public int deleteMember(String id) throws DataAccessException {
		int result =  sqlSession.delete("mapper.member.deleteMember", id);
		return result;
	}
}

 

* MemberVO.java

package com.spring.member.vo;

import java.sql.Date;

import org.springframework.stereotype.Component;

@Component("memberVO")
public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;

	public MemberVO() {
		
	}

	public MemberVO(String id, String pwd, String name, String email) {
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
}

 

- 코드 작성 후 /member/listmembers.do 로 접근해 회원 정보 리스트가 출력되는지 확인한다.

출력 결과

 

반응형

'Spring' 카테고리의 다른 글

[Spring] 스프링 웹 프로젝트 생성하기  (0) 2024.10.15
[Spring]MyBatis 연동하기  (0) 2024.08.17
[Spring]JDBC 연동  (0) 2024.08.17
[Spring]스프링 MVC  (0) 2024.08.17
[Spring]의존성 주입  (0) 2024.08.16
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함