[Java] @PostConstruct, @Predestroy

김형진·2023년 3월 30일
0

실무 중에는 sdk를 이용하여 외부시스템에 접속해 api콜해야하는 경우가 종종 (혹은 자주) 있는데
이전에는 외부시스템에 api콜 할 때마다 connect와 disconnect를 반복했다.

그러다 Connection객체를 어플리케이션 생명주기 내내 살려두고 필요할 때마다 갖다 써야 하는 경우가 있었는데

Connection객체 생성이야 @PostConstruct 어노테이션을 이용해 어플리케이션 시작 시 미리 잘 생성해주었지만
어플리케이션 종료 시 disconnect를 해줘야 하는데, 그런 코드가 어디에도 없었다.

이렇게 두면 어플리케이션 종료 시 자원반납이 이뤄지지 않아 누수가 일어난다.

해결책은 간단하다.

@PreDestroy 어노테이션을 사용하여 어플리케이션 종료 시 disconnect될 수 있도록 하면 된다.

@PreDestroy
public void disconnect(){
	...
}

이 밖에도, 어플리케이션 시작과 종료 시 메소드가 자동으로 실행되도록 할 수 있는 방법들이 있다.

  1. InitializingBean, DisposableBean 인터페이스를 구현하여 afterPropertiesSet메소드와 destroy를 Overriding한다. (상황에 맞게 필요한 인터페이스만 구현)

        public class ConnectManager implements InitializingBean, DisposableBean  {
    
            @Override
            public void afterPropertiesSet() throws Exception {
    
            }
    
            @Override
            public void destroy() throws Exception {
    
            }
    
        }

    단 springframework에서 제공하는 인터페이스이기 때문에 코드가 스프링 의존적일 수 밖에 없다는 문제가 있어 사용은 권장되지 않는다.

  2. Bean등록 시 초기화, 종료 메소드 지정

        @Configuration
        public class AppConfig  {
    
            @Bean(initMethod = "connect", destroyMethod = "disConnect")
            public ConnectManager connectManager(){
                return new ConnectManager();
            }
    
        }

    수동 빈 등록 시 위와 같이 대상 클래스의 메소드 명을 입력하여 초기화와 종료 메소드를 지정해줄 수 있다.
    코드를 직접 수정하지 않아도 초기화, 종료 메소드를 지정할 수 있으므로 코드 수정이 불가한 라이브러리의 초기화 , 종료 메소들르 지정해주고 싶은 경우 사용할 수 있다.

<추가>
@PostConstruct 와 @PreDestroy는 Java에서 제공하는 기능이다. Spring이 아닌 다른 컨테이너 환경에서도 동일하게 적용된다.

profile
히히

0개의 댓글