Learn/KH정보교육원

[KH 정보교육원 당산] 65일 (SpringFramework)

Dahoon06 2021. 6. 14. 20:52
728x90
반응형

spring framework이란?

 

- 스프링은 엔터프라이즈 어플리케이션에서 필요로 하는 기능을 제공하는 프레임워크

- 스프링은 JEE가 제공하는 다수의 기능을 지원하고 있기 때문에, JEE를 대체하는 프레임워크로 자리 잡고 있다

- 스프링은 JEE가 제공하는 기능 외에 DI나 AOP와 같은 기능을 지원하고 있다

 

DI(Dependency Injection, 의존성 주입)
:
 DI는 스프링 컨테이너가 지원하는 핵심 개념 중 하나
  DI는 객체 사이의 의존 관계를 객체 자신이 아닌 외부의 조립기(스프링 컨테이너)가 수행한다는 개념
  스프링은 설정 파일이나 어노테이션을 이용하여 객체 간의 의존 관계를 설정할 수 있다.

AOP(Aspect Oriented Programming,관점 지향 프로그래밍)
:
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 

 

Spring의 주요 특징)

- 경량의 프레임워크

. 자바 객체를 담고 있는 컨테이너 ( 자바객체의 생성, 소멸과 같은 라이프 사이클을 관리 )

- DI(dependency Injection)패턴을 지원

. 설정파일을 통해서 의존관계를 설정

- AOP(Aspect Oriented Programming)를 지원

. 트랙잭션이나 로깅, 보안과 같은 공통으로 필요로 하는 기능을 분리해서 각각의 모듈에 적용할 수 있다.

- POJO(Plain Old Java Object)를 지원

. 특정 인터페이스나 클래스를 상속받지 않은 자바 객체를 스프링 컨테이너가 저장하고 있다.

- 트랜잭션 처리를 위한 일관된 방법을 제공

- 영속성과 관련된 다양한 API를 제공

. JDBC, MyBatis, Hibernate, JPA등과 같은 프레임워크와의 연동

 

 


실습)

실습했던 workspace가 삭제돼서...수업 pdf로 대체...

 

Bean을 생성하고 사용

스프링 컨테이너가 관리할 빈 객체를 생성하기 위해서는 설정파일(.xml파일)에 태그를 사용하며 id(혹은 name)속성을 이용하여 해당 빈 객체의 식별 값을 지어준다.

 

설정 파일

객체 생성 :

<bean id="객체명(examDao)" class="객체가 속한 전체 클래스경로(test.exam02.ExamDao">

    <!-- 생성자를 통하여 값을 전달 -->

        <constructor-arg value="TEST TEST TEST"></constructor-arg>

</bean>

 

 

 

설정파일 경로 설정 => spring이 가지고 있는 클래스를 사용(ApplicationContext, FileSystemXmlApplicationContext)

ApplicationContext context = new FileSystemXmlApplicationContext("xml파일이 존재하는 경로");

ExamDao의 객체를 생성할때 xml파일에서 이 클래스의 객체를 생성할때 객체명을 examDao로 사용하였으므로

가져올때도 같은 이름으로 가져와야한다.

 

실행 결과

 

** 스프링은 빈을 생성할 때 특별한 설정이 없으면 기본 생성자를 이용하여 객체를 생성

 

싱글톤 패턴방식으로 사용되게 된다면(생성자에게 접근할 수 없을 경우)

: <bean> 태그의 속성 중 factory-merthod 속성을 사용

 

생성자를 private으로 설정하여 외부에서 접근 못하게

 

 

 

 


의존 관계 설정

: 객체간의 의존 관계는 생성자와 프로퍼티 설정의 2가지 방식으로 지정

 

1) 생성자 방식

먼저 JdbcDao의 객체를 생성

 

다음으로 JdbcService의 객체를 생성하는데 이때 전달할 값은 JdbcDao를 전달

설정 파일을 통한 DI(의존성 주입)
1.생성자
 <bean ~~~~~>
	<constructor-arg></constructor-arg>
 </bean>

** 만약 생성자를 통해 객체를 주입할 경우
<constructor-arg ref="객체명"></constructor-arg>
또는
<constructor-arg>
	<ref bean="객체명" />
</constructor-arg>

생성자를 통해 일반데이터를 주입할 경우
<constructor-arg value="데이터"></contructor-arg>
또는
<constructor-arg>
	<value type="데이터타입">데이터</value>
</constructor-arg>

** 빈(객체)를 주입(전달)받는 경우는 <consturctor-arg ref="..." />를 사용하며
기본 데이터 타입이나 String타입이라면 <consturctor-arg value="..." />를 사용한다. 
즉, ref 대신 value를 사용한다.

결과

 

2) 프로퍼티 설정 방식

:set~~~ 를 형태의 메서드를 통하여 필요한 객체와 값을 전달

 

빈(객체)을 주입 받을 경우에는 ref 태그을 쓰고,

기본 데이터 타입 및 String 타입의 경우value 태그를 사용

 

 

 

 

3) XML 네임스페이스를 이용한 프로퍼티 설정

: > XML 네임스페이스를 이용하면 태그를 사용하지 않고 프로퍼티값을 설정할 수 있다.

 

XML파일에 네임스페이스를 사용하기 위한 코드 추가

xmlns:p="http://www.springframework.org/schema/p"

 

** p로 값을 설정 하였으므로 p:프로퍼티이름 p:프로퍼티이름-ref=""속성 사용하여 bean객체를 프로퍼티에 전달

<beans~~~~ 태그 내부에 xmlns:p~~~를 추가>
	<bean p:변수명-ref="객체명">
	</bean>
</beans>

 

 


빈 객체의 범위

: 스프링은 기본적으로 하나의 빈 설정에 대해 1개의 객체만의 생성

빈객체를 생성할 때 scope=""속성을 따로 주지않는다면 singleton 으로 기본값을 가진다.

 

scope 속성값

 


빈의 라이프 사이클

: (커스텀 초기화/소멸 메서드, BeanNameAware/ApplicationContextAware 인터페이스)

 

1. init-method : 커스텀 초기화 메서드

2. destroy-method : 커스텀 소멸 메서드

3. BeanNameAware 인터페이스

=> 빈 객체가 자기 자신의 이름을 알아야 하는 경우에 사용.

=> 빈 클래스가 BeanNameAware를 구현한 경우 컨테이너는 setBeanName( )메서드를 호출하여 빈 객체의 이름을 전달. => setBeanName(String arg) : 객체가 생성될 때 해당 객체(빈)의 id(혹은 name)값을 전달 받는 메서드

 

LifeBean.java

public interface LifeBean {
	void lifeMethod();
}

 

LifeBeanImpl.java

public class LifeBeanImpl implements LifeBean, BeanNameAware, BeanFactoryAware{
	private String beanName;
	private BeanFactory beanFactory;
	public void begin(){
		System.out.println("사용자 초기화 메서드");
	}
	
	public void end(){
		System.out.println("사용자 소멸 메서드");
	}
	@Override
	public void lifeMethod(){
		System.out.println("사용자 소멸 메서드");
		System.out.println("beanName : " + beanName);		
	}  
	
	//빈 객체가 자기 자신의 이름을 알아야 할 경우에 사용된다.
	//객체가 생성될때 해당 객체의 id값을 전달(주입)받는 메서드
	public void setBeanName(String beanName){
		this.beanName = beanName;
	}
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
			this.beanFactory = beanFactory;	
	}
}

 

life.xml(XML파일) 중

<bean id="lifeBean" class="life.exam01.LifeBeanImpl" init-method="begin" destory-method="end">
	<!-- init이나 destory 내부의 변수명은 임의로 변경가능(단, 설정한 값에 맞춰 이름을 맞춤) -->
</bean>

스프링 컨테이너가 빈을 생성시 init-method="...", 종료(제거)시 destroy-method="..."의 설정 값을 실행

 

 

마찬가지로 메인 메서드를 통하여 실행

 

 

ApplicationContextAware 인터페이스

=> 빈 객체가 필요한 객체를 스프링 컨테이너(BeanFactory나 ApplicationContext)로부터 직접 사용해야 할 경우

 

InitializingBean/DisposableBean 인터페이스

=> spring framework에서 제공하는 초기화 메서드

=> 객체를 생성하고 프로퍼티를 초기화하고, 컨테이너 관련 설정을 완료한 뒤에 호출되는 메서드

 

DisposableBean 인터페이스

=> spring framework에서 제공하는 소멸 메서드

=> 빈 객체를 컨테이너에서 제거하기 전에 호출하여 빈 객체가 자원을 반납할 수 있도록 함

 

 


728x90
반응형