본문 바로가기
Spring framework

[Spring] @Value 어노테이션 사용시 Access key cannot be null

by ungyuun 2023. 12. 2.

Amazon S3의 설정값을 application-properties에 지정하고, S3Config 클래스를 작성했다.

@Configuration
@Getter
public class S3Config {
    @Value("${ncloud.endPoint}")
    private String endPoint;
    @Value("${ncloud.regionName}")
    private String regionName;
    @Value("${ncloud.accessKey}")
    private String accessKey;
    @Value("${ncloud.secretKey}")
    private String secretKey;
    @Value("${ncloud.bucketName}")
    private String bucketName;

    final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
            .build();
}

 

 Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Access key cannot be null.

 

컴파일시 이런 오류가 나오는데, @Value 어노테이션을 통해 필드 값을 가져왔는데 생성자 주입시점에 필드가 null이라는것이다.

@Value 필드 주입의 경우는 스프링 빈이 생성자로 빈 생성 후 의존관계 주입시에 필드값이 초기화가 되므로 스프링의 빈 생명주기로 인하여 null 값이 들어갈수 밖에 없다. 따라서 오류가 생긴것이고 이후 다음과 같이 코드를 고쳤다.

 


@Configuration
@Getter
public class S3Config {

    private final String endPoint;
    private final String regionName;
    private final String accessKey;
    private final String secretKey;
    private final String bucketName;
    private final AmazonS3 s3;

    public S3Config(
            @Value("${ncloud.endPoint}") String endPoint,
            @Value("${ncloud.regionName}") String regionName,
            @Value("${ncloud.accessKey}") String accessKey,
            @Value("${ncloud.secretKey}") String secretKey,
            @Value("${ncloud.bucketName}") String bucketName) {
        this.endPoint = endPoint;
        this.regionName = regionName;
        this.accessKey = accessKey;
        this.secretKey = secretKey;
        this.bucketName = bucketName;
        this.s3 = AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
                .build();
    }
}

 

스프링 컨테이너가 빈을 생성하는 시점에 생성자 파라미터에 @Value를 사용하여 프로퍼티의 값을 주입받고, 그 값으로 필드를 초기화한다. 이렇게 하면 생성자 주입시점에 필드가 null이 아니게 된다.