Skip to content

Commit 2b04ece

Browse files
committed
refactor: MinioProperties 도입 및 Presigned URL Content-Type 제한 추가
1 parent e76ef37 commit 2b04ece

4 files changed

Lines changed: 41 additions & 25 deletions

File tree

src/main/java/com/semosan/api/common/config/MinioConfig.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,25 @@
55
import io.minio.MakeBucketArgs;
66
import io.minio.MinioClient;
77
import jakarta.annotation.PostConstruct;
8+
import lombok.RequiredArgsConstructor;
89
import lombok.extern.slf4j.Slf4j;
9-
import org.springframework.beans.factory.annotation.Value;
10+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1011
import org.springframework.context.annotation.Bean;
1112
import org.springframework.context.annotation.Configuration;
1213

1314
@Slf4j
1415
@Configuration
16+
@RequiredArgsConstructor
17+
@EnableConfigurationProperties(MinioProperties.class)
1518
public class MinioConfig {
1619

17-
@Value("${minio.endpoint}")
18-
private String endpoint;
19-
20-
@Value("${minio.access-key}")
21-
private String accessKey;
22-
23-
@Value("${minio.secret-key}")
24-
private String secretKey;
20+
private final MinioProperties properties;
2521

2622
@Bean
2723
public MinioClient minioClient() {
2824
return MinioClient.builder()
29-
.endpoint(endpoint)
30-
.credentials(accessKey, secretKey)
25+
.endpoint(properties.endpoint())
26+
.credentials(properties.accessKey(), properties.secretKey())
3127
.build();
3228
}
3329

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.semosan.api.common.config;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
5+
@ConfigurationProperties(prefix = "minio")
6+
public record MinioProperties(
7+
String endpoint,
8+
String accessKey,
9+
String secretKey,
10+
String publicUrl
11+
) {}

src/main/java/com/semosan/api/domain/image/service/ImageService.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package com.semosan.api.domain.image.service;
22

3+
import com.semosan.api.common.config.MinioProperties;
34
import com.semosan.api.common.exception.GeneralException;
45
import com.semosan.api.common.status.ErrorStatus;
56
import com.semosan.api.domain.image.dto.response.PresignedUrlResponse;
67
import io.minio.GetPresignedObjectUrlArgs;
78
import io.minio.MinioClient;
89
import io.minio.http.Method;
910
import lombok.RequiredArgsConstructor;
10-
import org.springframework.beans.factory.annotation.Value;
1111
import org.springframework.stereotype.Service;
1212

13+
import java.util.Map;
1314
import java.util.Set;
1415
import java.util.UUID;
1516
import java.util.concurrent.TimeUnit;
@@ -20,14 +21,15 @@ public class ImageService {
2021

2122
public static final Set<String> ALLOWED_BUCKETS = Set.of("reviews", "mountains", "restaurants", "posts", "semofeed");
2223
private static final Set<String> ALLOWED_EXTENSIONS = Set.of(".jpg", ".jpeg", ".png", ".webp");
24+
private static final Map<String, String> CONTENT_TYPE_MAP = Map.of(
25+
".jpg", "image/jpeg",
26+
".jpeg", "image/jpeg",
27+
".png", "image/png",
28+
".webp", "image/webp"
29+
);
2330

2431
private final MinioClient minioClient;
25-
26-
@Value("${minio.endpoint}")
27-
private String endpoint;
28-
29-
@Value("${minio.public-url}")
30-
private String publicUrl;
32+
private final MinioProperties minioProperties;
3133

3234
public PresignedUrlResponse generatePresignedUrl(String bucket, String filename) {
3335
validateBucket(bucket);
@@ -37,17 +39,19 @@ public PresignedUrlResponse generatePresignedUrl(String bucket, String filename)
3739
String key = UUID.randomUUID() + extension;
3840

3941
try {
42+
String contentType = CONTENT_TYPE_MAP.get(extension.toLowerCase());
4043
String uploadUrl = minioClient.getPresignedObjectUrl(
4144
GetPresignedObjectUrlArgs.builder()
4245
.method(Method.PUT)
4346
.bucket(bucket)
4447
.object(key)
4548
.expiry(10, TimeUnit.MINUTES)
49+
.extraHeaders(Map.of("Content-Type", contentType))
4650
.build()
4751
);
4852

49-
uploadUrl = uploadUrl.replace(endpoint, publicUrl);
50-
String imageUrl = publicUrl + "/" + bucket + "/" + key;
53+
uploadUrl = uploadUrl.replace(minioProperties.endpoint(), minioProperties.publicUrl());
54+
String imageUrl = minioProperties.publicUrl() + "/" + bucket + "/" + key;
5155

5256
return new PresignedUrlResponse(uploadUrl, imageUrl);
5357
} catch (Exception e) {

src/main/resources/application.yaml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ spring:
1010
username: ${DB_USERNAME}
1111
password: ${DB_PASSWORD}
1212
driver-class-name: org.postgresql.Driver
13+
data:
14+
redis:
15+
host: ${REDIS_HOST}
16+
port: ${REDIS_PORT}
1317
jpa:
1418
hibernate:
1519
ddl-auto: update
@@ -30,11 +34,6 @@ kakao:
3034
client-secret: ${KAKAO_CLIENT_SECRET}
3135
admin-key: ${KAKAO_ADMIN_KEY}
3236

33-
data:
34-
redis:
35-
host: ${REDIS_HOST}
36-
port: ${REDIS_PORT}
37-
3837
tracking:
3938
stream-key: ${TRACKING_STREAM_KEY}
4039
consumer-group: ${TRACKING_CONSUMER_GROUP}
@@ -48,3 +47,9 @@ springdoc:
4847
swagger-ui:
4948
path: /swagger-ui.html
5049
default-flat-param-object: true
50+
51+
minio:
52+
endpoint: ${MINIO_ENDPOINT}
53+
access-key: ${MINIO_ACCESS_KEY}
54+
secret-key: ${MINIO_SECRET_KEY}
55+
public-url: ${MINIO_PUBLIC_URL}

0 commit comments

Comments
 (0)