Java 애플리케이션 개발에서 종종 초기화 작업이 필요합니다. 특히 Spring 프레임워크와 같은 의존성 주입 기반의 프레임워크를 사용할 때, 의존성이 주입된 후 특정 초기화 로직을 실행해야 하는 경우가 많습니다.
이러한 상황에서 유용하게 사용할 수 있는 도구가 바로 @PostConstruct 어노테이션입니다.
@PostConstruct 란❓
@PostConstruct 어노테이션이 붙은 메서드는 의존성 주입이 완료된 후 자동으로 호출됩니다.
주로 빈(Bean)의 초기화 작업을 처리하는 데 사용되며, 주입된 의존성을 기반으로 추가적인 설정이나 리소스 초기화 작업을 할 수 있습니다.
@PostConstruct의 동작 방식
@PostConstruct 어노테이션가 붙은 메서드는 빈의 생명주기에서 의존성 주입이 완료된 직후 호출됩니다. 이를 통해 의존성이 모두 주입된 상태에서 초기화 작업을 수행할 수 있습니다.
@PostConstruct 의 사용 이유
의존성 주입 후 초기화
- 의존성 주입이 완료된 후에야 비로소 특정 초기화 작업이 가능한 경우가 있습니다.
- 예를 들어, 주입된 의존성을 사용하여 설정값을 초기화하거나, 연결을 설정해야 하는 경우 @PostConstruct를 사용합니다.
- 예시: 데이터베이스 연결이나 외부 API 클라이언트를 생성하는 작업을 의존성이 모두 주입된 후에 실행해야 할 때.
빈 초기화 로직 분리
- 객체의 생성자에서
복잡한 초기화 로직을 수행하는 대신, @PostConstruct를 사용해 초기화 로직을 분리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 높이는 데 도움이 됩니다.
리소스 설정 및 초기화
- 특정 리소스(파일, 네트워크 연결, 캐시 등)를 빈이 생성될 때 초기화해야 하는 경우에 @PostConstruct를 사용하여 초기 설정 작업을 수행할 수 있습니다.
- 예시: 애플리케이션이 시작될 때 특정 설정 파일을 읽거나 캐시를 미리 로드하는 작업.
bean 생애주기 동안 한번만 수행
- @PostConstruct 메서드는 빈 생애주기에서 단 한 번만 실행되도록 보장합니다. 이는 애플리케이션이 시작될 때 한 번만 실행되므로, 빈이 여러 번 초기화되는 것을 방지하며,
불필요한 초기화 요청이나중복 작업을 피할 수 있습니다.
@PostConstruct 사용 예시 1
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;
@Component
public class MyService {
@PostConstruct
public void init() {
// 초기화 작업 수행
System.out.println("MyService 빈이 초기화되었습니다.");
}
}
위 코드에서 MyService 클래스는 Spring에서 관리되는 빈으로, init() 메서드는 @PostConstruct 어노테이션 덕분에 의존성 주입이 완료된 후 자동으로 호출됩니다. 이를 통해 필요한 초기화 작업을 안전하게 수행할 수 있습니다.
@PostConstruct 사용 예시 2
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Base64;
@Component
public class JwtTokenProvider {
@Value("${jwt.secret.key}") // 외부 설정에서 주입된 Base64 인코딩된 시크릿 키
private String secretKey;
private Key key;
private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
@PostConstruct
public void init() {
byte[] decodedKey = Base64.getDecoder().decode(secretKey);
key = Keys.hmacShaKeyFor(decodedKey);
}
// JWT 토큰 생성 및 검증 관련 메서드들...
}
위 코드는 Jwt 관련 클래스입니다.
secretKey 필드는 외부 설정(application.properties 또는 application.yml)에서 가져온 값으로, 이 값이 주입된 후에만 Key 객체를 올바르게 생성할 수 있습니다.
따라서 @PostConstruct 어노테이션을 사용하여 이 초기화 작업이 의존성 주입이 완료된 후에 실행되도록 보장합니다.
@PostConstuct 사용 결과
- 안정적인 초기화
- @PostConstruct 덕분에 secretKey가 안전하게 주입된 후, 즉 모든 의존성이 준비된 상태에서 Key 객체를 생성할 수 있게 됩니다.
- 이를 통해 초기화 과정에서 발생할 수 있는
잠재적인 오류(예: secretKey가 주입되지 않은 상태에서 Key 객체를 생성하려는 시도)를 방지합니다.
- 한 번만 실행되는 초기화 보장
- @PostConstruct 메서드는 애플리케이션이 시작될 때 한 번만 실행되므로, Key 객체의 초기화 작업이
중복으로 수행되지 않음을 보장합니다.
- @PostConstruct 메서드는 애플리케이션이 시작될 때 한 번만 실행되므로, Key 객체의 초기화 작업이
- 코드의 가독성 및 유지보수성 향상
- 생성자에서 처리할 수 없는 복잡한 초기화 로직을 @PostConstruct로 분리함으로써, 코드가 더 명확하고 유지보수하기 쉬워집니다.
@PostConstruct는 Java 애플리케이션에서 빈의 초기화 작업을 안전하게 수행할 수 있도록 돕는 강력한 도구입니다.
이를 통해 의존성 주입이 완료된 후에만 초기화 로직이 실행되므로, 초기화 시 발생할 수 있는 잠재적인 오류를 방지하고 코드의 가독성 및 유지보수성을 크게 향상시킬 수 있습니다.
애플리케이션이 시작될 때 단 한 번만 실행되는 특성 덕분에 불필요한 중복 작업을 피하고, 안정적인 시스템 운영을 보장할 수 있습니다.
'Framework > Spring\Spring boot' 카테고리의 다른 글
[Spring boot] Cache Manager와 @Cacheable 어노테이션 이해하기 (0) | 2024.09.02 |
---|---|
[Spring boot] @Pattern 어노테이션: 정규 표현식으로 입력 검증 간편하게 하기 (0) | 2024.08.27 |
[Spring Boot] Spring Boot에서 데이터 검증: @Valid와 @Column(nullable = false)의 차이와 함께 사용하는 방법 (0) | 2024.08.15 |
[Spring boot] @Builder 어노테이션의 장점 (0) | 2024.08.09 |
[Spring Cloud] Zipkin을 이용한 분산 추적: 요청 흐름과 성능 모니터링 (0) | 2024.08.07 |