본문 바로가기
Programming/Spring Boot

초기화 및 cleanup 작업 처리(@PostConstruct & @PreDestroy)

by yoon9i 2024. 7. 2.

10. 초기화 및 cleanup 작업 처리
https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framework-reference/core.html#beans-factory-lifecycle

1> 개요
- 빈(bean)이 생성되고 의존성 주입(DI) 이후의 초기화 작업 및 자원반납(cleanup)작업처리가 가능하도록 지원.

2> @PostConstruct 와 @PreDestroy 이용
ex>
    @PostConstruct
    public void init() {
      // 초기화 작업
    }

    @PreDestroy
    public void clean() {
      // cleanup 작업
    }

 

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

// Spring Bean
// @Configuration // 생성됨
// @Component // 생성됨
// @Repository // 생성됨
//@Service // 생성됨
// @Controller // 생성됨

//@Repository
//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("dao")
public class DeptDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	public List<String> list() {
		return Arrays.asList("홍길동","이순신");
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	DeptDAO deptDAO;

	// 생성자 주입(의존성 주입)
	public DeptServiceImpl(DeptDAO deptDAO) {
		logger.info("logger: {}", "DeptServiceImpl 생성 및 의존성 주입");
		this.deptDAO = deptDAO;
	}

	@Override
	public List<String> list() {
		// TODO Auto-generated method stub
		return deptDAO.list();
	}
	
	@PostConstruct
	public void init() {
		logger.info("logger: {}", "@PostConstruct 생성자");
	}
	
	@PreDestroy
	public void clean() {
		logger.info("logger: {}", "@PreDestroy 생성자");
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

'Programming > Spring Boot' 카테고리의 다른 글

AOP(Aspect Oriented Programming: 관점 지향 프로그래밍)  (1) 2024.07.02
프로파일(Profile)  (0) 2024.07.02
빈의 scope  (0) 2024.07.02
생성된 빈 접근방법  (0) 2024.07.02
의존성 설정  (0) 2024.07.02