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이 아니게 된다.
'Spring framework' 카테고리의 다른 글
[Spring] st_distance_sphere을 사용하여 위치기반 조회 구현 (0) | 2023.12.17 |
---|---|
[Spring] Dependency Injection (의존성 주입) 정리 (1) | 2023.10.01 |
[Spring] @Controller와 @RestController의 차이 (0) | 2023.09.06 |