티스토리 뷰

Spring

@PostConstruct

Jodu 2016. 9. 3. 12:33
반응형

이번에 @PostContstruct 어노테이션을 사용하게 될 일이 있었다.

이 어노테이션은 스프링에서 제공하는 어노테이션은 아니며 용도는 다음과 같이 사용할 수 있다.


@Autowired어노테이션에 DI되는 객체를 사용해서 특정 객체를 만들고 싶은 경우 생성자에서 해당 객체들을 이용해서 인스턴스화 하려고 하면 에러를 발생 시킨다. 이유는 해당 클래스의 생성자를 호출 할 때 @Autowired되는 객체는 DI가 이루어 지지 않은 상태! 그래서 NullPointException을 발생시킨다.


이때 사용할 수 있는 것이 @PostConstruct이다.


처음 말했던 예를 나타내는 소스코드들이다. 



TargetA라는 클래스가 컴포넌트 어노테이션에 의해 스프링 컨테이너에 bean으로 등록이 되게 된다.




TargetB 클래스의 기능은 TargetA 인스턴스를 받아 완성되게 된다.


해당 두 클래스들의 인스턴스를 받아서 동작하게 될 TargetService의 예이다. 처음에는 생성자로 TargetB 인스턴스를 만들어 내고 다음으로 @PostConstruct 어노테이션을 사용해 보도록 한다.


targetService는 컴포넌트 빈으로 등록된 targetA 클래스의 인스턴스를 DI받고 해당 인스턴스를 TargetB 인스턴스 생성에 사용을 한다. 문제는 여기서 발생한다.

위에서 설명했듯이 TargetService의 생성자가 호출되는 시점에는 TargetA의 인스턴스가 주입되지 않은 상황이다. 


그래서 다음과 같은 예외 문구를 보게 된다.


이 문제를 해결하기 위해서 사용하는 어노테이션이 @PostConstruct 인것이다.


이 어노테이션의 역할은 해당 클래스가 인스턴스화가 되는 즉시 동작시키고 싶은 메소드에 선언을 해주면 해당 메소드의 비지니스로직이 동작하게 되는 것이다.

그럼 @PostConstruct 어노테이션을 적용해본다.


기존의 TargetService의 생성자에서 TargetB 클래스를 인스턴스화한 부분을 없애고 @PostContstruct어노테이션 메소드를 사용해서 TargetB 클래스를 인스턴스화 한다.



위 와 같이 하고 사이트로 들어가면 아래와 같이 정상적으로 결과가 나타나는 것을 볼 수 있다.

[ 정리 ]


내가 사용했던 이유는 특정자원을 특정 서비스 메소드들에서 지속적으로 참조하는 경우가 있어서 사용하게 되었다. 보통 위의 예에서 처럼 클래스 간의 객체 생성간에 @PostConstruct 사용은 불필요할거 같지만 예를 만들기 위해 사용하였다. 또한 @PostConstruct는 빈 생성시 한번만 동작하므로 계속해서 갱신되는 자원을 참조용으로 만들때는 사용하면 안된다.

 


반응형

'Spring' 카테고리의 다른 글

Spring HttpSessionListener  (2) 2017.03.25
Spring Security Custom EntryPoint  (0) 2016.12.28
JUnit 테스트 시 Spring 구동 및 Autowired하는 방법  (0) 2016.11.15
Spring Bean Scope  (0) 2016.10.11
SVG 이미지 변환 서버 만들기  (0) 2016.09.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함