Spring

220114 자바 스프링 프레임워크 - 설정 및 구현

행인데어 2022. 1. 14. 00:35

설정 및 구현

11강 생명주기(Life Cycle)

11-1 : 스프링 컨테이너 생명주기

main클래스에서

- 스프링 컨테이너 생성: GenericXmlApplicationContext를 이용해서 스프링 컨테이너 초기화(생성)

GenericXmlApplicationContext ctx = 
		new GenericXmlApplicationContext("classpath:appCtx.xml");

- getBean()를 이용한 빈(Bean)객체 이용

BookRegisterService bookRegisterService = 
		ctx.getBean("bookRegisterService", BookRegisterService.class);

- close()를 이용한 스프링 컨테이너 종료

ctx.close();

 

** 스프링 설정 파일에서 자동주입을 해주기 위해 appCtx.xml에 <context:annotation-config /> 등록한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	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 
 		http://www.springframework.org/schema/context 
 		http://www.springframework.org/schema/context/spring-context.xsd">
 		
 		<context:annotation-config />
 		
 		<bean id="bookDao" class="com.brms.book.dao.BookDao"/>
 		<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService"/>
 		<bean id="bookSearchService" class="com.brms.book.service.BookSearchService"/>
 		
 		<bean id="memberDao" class="com.brms.member.dao.MemberDao"/>
 		<bean id="memberRegisterService" class="com.brms.member.service.MemberRegisterService"
 		init-method="initMethod" destroy-method="destroyMethod"/>
 		<bean id="memberSearchService" class="com.brms.member.service.MemberSearchService"/>

</beans>

** 인터페이스 혹은 bean의 속성 이용은 개인 취향차이다.

 

11-2 : 빈(Bean) 객체 생명주기

빈(Bean)객체의 생명주기는 스프링 컨테이너의 생명주기와 같이 함

해당하는 bean객체가 생성되는 시점과 소멸될때 특정한 작업을 할 수 있는 방법
1. interface 이용

2. 속성을 이용해서 속성값과 똑같은 method를 만들어줌(메모리에서 객체가 빠져나갈때 소멸된다고 함)

public class BookRegisterService implements InitializingBean, DisposableBean {

	@Autowired
	private BookDao bookDao;
	
	public BookRegisterService() { }
	
	public void register(Book book) {
		bookDao.insert(book);
	}
	
	@Override
	public void afterPropertiesSet() throws Exception {   //InitializingBean에서 나옴
		System.out.println("bean 객체 생성");	
	}

	@Override 
	public void destroy() throws Exception {   //DisposableBean에서 나옴
		System.out.println("bean 객체 소멸");
		
	}
}

 

11-3 : init-method, destroy-method 속성

public class BookRegisterService {
	@Autowired
	private BookDao bookDao;
	
	public BookRegisterService() { }
	
	public void register(Book book) {
		bookDao.insert(book);
	}
	
 	public void initMethod() {         //생성시점
		System.out.println("BookRegisterService 빈(Bean)객체 생성 단계");
	}
	
	public void destroyMethod() {     //소멸시점
		System.out.println("BookRegisterService 빈(Bean)객체 소멸 단계");
	}
}

 

12-1강 어노테이션을 이용한 스프링 설정 - 1

12-1-1 : XML파일을 Java파일로 변경하기

스프링 파일을 XML이 아닌 java파일에서 어노테이션으로 설정하는 방법

//xml을 대신해서 스프링설정파일로서 스프링 설정파일을 생성할 수 있다고 명시해줘야함
//그게 바로 @Configuration
@Configuration
public class MemberConfig {
	//xml파일에 <bean id="studentDao" class="ems.member.dao.StudentDao" ></bean>을 자바에서 구현

	@Bean   //bean객체를 만들어주겠다
	public StudentDao studentDao() {
		return new StudentDao();
	}

//  xml에서는
//	<bean id="registerService" class="ems.member.service.StudentRegisterService">
//	<constructor-arg ref="studentDao" ></constructor-arg>
//  </bean>
	
	@Bean
	public StudentRegisterService registerService() {
		return new StudentRegisterService(studentDao());   //생성자 parameter에 StudentDao()호출
	}

	
/*	xml에서는 
    <bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
	<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
	<property name="userId" value="scott" />
	<property name="userPw" value="tiger" />
</bean>  */
	
	@Bean
	public DataBaseConnectionInfo dataBaseConnectionInfoDev() {
		DataBaseConnectionInfo infoDev = new DataBaseConnectionInfo();
		infoDev.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
		infoDev.setUserId("scott");
		infoDev.setUserPw("tiger");
		
		return infoDev;
	}
	
......

 

12-2강 어노테이션을 이용한 스프링 설정 - 2

12-2-1 : Java 파일 분리

- 일반적으로 파일을 분리할 때는 기능별로 분류한다.

- 구분 단위는 서비스와 관련된 Dao, 서비스 기능이 모여있는 service, db관련, util들 이런식으로 함

- 한 클래스에 다 모여있었는데 여러 클래스에 기능별로 구분해서 분리함

@Configuration
public class MemberConfig3 {

	@Autowired
	DataBaseConnectionInfo dataBaseConnectionInfoDev;  //자동으로 의존설정(MemberConfig2로부터 생성된 객체가 MemberConfig3에 자동으로 주입됨)
	
	@Autowired
	DataBaseConnectionInfo dataBaseConnectionInfoReal; //자동으로 의존설정(MemberConfig2로부터 생성된 객체가 MemberConfig3에 자동으로 주입됨)
	
    
    .....

- 컨테이너는 딱 하나이고, 그 곳에 모든 Bean객체가 생성된다. 위처럼 MemberConfig3에서 MemberConfig2의 메소드를 호출해야할때, 객체를 일단 만들어주고, Autowired를 이용해서 MemberConfig3에 주입해주고 사용하면 된다.

 

12-2-2 : @Import 어노테이션

@Configuration
@Import({MemberConfig2.class, MemberConfig3.class})
public class MemberConfig1 {