[Java] 객체 생성 시 딱 한 번만 실행되는 코드, 어디에 둘까? (생성자 vs @PostConstruct)

    Spring에서는 클래스가 생성된 후 딱 한 번만 실행되는 초기화 코드를 작성할 때, 생성자@PostConstruct를 많이 사용합니다.

    하지만, 이 두 방식은 실행 시점과 목적이 다르기 때문에, 언제 어떤 것을 사용해야 하는지 이해하는 것이 중요합니다.

    생성자와 @PostConstruct의 차이와 사용 시점을 비교해보겠습니다.


    01. 기본 생성자에서 super() 호출

    @Service
    public class MyService {
        public MyService() {
            super(); // 부모 클래스의 기본 생성자 호출
            System.out.println("생성자 호출");
        }
    }
    • Java는 기본적으로 자식 클래스의 생성자에서 super()를 명시하지 않아도 자동으로 호출
    • 그래서 기본 생성자에선 super();는 생략 가능
    • 생성자는 객체가 생성될 때 실행
    • 부모 클래스에 기본 생성자가 없고, 매개 변수를 요구하는 생성자만 존재한다면, 반드시 super(인자) 형태로 명시적으로 호출해야 하며, 그렇지 않다면 컴파일 에러 발생

     

    02. @PostConstruct 를 활용한 초기화

    @Service
    public class MyService {
    
        public MyService() {
            System.out.println("생성자 호출");
        }
    
        @PostConstruct
        public void init() {
            System.out.println("PostConstruct 메서드 호출");
        }
    }
    • 빈이 생성된 후, 즉 의존성 주입이 완료된 후 한번만 실행
    • 메서드는 반환값이 void이고 매개변수가 없어야 하며, 한 클래스에 하나만 사용해야 함
    • 주로 초기 설정, 데이터 로딩, 초기 로그 출력 등에 사용
    • Spring이 알아서 자동 호출하므로, 직접 호출할 필요 없음

     

    03. 생성자 VS @PostConstruct 비교

    구분 생성자 @PostConstruct
    실행 시점 ▪️빈 생성 시 바로 실행 ▪️ 빈 생성 후 의존성 주입 완료 후 실행
    DI 의존성 주입 여부 ▪️ 주입되기 전 ▪️ 주입 완료 후
    용도 ▪️ 필수 파라미터 설정, 객체 기본값 초기화 등 ▪️ 외부 의존 객체에 의존하는 초기화 로직
    제약 ▪️ 오버로딩 가능, 매개변수 사용 가능 ▪️ void 반환, 매개변수 없음, 1개만 사용
    적합한 상황 ▪️ 단순 내부 초기화 ▪️ Spring 컨텍스트와 관련된 작업에 더 적합
    (예 : @Autowired 된 빈 사용)

     

     

    🖊️ 마무리 요약

    단순 내부 초기화만 필요하다면 → 생성자

    @Autowired, @Value 등 DI가 필요한 작업이 있다면 → @PostConstruct

    댓글