SPRING

[SPRING] RequestScope Bean 주입

예나부기 2021. 7. 26.

빈 주입

  • @Autowired를 활용하여 Bean을 자동으로 주입받을 수 있다.
  • Spring MVC에서는 추가로 request, session, application을 제공하고 있다.

RequestScope

  • Bean을 정의할 때 request scope로 정의하면 요청이 발생할 때 마다 Bean객체가 생성되어 자동으로 주입됨
  • 주입된 Bean은 요청 발생 시 주입만 이루어지는 것이므로 request영역에 저장되지는 않는다.
  • xml로 Bean을 설정하고, byName으로 주입받았을 경우에만 request 영역에 자동 저장됨
  • Java로 세팅하는 방식에서는 @RequestScope를 사용
  • XML으로 세팅하는 방식에서는 scope="request"로 설정

@Bean을 사용 & Type으로 주입받은 예시

1) DataBean1 생성하기

public class DataBean1 {
	
	private int data1;
	private int data2;
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public int getData2() {
		return data2;
	}
	public void setData2(int data2) {
		this.data2 = data2;
	}
	
}

2)index.jsp 생성하기

<%@ 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>

	<a href='test1'>test1</a>

</body>
</html>

3) RootAppContext 정의하기(Bean에 이름을 붙이자! @Bean("이름"))

// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
	
    @Bean("requestBean2")
    @RequestScope
    public DataBean2 dataBean2() {
        return new DataBean2();
	}
}

4)TestController 생성해서 주입받기

@Controller
public class TestController {

	@Autowired
	DataBean1 requestBean1;

    @GetMapping("/test1")
    public String test1(){
		
        requestBean1.setData1("문자열1");
        requestBean1.setData2("문자열2");
        
            return "forward:/result1";
    }
       
    @GetMapping("/result1")
    public String result1(Model model) {
		
        System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
        System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
        
            return "result1";
    }
}

-@Autowired를 사용했기 때문에 Type을 통해 주입 받게 된다. 

-정의된 Bean 중에서 DataBean1 Type으로 지정된 Bean이 있는지 찾게 되고, 

위에서 @RequestScope라고 정의 했기 때문에 새로운 요청이 발생했을 때 dataBean1()이라는 매서드가 호출되고,

return new DataBean1();에 따라 DataBean이 생성된다.

5) result1.jsp 생성

<%@ 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>

-실행 결과: 문자열1과 문자열2이 콘솔 창에서만 정상 출력, jsp에서는 출력되지 않는다.

-위에 말했듯이, @RequestScope라고 정의함으로써 Bean이 새로운 요청이 발생했을 때 주입되는건 맞지만

그것이 request에 저장되었다는 뜻은 아니다!

-jsp에 쓰고자 한다면 Model을 주입받아 addAttribute 해주어야 한다.

 

6) TestController에서 Model 주입받기

@Controller
public class TestController {

    @Autowired
    DataBean1 requestBean1;

    @GetMapping("/test1")
    public String test1(){
		
        requestBean1.setData1("문자열1");
        requestBean1.setData2("문자열2");
        
            return "forward:/result1";
       }
       
    @GetMapping("/result1")
    public String result1(Model model) {
		
        System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
        System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
        
        model.addAttribute("requestBean1", requestBean1);
        //request 영역에 저장!
        
            return "result1";
        }
}

 

**xml 방식으로 하고자 한다면, Bean을 root-context.xml에 정의해주면 된다!

 


@Bean을 사용 & 이름으로(byName) 주입받은 예시

1) DataBean2 생성하기

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

2)index.jsp 생성하기

<%@ 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>

	<a href='test1'>test1</a>

</body>
</html>

3) RootAppContext 정의하기

// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
	
    @Bean
    @RequestScope //새로운 요청이 발생했을 때 Bean이 주입된다.
    public DataBean1 dataBean1() {
        return new DataBean1();
	}
	
    @Bean("requestBean2")
    @RequestScope
    public DataBean2 dataBean2() {
        return new DataBean2();
	}
}

4)TestController 생성해서 주입받기

@Controller
public class TestController {

    @Resource(name = "requestBean2")
    DataBean2 requestBean2;
	
    @GetMapping("/test1")
    public String test1(){
		
        requestBean1.setData1("문자열1");
        requestBean1.setData2("문자열2");
        
        //이 부분 추가
        requestBean2.setData3("문자열3");
        requestBean2.setData4("문자열4");
        //
        
            return "forward:/result1";
       }
       
    @GetMapping("/result1")
    public String result1(Model model) {
		
        System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
        System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
        
        //이 부분 추가
        System.out.printf("requestBean2.data3 : %s\n", requestBean2.getData3());
        System.out.printf("requestBean2.data4 : %s\n", requestBean2.getData4());
        //request에 저장하겠다는 뜻은 아니므로 윗 부분만 넣으면 결과가 jsp에 넘어가지 X
        //따라서 Model에 addAttribute해줘야 request에 저장된다.
        
        model.addAttribute("requestBean1", requestBean1);
        model.addAttribute("requestBean2", requestBean2);
        
            return "result1";
        }
}

-@Resource(name = " ")을 사용했기 때문에 같은 이름을 가진 Bean을 찾아 주입한다.

-위에 말했듯이, @RequestScope라고 정의함으로써 Bean이 새로운 요청이 발생했을 때 주입되는건 맞지만

그것이 request에 저장되었다는 뜻은 아니다!

-jsp에 쓰고자 한다면 Model을 주입받아 addAttribute 해주어야 한다.

 

<%@ 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>

-실행 결과: 콘솔과 jsp 에서 모두 정상 출력!


@Component를 사용한 예제

*@Component는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.

@Component역시 아무런 추가 정보가 없다면 Class의 이름을 Camelcase로 변경한 것이 Bean id로 사용된다.

하지만 @Bean과는 다르게 @Componentn는 name이 아닌 value를 이요해 Bean의 이름을 지정한다.

 

1) DataBean3 생성하기

@Component
@RequestScope
public class DataBean3 {

	private String data5;
	private String data6;
	
	public String getData5() {
		return data5;
	}
	public void setData5(String data5) {
		this.data5 = data5;
	}
	public String getData6() {
		return data6;
	}
	public void setData6(String data6) {
		this.data6 = data6;
	}
	
	
}

2)index.jsp 생성하기

<%@ 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>

	<a href='test1'>test1</a>

</body>
</html>

3) ServletAppContext.java에서 @Component를 찾아낼 수 있도록 @ComponentScan 지정

// Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("kr.co.softcampus.controller")

@ComponentScan("kr.co.softcampus.beans")

public class ServletAppContext implements WebMvcConfigurer{
	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	// 정적 파일의 경로를 매핑한다.
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
}

TestController에서 주입받는 방법과, reqeust영역까지 저장하는 방법, Type이 아닌 byName으로 가져오는 방법은 위의 예제와 모두 동일하다!

단, byName으로 지정할 때 @Bean에서는 (name)을 사용하지만, @Component에서는 아래와 같이 (value) 사용

@Resource(name = "requestBean2")
@Component(value = "requestBean4")

 

 

 

 

참고 : https://galid1.tistory.com/494

 

Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2

@Component, @Bean 프로그램이 거대해 짐에 따라 XML 을 이용하여 IOC Container 를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@) 이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데

galid1.tistory.com

'SPRING' 카테고리의 다른 글

[SPRING] SessionScope  (0) 2021.07.27
[SPRING] 스프링 component-scan 개념 및 동작 과정  (0) 2021.07.27
[SPRING] Request Scope  (0) 2021.07.25
[SPRING] Redirect와 Forward  (0) 2021.07.24
[SPRING] FORM TAG 요소 - 2  (0) 2021.07.23

댓글