다양한 기능 수행( 굉장히 복잡한 프레임워크 ) - 객체를 다루는 기능
spring.io <-- 참고
스프링은 자바에서만 사용 가능
전자정부프레임워크 - spring에서 사용
대기업 -> 유니콘 기업 쪽에서 많이 사용(네이버 등,,)
spring
application <-- back-end + server
web
app(많이 쓰이진 않음)
... 만들 수 있다
spring - di / aop 핵심 ===> mvc 구조 만듦
외부 조립기 ( 외부에서 인스턴스화 시켜서 참조시킴 = include와 유사 )
new를 사용하지 않고 가져다 씀
메소드가 객체의 호출 작업을 개발자가 하는것이 아니라, 외부에서 결정되는 것을 의미
프로그램 제어권을 Frameowrk가 가져감
생성된 객체의 생명주기 '전체'에 대한 권한과 관리를 프레임 워크에 주어, 개발자는 비지니스 로직에만 신경
개발자가 설정만 하면 (annotaion , xml 등을 통해 설정해놓으면) Container가 알아서 처리
기존 객체 생성과 실행 순서
1. 객체 생성
2. 의존성 객체 생성 (클래스 내부에서 생성)
3. 의존성 객체 메소드 호출
스프링에서의 객체 생성과 실행 순서
1. 객체 생성
2. 의존성 주입 (스스로 만드는것이 아니라, 제어권을 스프링에게 위임하여, 스프링이 만들어 놓은 객체를 주입)
3. 의존성 객체 메소드 호출
메이븐 프로젝트 만들기
pom.xml에 pom-java.txt(받은 거) 복사해서 붙이기 (전체 지우고 붙이면 됨)
알맞게 자바 버전 맞추기
pom.java.txt붙이면 저 라이브러리가 생긴다.
HelloBean1 / 2 클래스 생성 후 메서드 생성(출력문 있음) -> 실행 클래스에서 인스턴스 객체 생성 후 실행
Hello 인터페이스 생성하고 메서드 생성 -> 인터페이스 구현 클래스 2개 생성(HelloBean1 / 2) -> 실행 클래스 생성 후 객체 구현하고 출력
spring Bean Configuration File(Assembler)
똑같이 클래스 생성 후 메서드 생성 -> file하나를 context.xml 이름으로 생성하고 context.txt(받은 파일) 가져와서 복붙하기 (assembler) -> 실행클래스에서 가져와서 써주기
context.xml
<?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-4.3.xsd">
<bean> 안에 적을 데이터 쓰기
<!-- HelloBean1 helloBean1 = new HelloBean1(); -->
<bean name="helloBean1" class="com.exam.spring03.HelloBean1" />
<!-- HelloBean1 helloBean2 = new HelloBean1(); -->
<bean name="helloBean2" class="com.exam.spring03.HelloBean2" />
</beans>
//id로도 생성 가능하다.
<bean id="helloBean3" class="com.exam.spring03.HelloBean1" />
HelloBean1 helloBean1 = (HelloBean1)ctx.getBean("helloBean3");
helloBean1.sayHello("홍길동"); <-- id로 생성한 거 불러오기
context.xml 똑같은 형식으로 넣어주기, 2번에 app부분만 바꾸면 된다.
App
package com.exam.spring04;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring04/context.xml");
//HelloBean1 hello = (HelloBean1)ctx.getBean("helloBean1");
Hello hello = (Hello)ctx.getBean("helloBean1");
hello.sayHello("홍길동");
hello = (Hello)ctx.getBean("helloBean2");
hello.sayHello("이몽룡");
ctx.close();
}
}
클래스 멤버 필드(static) - 프로그램 실행시
인스턴스 멤버 필드 - new로 객체 생성시 실행(인스턴스화 할 때)
singleton(프로그램 실행 시) / prototype(그때그때 필요 시점에 따라 다름)
context.xml( scope="prototype" 추가 )
<?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-4.3.xsd">
<bean name="helloBean1" class="com.exam.spring05.HelloBean1" scope="prototype" />
<bean name="helloBean2" class="com.exam.spring05.HelloBean2" scope="prototype" />
</beans>
package com.exam.spring05;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
hello1.sayHello("홍길동1 : " + hello1);
HelloBean1 hello3 = (HelloBean1) ctx.getBean("helloBean1");
hello3.sayHello("홍길동2 : " + hello3);
ctx.close();
}
}
그때그때 생성되기 때문에 참조값이 다르다(new 기능과 동일함)
<?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-4.3.xsd">
<bean name="helloBean1" class="com.exam.spring05.HelloBean1" scope="singleton" />
<bean name="helloBean2" class="com.exam.spring05.HelloBean2" />
</beans>
그냥 가져와서 실행해보기
package com.exam.spring05;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
ctx.close();
}
}
프로그램 시작과 동시에 생성됨
객체 만들고 실행해보면
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring05/context.xml");
HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
hello1.sayHello("홍길동1 : " + hello1);
HelloBean1 hello3 = (HelloBean1) ctx.getBean("helloBean1");
hello3.sayHello("홍길동2 : " + hello3);
ctx.close();
}
prototype과 달리 두 객체의 참조 주소가 같다.
디폴트 생성자가 아닌 매개변수가 있는 생성자 호출하기
매개변수가 있는 생성자 사용하기 위해 xml에 constructor-arg 사용하고 value에 사용할 변수 적기
<bean name="helloBean2" class="com.exam.spring06.HelloBean1" scope="prototype" >
<constructor-arg>
<value>이몽룡</value>
</constructor-arg>
</bean>
<constructor-arg value="이몽룡"> <-- 이렇게 사용해도 된다.
실행클래스 실행
package com.exam.spring06;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring06/context.xml");
//HelloBean1 hello1 = (HelloBean1) ctx.getBean("helloBean1");
//hello1.sayHello();
HelloBean1 hello2 = (HelloBean1) ctx.getBean("helloBean2");
hello2.sayHello();
ctx.close();
}
HelloBean1.java
public HelloBean1(String firstName, String lastName) {
System.out.println("HelloBean1(String firstName, String lastName) 호출");
this.name = lastName + " " + firstName;
}
construtor-arg 2개를 넣으면 된다.
<bean name="helloBean3" class="com.exam.spring06.HelloBean1" scope="prototype" >
<constructor-arg>
<value>몽룡</value>
</constructor-arg>
<constructor-arg>
<value>이</value>
</constructor-arg>
</bean>
<constructor-arg value="몽룡" />
<constructor-arg value="이" /> <-- 한줄로 사용할 때는 이렇게 나눠서 적기
BoardTO.java
WriteAction.java
저기 표시되어 있는 생성자(다른 클래스를 인자로 가짐)를 스프링화 시키려면
<bean name="writeAction2" class="com.exam.spring07.WriteAction" scope="prototype" >
<constructor-arg>
<bean class="com.exam.spring07.BoardTO" />
</constructor-arg>
</bean>
후에 실행 클래스에서 실행
package com.exam.spring07;
import org.springframework.context.support.GenericXmlApplicationContext;
public class App {
public static void main(String[] args) {
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("classpath:com/exam/spring07/context.xml");
WriteAction writeAction2
= (WriteAction) ctx.getBean("writeAction2");
writeAction2.execute();
ctx.close();
}
}
to를 먼저 선언 후에 사용해도 똑같다.
<bean name="to" class="com.exam.spring07.BoardTO" scope="prototype" />
<bean name="writeAction3" class="com.exam.spring07.WriteAction" scope="prototype">
<constructor-arg>
<ref bean="to" />
</constructor-arg>
</bean>
WriteAction writeAction3
= (WriteAction) ctx.getBean("writeAction2");
writeAction3.execute();
<bean name="to" class="com.exam.spring09.EmpTO" scope="prototype" >
<constructor-arg value="제임스"/>
<constructor-arg value="Salesman"/>
<constructor-arg value="300"/>
</bean>
<bean name="empAction" class="com.exam.spring09.EmpAction" scope="prototype">
<constructor-arg>
<ref bean="to" />
</constructor-arg>
</bean>