Skip to content

Commit 08e2c87

Browse files
authored
v2.0.10 (#437)
2 parents 443da2d + f1017bd commit 08e2c87

File tree

6 files changed

+80
-112
lines changed

6 files changed

+80
-112
lines changed

.github/workflows/develop_pull_request.yml

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,8 @@ jobs:
2525
- name: Grant execute permission for gradlew
2626
run: chmod +x ./gradlew
2727

28-
- name: Cache SonarCloud packages
29-
uses: actions/cache@v3
30-
with:
31-
path: ~/.sonar/cache
32-
key: ${{ runner.os }}-sonar
33-
restore-keys: ${{ runner.os }}-sonar
34-
3528
- name: Setup Gradle
3629
uses: gradle/gradle-build-action@v2
3730
with:
3831
arguments: check
3932
cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}
40-
41-
- name: SonarCloud scan
42-
env:
43-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
44-
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
45-
run: ./gradlew sonar --info --stacktrace

build.gradle

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ plugins {
44
id 'io.spring.dependency-management' version '1.1.6'
55
id 'com.diffplug.spotless' version '6.21.0'
66
id 'jacoco'
7-
id 'org.sonarqube' version '4.4.1.3373'
87
}
98

109
group = 'com.depromeet'
@@ -67,8 +66,8 @@ dependencies {
6766
// Redis
6867
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
6968

70-
// AWS
71-
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
69+
// AWS S3
70+
implementation 'software.amazon.awssdk:s3:2.26.7'
7271

7372
// Firebase-admin
7473
implementation 'com.google.firebase:firebase-admin:9.2.0'
@@ -114,21 +113,6 @@ def jacocoExcludePatterns = [
114113
"**/config/**"
115114
]
116115

117-
sonar {
118-
properties {
119-
property "sonar.projectKey", "depromeet_10mm-server"
120-
property "sonar.organization", "depromeet-1"
121-
property "sonar.host.url", "https://sonarcloud.io"
122-
property 'sonar.sources', 'src'
123-
property 'sonar.language', 'java'
124-
property 'sonar.sourceEncoding', 'UTF-8'
125-
property 'sonar.exclusions', jacocoExcludePatterns.join(',')
126-
property 'sonar.test.inclusions', '**/*Test.java'
127-
property 'sonar.java.coveragePlugin', 'jacoco'
128-
property 'sonar.coverage.jacoco.xmlReportPaths', jacocoDir.get().file("jacoco/index.xml").asFile
129-
}
130-
}
131-
132116
jacoco {
133117
toolVersion = "0.8.12"
134118
}

src/main/java/com/depromeet/domain/image/application/ImageService.java

Lines changed: 5 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package com.depromeet.domain.image.application;
22

3-
import com.amazonaws.HttpMethod;
4-
import com.amazonaws.services.s3.AmazonS3;
5-
import com.amazonaws.services.s3.Headers;
6-
import com.amazonaws.services.s3.model.CannedAccessControlList;
7-
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
83
import com.depromeet.domain.image.dao.ImageRepository;
94
import com.depromeet.domain.image.domain.Image;
105
import com.depromeet.domain.image.domain.ImageFileExtension;
@@ -23,10 +18,9 @@
2318
import com.depromeet.global.common.constants.UrlConstants;
2419
import com.depromeet.global.error.exception.CustomException;
2520
import com.depromeet.global.error.exception.ErrorCode;
21+
import com.depromeet.global.util.ImageUtil;
2622
import com.depromeet.global.util.MemberUtil;
2723
import com.depromeet.global.util.SpringEnvironmentUtil;
28-
import com.depromeet.infra.config.s3.S3Properties;
29-
import java.util.Date;
3024
import java.util.UUID;
3125
import lombok.RequiredArgsConstructor;
3226
import org.springframework.stereotype.Service;
@@ -38,8 +32,7 @@
3832
public class ImageService {
3933
private final MemberUtil memberUtil;
4034
private final SpringEnvironmentUtil springEnvironmentUtil;
41-
private final S3Properties s3Properties;
42-
private final AmazonS3 amazonS3;
35+
private final ImageUtil imageUtil;
4336
private final MissionRecordRepository missionRecordRepository;
4437
private final MissionRecordTtlRepository missionRecordTtlRepository;
4538
private final ImageRepository imageRepository;
@@ -60,13 +53,8 @@ public PresignedUrlResponse createMissionRecordPresignedUrl(
6053
request.missionRecordId(),
6154
imageKey,
6255
request.imageFileExtension());
63-
GeneratePresignedUrlRequest generatePresignedUrlRequest =
64-
createGeneratePreSignedUrlRequest(
65-
s3Properties.bucket(),
66-
fileName,
67-
request.imageFileExtension().getUploadExtension());
6856

69-
String presignedUrl = amazonS3.generatePresignedUrl(generatePresignedUrlRequest).toString();
57+
String presignedUrl = imageUtil.createPreSignedUrl(fileName, request.imageFileExtension());
7058

7159
missionRecord.updateUploadStatusPending();
7260
missionRecordTtlRepository.deleteById(request.missionRecordId());
@@ -111,13 +99,9 @@ public PresignedUrlResponse createMemberProfilePresignedUrl(
11199
currentMember.getId(),
112100
imageKey,
113101
request.imageFileExtension());
114-
GeneratePresignedUrlRequest generatePresignedUrlRequest =
115-
createGeneratePreSignedUrlRequest(
116-
s3Properties.bucket(),
117-
fileName,
118-
request.imageFileExtension().getUploadExtension());
119102

120-
String presignedUrl = amazonS3.generatePresignedUrl(generatePresignedUrlRequest).toString();
103+
String presignedUrl = imageUtil.createPreSignedUrl(fileName, request.imageFileExtension());
104+
121105
imageRepository.save(
122106
Image.createImage(
123107
ImageType.MEMBER_PROFILE,
@@ -200,26 +184,6 @@ private String createFileName(
200184
+ imageFileExtension.getUploadExtension();
201185
}
202186

203-
private String createUploadImageUrl(
204-
ImageType imageType,
205-
Long targetId,
206-
String imageKey,
207-
ImageFileExtension imageFileExtension) {
208-
return s3Properties.endpoint()
209-
+ "/"
210-
+ s3Properties.bucket()
211-
+ "/"
212-
+ springEnvironmentUtil.getCurrentProfile()
213-
+ "/"
214-
+ imageType.getValue()
215-
+ "/"
216-
+ targetId
217-
+ "/"
218-
+ imageKey
219-
+ "."
220-
+ imageFileExtension.getUploadExtension();
221-
}
222-
223187
private String createReadImageUrl(
224188
ImageType imageType,
225189
Long targetId,
@@ -238,28 +202,6 @@ private String createReadImageUrl(
238202
+ imageFileExtension.getUploadExtension();
239203
}
240204

241-
private GeneratePresignedUrlRequest createGeneratePreSignedUrlRequest(
242-
String bucket, String fileName, String fileExtension) {
243-
GeneratePresignedUrlRequest generatePresignedUrlRequest =
244-
new GeneratePresignedUrlRequest(bucket, fileName, HttpMethod.PUT)
245-
.withKey(fileName)
246-
.withContentType("image/" + fileExtension)
247-
.withExpiration(getPreSignedUrlExpiration());
248-
249-
generatePresignedUrlRequest.addRequestParameter(
250-
Headers.S3_CANNED_ACL, CannedAccessControlList.PublicRead.toString());
251-
252-
return generatePresignedUrlRequest;
253-
}
254-
255-
private Date getPreSignedUrlExpiration() {
256-
Date expiration = new Date();
257-
var expTimeMillis = expiration.getTime();
258-
expTimeMillis += 1000 * 60 * 30;
259-
expiration.setTime(expTimeMillis);
260-
return expiration;
261-
}
262-
263205
private void validateMissionRecordUserMismatch(Mission mission, Member member) {
264206
if (!mission.getMember().getId().equals(member.getId())) {
265207
throw new CustomException(ErrorCode.MISSION_RECORD_USER_MISMATCH);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.depromeet.global.util;
2+
3+
import com.depromeet.domain.image.domain.ImageFileExtension;
4+
import com.depromeet.infra.config.s3.S3Properties;
5+
import java.time.Duration;
6+
import lombok.RequiredArgsConstructor;
7+
import lombok.SneakyThrows;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.stereotype.Component;
10+
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
11+
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
12+
import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest;
13+
14+
@Slf4j
15+
@Component
16+
@RequiredArgsConstructor
17+
public class ImageUtil {
18+
19+
private final S3Presigner s3Presigner;
20+
private final S3Properties s3Properties;
21+
22+
@SneakyThrows
23+
public String createPreSignedUrl(String fileName, ImageFileExtension fileExtension) {
24+
PutObjectPresignRequest request =
25+
PutObjectPresignRequest.builder()
26+
.signatureDuration(Duration.ofMinutes(30))
27+
.putObjectRequest(
28+
builder ->
29+
builder.bucket(s3Properties.bucket())
30+
.key(fileName)
31+
.contentType(getContentType(fileExtension))
32+
.acl(ObjectCannedACL.PUBLIC_READ))
33+
.build();
34+
return s3Presigner.presignPutObject(request).url().toString();
35+
}
36+
37+
private static String getContentType(ImageFileExtension fileExtension) {
38+
return "image/" + fileExtension.getUploadExtension();
39+
}
40+
}
Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,46 @@
11
package com.depromeet.infra.config.s3;
22

3-
import com.amazonaws.auth.AWSCredentials;
4-
import com.amazonaws.auth.AWSStaticCredentialsProvider;
5-
import com.amazonaws.auth.BasicAWSCredentials;
6-
import com.amazonaws.client.builder.AwsClientBuilder;
7-
import com.amazonaws.services.s3.AmazonS3;
8-
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
3+
import java.net.URI;
94
import lombok.RequiredArgsConstructor;
105
import org.springframework.context.annotation.Bean;
116
import org.springframework.context.annotation.Configuration;
7+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
8+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
9+
import software.amazon.awssdk.regions.Region;
10+
import software.amazon.awssdk.services.s3.S3Client;
11+
import software.amazon.awssdk.services.s3.S3Configuration;
12+
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
1213

1314
@Configuration
1415
@RequiredArgsConstructor
1516
public class S3Config {
1617
private final S3Properties s3Properties;
1718

19+
private AwsBasicCredentials getCredentials() {
20+
return AwsBasicCredentials.create(s3Properties.accessKey(), s3Properties.secretKey());
21+
}
22+
23+
private S3Configuration getConfiguration() {
24+
return S3Configuration.builder().pathStyleAccessEnabled(true).build();
25+
}
26+
1827
@Bean
19-
public AmazonS3 amazonS3() {
20-
AWSCredentials credentials =
21-
new BasicAWSCredentials(s3Properties.accessKey(), s3Properties.secretKey());
22-
AwsClientBuilder.EndpointConfiguration endpointConfiguration =
23-
new AwsClientBuilder.EndpointConfiguration(
24-
s3Properties.endpoint(), s3Properties.region());
28+
public S3Client s3Client() {
29+
return S3Client.builder()
30+
.endpointOverride(URI.create(s3Properties.endpoint()))
31+
.credentialsProvider(StaticCredentialsProvider.create(getCredentials()))
32+
.region(Region.of(s3Properties.region()))
33+
.serviceConfiguration(getConfiguration())
34+
.build();
35+
}
2536

26-
return AmazonS3ClientBuilder.standard()
27-
.withEndpointConfiguration(endpointConfiguration)
28-
.withCredentials(new AWSStaticCredentialsProvider(credentials))
37+
@Bean
38+
public S3Presigner s3Presigner() {
39+
return S3Presigner.builder()
40+
.endpointOverride(URI.create(s3Properties.endpoint()))
41+
.credentialsProvider(StaticCredentialsProvider.create(getCredentials()))
42+
.region(Region.of(s3Properties.region()))
43+
.serviceConfiguration(getConfiguration())
2944
.build();
3045
}
3146
}

src/main/resources/application-storage.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ spring:
33
activate:
44
on-profile: "storage"
55
storage:
6-
accessKey: ${STORAGE_ACCESS_KEY:}
7-
secretKey: ${STORAGE_SECRET_KEY:}
8-
bucket: ${STORAGE_BUCKET:}
6+
accessKey: ${STORAGE_ACCESS_KEY:default}
7+
secretKey: ${STORAGE_SECRET_KEY:default}
8+
bucket: ${STORAGE_BUCKET:default}
99
region: ${STORAGE_REGION:ap-northeast-2}
1010
endpoint: ${STORAGE_ENDPOINT:https://s3.ap-northeast-2.amazonaws.com}

0 commit comments

Comments
 (0)