@PostConstruct와 @PreDestroy Annotation 사용하기
1. 언제 쓰는가
최근에 개발하다가 딱 한번만 받아오면 되는 값을 사용 시 마다 요청을 새로 호출하는 실수를 했다. 아니 누가 이따위로 개발했는가 하고 git history를 뒤져보았더니 범인은 다름아닌 과거의 나였다. 따라서 잊지 않기 위해 @PostConstruct
에 대해 기록해두고자 한다. @PostConstruct
를 사용하면 WAS 가 뜰 때 한번만 기본값을 세팅해두고 두고두고 쓸 수 있다.
@PostConstruct
는 WAS 가 뜰 때 bean이 생성된 다음 딱 한번만 실행된다.@PreDestroy
는 컨테이너에서 객체를 제거하기 전에 실행된다.
2. @PostConstruct
Spring은 bean을 초기화 한 이후에 @PostConstruct
을 한번만 호출한다. 즉 @PostConstruct
는 WAS 가 뜰 때 bean이 생성된 다음 딱 한번만 실행된다. 따라서 @PostConstruct
를 사용하여 기본 사용자라던가, 딱 한번만 등록하면 되는 key 값 등을 등록하여 사용할 수 있다.
@Component
public class DbInit {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void init() {
// 초기화 처리
User admin = new User("admin", "admin password");
User normalUser = new User("user", "user password");
userRepository.save(admin, normalUser);
}
}
위의 예제는 UserRepository를 초기화 한다음에 @PostConstruct
메소드를 실행한다.
3. @PreDestroy
@PreDestroy
역시 Spring이 애플리케이션 컨텍스트에서 bean을 제거하기 직전에 단 한 번만 실행된다.
@Component
public class UserRepository {
private DbConnection dbConnection;
@PreDestroy
public void preDestroy() {
// 자원 반환 등 종료 처리
dbConnection.close();
}
}
4. java 9 이상에서는 dependency 추가
Java 9 이상에서는 deprecated 되어 별도의 dependency 를 추가하여 사용해야한다.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
5. 마치며
단 한번만 실행하면 되는 메소드라면 @PostConstruct
and @PreDestroy
어노테이션을 쓰면 아름답게 처리 가능하다.
참고
반응형