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>
'SpringBoot↗' 카테고리의 다른 글
Spring 파라미터 처리 (0) | 2024.07.17 |
---|---|
[오류해결]Spring Maven 라이브러리 충돌 일어날 때 (0) | 2024.07.17 |
진짜요점핵중요 A (DisPatcherServlet 작동움직임 세부구조) (0) | 2024.07.17 |
!!! Spring 초기 설정만 !!! 한 번 더! 리턴즈 !! !!! (0) | 2024.07.16 |
Spring (설정 및 설명) (0) | 2024.07.16 |