스프링 프레임워크
- 경량 컨테이너로 애플리케이션 객체의 생명주기와 설정을 포함하고 직접 관리(new 로 객체를 생성하지 않아도 됨. 알아서 생성해줌)
- POJO(순수객체-다른객체와 결합이 없음.빨리 컴파일됨) 방식으로 크기와 부하의 측면에서 경량
- 제어 역행(IoC)을 지원(스프링에서 사용자의 코드 호출)
- 의존성 주입을 지원
- 관점지향 프로그래밍(AOP)을 지원(공통 기능들을 한곳에 모아놓고 필요한 곳에 끼어놓고 실행)
- 영속성과 관련된 다양한 AIP를 지원
- 확장성이 높다
DI의 종류
- DI는 의존관계주입 즉, 오브젝트 사이의 의존 관계를 만드는것
- 오브젝트 간의 의존관계를 자동화 해주는것을 의미하며 Ioc 컨테이너에서 자동화 역할을 담당
- Setter Injection(세터 주입)
- Construction Injection(생성자 주입)
- 첫번째, 어노테이션(@)을 붙여서 사용하며 특별한 의미가 있는 주석을 사용하여 사용
- 두번째, xml을 사용하여 사용
밑의 두줄 추가
-vm
C:\Program Files\Java\jdk-13.0.2\bin\javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.5.700.v20200207-2156.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1200.v20200508-1552
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
-vm
C:\Program Files\Java\jdk-13.0.2\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms1048m
-Xmx1024m
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.module.lock.timeout=10
MVC 프로젝트 만들기 위해서
springworkspace\.metadata\.plugins\org.springsource.ide.eclipse.commons.content.core 폴더 안에
https-content.xml 파일을 넣어줘야 한다
Maven project
Maven 빌드 도구
groupId와 artifactId를 동일하게 설정하고 프로젝트 생성
pom.xml에서 프로퍼티와 디펜던시 설정
src/test 안의 소스들은 실행이 안되니 그 안에 만들지 않기
src/resources 에서 마우스 우클릭 -> new -> other -> spring검색 -> Spring Bean Configuration File로 xml 파일 생성
스프링 프레임워크에서 컨테이너가 객체를 생성하고 관리하기까지 과정
1. 객체 생성에 필요한 클래스를 개발자가 정의한다.
2. 필요한 객체 생성 정보(설계도)를 개발자가 정의한다.
3. 스프링 프레임워크 컨테이너가 설계도를 사용하여 객체를 생성 및 관리한다.
4. 개발자는 컨테이너에서 필요한 객체를 호출하여 사용한다.
클래스 A
package eiEx01;
public class A {
private String id;
private String name;
private String addr;
public String getId() { return id; }
public String getName() { return name; }
public String getAddr() { return addr; }
public void setId(String id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setAddr(String addr) { this.addr = addr; }
}
applicationcontext.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.xsd">
<!-- 시스템에서 필요로 하는 객체를 생성 설계도를 작성하는 위치 -->
<bean id="a" class="eiEx01.A"><!-- A a = new A(); -->
<!-- 생성된 객체 속성값 대입 영역 -->
<property name="id" value="admin" /><!-- a.setId(); setter 호출. name에는 필드이름 -->
<property name="name" value="관리자" /><!-- a.setName(); setter 호출. name에는 필드이름 -->
<property name="addr" value="대전광역시" /><!-- a.setAddr(); setter 호출. name에는 필드이름 -->
</bean><!-- 객체 하나 생성 태그 -->
</beans>
ioc 컨테이너가 생성한 객체는 ioc 컨테이너에서 객체를 가지고 관리한다
//---------- ioc 컨테이너 강제 동작 ----------
AbstractApplicationContext ctx
= new GenericXmlApplicationContext("classpath:applicationcontext.xml");
ioc 컨테이너가 가지고 있는 a라는 이름의 bean을 A 타입으로 꺼내기
A springA = ctx.getBean("a",A.class);
System.out.println("id :: " + springA.getId());
System.out.println("name :: " + springA.getName());
System.out.println("addr :: " + springA.getAddr());
실행결과
id :: admin name :: 관리자 addr :: 대전광역시 |
Setter 주입
클래스 B
package eiEx01;
public class B {
private String name;
private int age;
public String getName() { return name; }
public int getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
}
클래스 C
package eiEx01;
public class C {
private String id;
private B b;
public void info() {
System.out.println("id:" + id);
System.out.println("name:" + b.getName());
System.out.println("age:" + b.getAge());
}
public String getId() { return id; }
public B getB() { return b; }
public void setId(String id) { this.id = id; }
public void setB(B b) { this.b = b; }
}
개발자가 의존 주입 객체 생성
B b = new B();
b.setName("홍길동");
b.setAge(20);
C c = new C();
c.setId("hong");
c.setB(b); //setter 주입
c.info();
spring ioc 컨테이너를 통한 의존 주입 객체 생성
<?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 id="a" class="eiEx01.A"><!-- A a = new A(); -->
<!-- 생성된 객체 속성값 대입 영역 -->
<property name="id" value="admin" /><!-- a.setId(); setter 호출. name에는 필드이름 -->
<property name="name" value="관리자" /><!-- a.setName(); setter 호출. name에는 필드이름 -->
<property name="addr" value="대전광역시" /><!-- a.setAddr(); setter 호출. name에는 필드이름 -->
</bean><!-- 객체 하나 생성 태그 -->
<bean id="springB" class="eiEx01.B">
<property name="name" value="홍길동" />
<property name="age" value="20" />
</bean>
<bean id="springC" class="eiEx01.C">
<property name="id" value="hong" />
<property name="b" ref="springB" /><!-- setter주입.참조하고자 하는 bean의 id값을 ref에 입력 -->
</bean>
<!--
하나의 클래스로는 여러 bean을 선언할 수 있으나 id는 중복될 수 없다
-->
<bean id="springB2" class="eiEx01.B">
<property name="name" value="홍길동2" />
<property name="age" value="30" />
</bean>
</beans>
ioc 컨테이너에 있는 springC 객체를 꺼내 info 메소드를 호출
C springC = ctx.getBean("springC",C.class);
springC.info();
생성자 주입
package diEx02;
public class A {
private String name;
private String addr;
public A(String name, String addr) {
this.name = name;
this.addr = addr;
}
public String getName() { return name; }
public String getAddr() { return addr; }
}
<?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 id="springA" class="diEx02.A">
<constructor-arg value="홍길동" /> <!-- 생성자로 매개값 대입 태그 -->
<constructor-arg value="대전광역시" />
</bean>
</beans>
개발자가 생성자를 통하여 객체 생성하기
A a = new A("홍길동","대전광역시");
System.out.println("name:" + a.getName());
System.out.println("addr:" + a.getAddr());
System.out.println("-----------------------------");
스프링 ioc 컨테이너를 통하여 객체 생성 후 사용하기
AbstractApplicationContext ctx
= new GenericXmlApplicationContext("classpath:applicationcontext.xml");
A springA = ctx.getBean("springA",A.class);
System.out.println("springA name:" + springA.getName());
System.out.println("springA addr:" + springA.getAddr());
System.out.println("-----------------------------");
생성자 의존 주입
package diEx02;
public class B {
private String id;
private A a;
public B(String id,A a) {
this.id = id;
this.a = a;
}
public String getId() { return id; }
public A getA() { return a; }
}
개발자가 생성자를 통하여 객체 생성하기
A a2 = new A("고길동","경주");
B b = new B("gogildong",a2);
System.out.println("id:" + b.getId());
System.out.println("name:" + b.getA().getName());
System.out.println("addr:" + b.getA().getAddr());
스프링 ioc 컨테이너를 통하여 객체 생성 후 사용하기
<?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 id="springA" class="diEx02.A">
<constructor-arg value="홍길동" /> <!-- 생성자로 매개값 대입 태그 -->
<constructor-arg value="대전광역시" />
</bean>
<bean id="a2" class="diEx02.A">
<constructor-arg value="고길동" /> <!-- 생성자로 매개값 대입 태그 -->
<constructor-arg value="경주" />
</bean>
<bean id="springB" class="diEx02.B">
<constructor-arg value="hongildong" /> <!-- 생성자로 매개값 대입 태그 -->
<constructor-arg ref="springA" />
</bean>
</beans>
B springB = ctx.getBean("springB",B.class);
System.out.println("springB id:" + springB.getId());
System.out.println("springB name:" + springB.getA().getName());
System.out.println("springB addr:" + springB.getA().getAddr());
'Spring' 카테고리의 다른 글
[Spring] 스프링 MVC 프로젝트 (0) | 2024.11.24 |
---|---|
[Spring] AOP 어노테이션 (0) | 2024.11.23 |
[Spring] joinpoint (0) | 2024.11.22 |
[Spring] AOP (0) | 2024.11.21 |
[Spring] 어노테이션(@) (0) | 2024.11.20 |