웹페이지 제작을 위한 스프링공부
RequestScope 빈 주입
풀스택 개발자
2020. 5. 6. 14:43
java
package kr.co.softcampus.beans;
public class DataBean1 {
private String data1;
private String data2;
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
package kr.co.softcampus.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import kr.co.softcampus.beans.DataBean1;
@Controller
public class TestController {
@Autowired//type을 통한 주입을 받게됨
DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서)
//test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용)
}
@GetMapping("/result1")
public String result1() {
System.out.println("requestBean1.data1:"+requestBean1.getData1());
System.out.println("requestBean1.data2:"+requestBean1.getData2());
return "result1";
}
}
package kr.co.softcampus.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;
import kr.co.softcampus.beans.DataBean1;
import kr.co.softcampus.beans.DataBean2;
// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
@Bean
@RequestScope// bean이 주입되는 시점이 새로운 요청이 발생했을 때 bean을 주입한다는 의미
public DataBean1 dataBean1() {
return new DataBean1();
}
}
정리
1.controller에 타입으로 주입받겠다고 명시
2..정의되어져있는 bean들 중에 DataBean1을 반환하는 메소드를 찾아서 호출
3.Scope가 requestScope가 붙어져있음
4.이말은 즉슨 1번의 bean이 주입되는 시점이 새로운 요청이 발생했을 때 bean을 주입한다는 의미
5.controller에서 test1을 요청하게되면 bean이 자동 주입됨
6.그것을 활용하여 forward함 forward는 서버상의 이동이기에 새로운 요청이 발생하지 않아서 test1요청시 만들어진 bean을 사용
7.requestScope 는 bean객체가 주입되는 시점을 설정하는것이지 request영역에 bean객체를 저장한다 그런 의미는 아님
따라서 jsp에서 사용하려면 model객체를 주입받아 값을 넘겨야함
결과
requestBean1.data1:문자열1
requestBean1.data2:문자열2
jsp로 값 넘겨보기
@GetMapping("/result1")
public String result1(Model model) {
System.out.println("requestBean1.data1:"+requestBean1.getData1());
System.out.println("requestBean1.data2:"+requestBean1.getData2());
model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다
return "result1";
}
model객체를 활용
<%@ 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>
<h1>result1</h1>
<h3>requestBean1.data1:${requestScope.requestBean1.data1}</h3>
<h3>requestBean1.data1:${requestScope.requestBean1.data2}</h3>
</body>
</html>
결과창
xml
package kr.co.softcampus.beans;
public class DataBean1 {
private String data1;
private String data2;
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
package kr.co.softcampus.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import kr.co.softcampus.beans.DataBean1;
@Controller
public class TestController {
//새로운 요청이 발생하지 않았는데도 bean을 주입하려고 시도를 함 하지만 bean이 requestScope로 설정되어있어서 에러가 날 수 있음,해결방안:다양함 @lazy를 붙여서 나중에 주입하도록하는 방법(서버가 가동이 될 때 자동으로 주입되지 않고 일단 대기하고 있다가 실제 request요청이 발생했을때 bean이 주입됨
@Autowired//type을 통한 주입을 받게됨
@Lazy
DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서)
//test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용)
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.println("requestBean1.data1:"+requestBean1.getData1());
System.out.println("requestBean1.data2:"+requestBean1.getData2());
model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다
return "result1";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<bean class='kr.co.softcampus.beans.DataBean1' scope='request'/>
</beans>
java와 달리 root-context에서 bean을 정의
<%@ 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>
<h1>result1</h1>
<h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3>
<h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3>
</body>
</html>
결과창
byname
java
package kr.co.softcampus.beans;
public class DataBean2 {
private String data3;
private String data4;
public String getData3() {
return data3;
}
public void setData3(String data3) {
this.data3 = data3;
}
public String getData4() {
return data4;
}
public void setData4(String data4) {
this.data4 = data4;
}
}
package kr.co.softcampus.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.RequestScope;
import kr.co.softcampus.beans.DataBean1;
import kr.co.softcampus.beans.DataBean2;
// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
@Bean
@RequestScope
public DataBean1 dataBean1() {
return new DataBean1();
}
@Bean("requestBean2")//bean객체의 이름을 부여=byname
@RequestScope
public DataBean2 dataBean2() {
return new DataBean2();
}
}
package kr.co.softcampus.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import kr.co.softcampus.beans.DataBean1;
import kr.co.softcampus.beans.DataBean2;
@Controller
public class TestController {
@Autowired//type을 통한 주입을 받게됨
DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서)
@Resource(name="requestBean2")//이름을 통한 주입에는 Resource
DataBean2 requestBean2;
//test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
requestBean2.setData3("문자열3");
requestBean2.setData4("문자열4");
return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용)
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.println("requestBean1.data1:"+requestBean1.getData1());
System.out.println("requestBean1.data2:"+requestBean1.getData2());
System.out.println("requestBean1.data3:"+requestBean2.getData3());
System.out.println("requestBean1.data4:"+requestBean2.getData4());
model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다
model.addAttribute("requestBean2",requestBean2);
return "result1";
}
}
<%@ 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>
<h1>result1</h1>
<h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3>
<h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3>
<h3>requestBean2.data3 : ${requestScope.requestBean2.data3 }</h3>
<h3>requestBean2.data4 : ${requestScope.requestBean2.data4 }</h3>
</body>
</html>
결과창
xml
package kr.co.softcampus.beans;
public class DataBean2 {
private String data3;
private String data4;
public String getData3() {
return data3;
}
public void setData3(String data3) {
this.data3 = data3;
}
public String getData4() {
return data4;
}
public void setData4(String data4) {
this.data4 = data4;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<bean class='kr.co.softcampus.beans.DataBean1' scope='request'/>
<bean id='requestBean2' class='kr.co.softcampus.beans.DataBean2' scope='request'/> //id속성을 써서 이름을 부여
</beans>
package kr.co.softcampus.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import kr.co.softcampus.beans.DataBean1;
import kr.co.softcampus.beans.DataBean2;
@Controller
public class TestController {
//새로운 요청이 발생하지 않았는데도 bean을 주입하려고 시도를 함 하지만 bean이 requestScope로 설정되어있어서 에러가 날 수 있음,해결방안:다양함 @lazy를 붙여서 나중에 주입하도록하는 방법(서버가 가동이 될 때 자동으로 주입되지 않고 일단 대기하고 있다가 실제 request요청이 발생했을때 bean이 주입됨
@Autowired//type을 통한 주입을 받게됨
@Lazy
DataBean1 requestBean1;//정의된 bean중에서 DataBean1 타입으로 정의된 bean이 있는지 확인해봄 (bean이 있는곳에서)
@Resource(name="requestBean2")
@Lazy
DataBean2 requestBean2;
//test1 요청 ->새로운 요청이므로 위에 DataBean1 requestBean1에 bean객체가 주입됨
@GetMapping("/test1")
public String test1(HttpServletRequest request) {
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
requestBean2.setData3("문자열3");
requestBean2.setData4("문자열4");
return "forward:/result1";//forward인 경우 서버상의 이동이기에 새로운 요청이 아니므로 새로운 bean객체가 생성되지않음(test1요청시 만들어진 객체를 사용)
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.println("requestBean1.data1:"+requestBean1.getData1());
System.out.println("requestBean1.data2:"+requestBean1.getData2());
System.out.println("requestBean1.data3:"+requestBean2.getData3());
System.out.println("requestBean1.data4:"+requestBean2.getData4());
model.addAttribute("requestBean1",requestBean1);//requestBean1의 이름으로 requestBean1의 값을 넘깁니다
//xml에서는 id를 준 bean은 model을 활용하여 값을 넘겨줄 필요가없다 왜냐 bean이 주입될때 request영역에 자동으로 저장됨
return "result1";
}
}
<%@ 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>
<h1>result1</h1>
<h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3>
<h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3>
<h3>requestBean2.data3 : ${requestScope.requestBean2.data3 }</h3>
<h3>requestBean2.data4 : ${requestScope.requestBean2.data4 }</h3>
</body>
</html>
결과창