풀스택 개발자 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>



 

결과창