728x90

 

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로 분리함으로써, 코드가 더 명확하고 유지보수하기 쉬워집니다.

 


@PostConstruct는 Java 애플리케이션에서 빈의 초기화 작업안전하게 수행할 수 있도록 돕는 강력한 도구입니다.

 

이를 통해 의존성 주입이 완료된 후에만 초기화 로직이 실행되므로, 초기화 시 발생할 수 있는 잠재적인 오류를 방지하고 코드의 가독성유지보수성을 크게 향상시킬 수 있습니다.

 

애플리케이션이 시작될 때 단 한 번만 실행되는 특성 덕분에 불필요한 중복 작업을 피하고, 안정적인 시스템 운영을 보장할 수 있습니다.