Spring의 작동 구조

메타플랫폼대표
|2024. 7. 16. 12:14
반응형

2024_0716_SpringEx1 [ADD] Spring non_IoC와 IoC의 차이

 

GitHub - chaSunil/FirstProject: 1차 프로젝트

1차 프로젝트. Contribute to chaSunil/FirstProject development by creating an account on GitHub.

github.com

 

 

 

package vo;

public class PersonVo {

	String name;
	int age;
	String addr;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	
}

 

 

 

non_ioc의 방법으로 생성하기

<%@page import="vo.PersonVo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	// Java Code 작성가능
	// 1. Constructor을 이용해서 초기화 시키는 방법
	PersonVo p1 = new PersonVo("일길동",20,"서울시 관악구 남부순환로 111");

	// 2. Setter를 이용해서 값을 넣는 방법
	PersonVo p2 = new PersonVo();
	
	p2.setName("이길동");
	p2.setAge(30);
	p2.setAddr("서울시 관악구 남부순환로 222");

	// EL로 값을 표현하려고 pageScope에 넣어줬다.
	pageContext.setAttribute("p1", p1);
	pageContext.setAttribute("p2", p2);

%>

<hr>
	p1's info
<hr>
이름: ${ p1.name } <br>
나이: ${ p1.age } <br>
주소: ${ p1.addr } <br>

<hr>
	p2's info
<hr>
이름: ${ p2.name } <br>
나이: ${ p2.age } <br>
주소: ${ p2.addr } <br>

 

 

web.xml 프로그램 시작시 가장 먼저 구동

ContextLoadListener를 가장 먼저 생성 -> applicationContext를 읽어온다 -> 그 안에 vo.PersonVo라는 정보를 읽고 빈(객체)을 생성한다.

 

 

 

ContextLoaderListener가 applicationContext를 읽어와서 생성해준다.

 

 

 

 

bean을 이렇게 만들어놓으면

 

 

 

 

Console에 찍히듯이 실행시키면, 자동으로 PersonVo라는 빈(객체)이 자동 생성된다.

 

 

 

 

Spring의 동작구조

 

 

 

 

객체를 넣을때는 순서대로 넣어주어야 한다.

 <!-- PersonVo p1 = new PersonVo("일길동",20,"서울 관악구 남부순환로") -->
 <!-- 인자들을 parameter라고도 하고 argument 아규먼트라고도 말한다. -->
 <bean id="p1" class="vo.PersonVo">
 	<constructor-arg value="일길동"/>
 	<constructor-arg value="20"/>
 	<constructor-arg value="서울특별시 관악구 남부순환로"/>
 </bean>
 <bean id="p2" class="vo.PersonVo"></bean>
 <bean id="p3" class="vo.PersonVo"></bean>
   
</beans>

 

 

 

 

Constructor Injection과 Setter Injection을 사용해보자.

 

Ioc 사용해서 객체의 값들을 전달하는 방법

 <!-- Constructor Injection (생성자를 통해서 값을 넣어준다) -->
 
 <!-- PersonVo p1 = new PersonVo("일길동",20,"서울 관악구 남부순환로") -->
 <!-- 인자들을 parameter라고도 하고 argument 아규먼트라고도 말한다. -->
 <!-- index나 type는 사용해도 그만.. 안사용해도 그만.. -->
 <bean id="p1" class="vo.PersonVo">
 	<constructor-arg value="일길동"  type="String"        index="0"/>
 	<constructor-arg value="20"      type="int"           index="1"/>
 	<constructor-arg value="서울특별시 관악구 남부순환로" index="2"/>
 </bean>
 
 <!-- Setter Injection -->
 <bean id="p2" class="vo.PersonVo">
 	<!-- p2.setName("이길동") -->
 	<property name="name" value="이길동"/>
 	<property name="age" value="30"/>
 	<property name="addr" value="서울특별시 관악구 남부순환로222"/>
 </bean>

 

 

 

 

bean으로 만든 객체 생성의 예시!!! (int는 사용 불가능 하다는 것을 알아야 한다 , 객체이기 때문이다)

 <!-- 빈은 객체이기 때문에 int 사용 불가 Integer 사용 가능 -->
 <!-- int i = 10 (X)    Integer ageBean = new Integer(30); -->
 <bean id="ageBean" class="java.lang.Integer">
 	<constructor-arg value="30"/>
 </bean>

 
 <!-- String addrBean = new String("서울시 관악구 봉천동"); -->
 <bean id="addrBean" class="java.lang.String">
 	<constructor-arg value="서울시 관악구 봉천동"/>
 </bean>
 
 
 <!-- Setter Injection -->
 <!-- 위에서 생성된 객체를 주입받는다. -->
 <bean id="p3" class="vo.PersonVo">
 	<property name="name" ref="nameBean"/>
 	<property name="age" ref="ageBean"/>
 	<property name="addr" ref="addrBean"/>
 </bean>
 
 
 <!-- 위에서 생성된 객체를 Constructor를 통한 Injection받는다  -->
 <bean id="p4" class="vo.PersonVo">
 	<constructor-arg ref="nameBean"/>
 	<constructor-arg ref="ageBean"/>
 	<constructor-arg ref="addrBean"/>
 </bean>

 

 

 

 

 

Spring 사용영역

 

 

 

Spring은 Tomcat안에서 움직인다.

request, page, session 공간에는 Spring 객체가 들어가기 적절하지 않다.

그렇기 때문에 application 공간을 사용한다.

 

그 공간을 사용할 수 있는 객체는 WebApplicationContext이다.

 

 

 

 

IoC.jsp 생성

<%@page import="vo.PersonVo"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@page import="org.springframework.web.context.WebApplicationContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	// Spring이 사용하고 있는 bean의 저장소를 관리하는 객체정보 얻어온다
	WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(application);
	// Java의 모든 객체를 return 할 수 있는 getBean은 Object 타입이다.
			
	// Spring이 생성한 Bean 정보를 얻어오기
	
	// 형식 1
	PersonVo p1 = (PersonVo)wac.getBean("p1");
	
	// 형식 2
	PersonVo p2 = wac.getBean("p2", PersonVo.class);
	

	// EL로 값을 표현하려고 pageScope에 넣어줬다.
	pageContext.setAttribute("p1", p1);
	pageContext.setAttribute("p2", p2);
	
%>

<hr>
	IoC : p1's info
<hr>
이름: ${ p1.name } <br>
나이: ${ p1.age } <br>
주소: ${ p1.addr } <br>

<hr>
	IoC : p2's info
<hr>
이름: ${ p2.name } <br>
나이: ${ p2.age } <br>
주소: ${ p2.addr } <br>

 

 

 

 

non_IoC와 IoC의 차이는 non_IoC는 새로고침하면, 계속 객체를 생성한다.

하지만 Spring은 새로고침해도, 객체를 더이상 생성하지 않는다. 오직 서버가 처음 시작되었을때만 한 번 만들어지고 전역적으로 사용할 수 있도록 만들어진다. (Spring은 프로그램 실행 초기 당시에 객체를 전역적으로 사용할 수 있도록 한 번 만들어준다)

 

 

 

 

applicationContext에서 scope의 기본값은 singleton이다. (서버 실행시 한 번만 만들어짐)

허나, scope의 값을 prototype으로 지시해주면, 새로고침을 하면 계속 생성이 된다.

 <!-- PersonVo p1 = new PersonVo("일길동",20,"서울 관악구 남부순환로") -->
 <bean id="p1" class="vo.PersonVo" scope="singleton">
 	<constructor-arg value="일길동"  type="String"        index="0"/>
 	<constructor-arg value="20"      type="int"           index="1"/>
 	<constructor-arg value="서울특별시 관악구 남부순환로" index="2"/>
 <!-- 인자들을 parameter라고도 하고 argument 아규먼트라고도 말한다. -->
 <!-- index나 type는 사용해도 그만.. 안사용해도 그만.. -->
 </bean>
 
 <!-- Setter Injection -->
 <!--                              scope 속성 : 생략시 기본값 singleton  -->
 <!--                              scope 속성 : prototype이면, 요청시마다 생성  -->
 <bean id="p2" class="vo.PersonVo" scope="prototype">
 	<!-- p2.setName("이길동") -->
 	<property name="name" value="이길동"/>
 	<property name="age" value="30"/>
 	<property name="addr" value="서울특별시 관악구 남부순환로222"/>
 </bean>
반응형