[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