[Spring] @PostConstruct와 @PreDestroy 어노테이션

@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 어노테이션을 쓰면 아름답게 처리 가능하다.

참고

반응형

댓글

Designed by JB FACTORY