Skip to content

Commit ae42c01

Browse files
Merge pull request #71 from DevKor-github/develop
#68~#70 반영해 운영 서버에 배포
2 parents e8d7533 + 8b3a080 commit ae42c01

20 files changed

Lines changed: 250 additions & 93 deletions

.github/workflows/deploy-to-dev-ec2.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ jobs:
6666
DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \
6767
IAM_ACCESS_KEY="${{ secrets.IAM_ACCESS_KEY }}" \
6868
IAM_SECRET_KEY="${{ secrets.IAM_SECRET_KEY }}" \
69-
BUCKET_NAME="${{ vars.BUCKET_NAME }}" \
70-
CLOUDFRONT_IMAGE_DOMAIN="${{ vars.CLOUDFRONT_IMAGE_DOMAIN }}" \
69+
UPLOAD_IMAGE_BUCKET_NAME="${{ vars.UPLOAD_IMAGE_BUCKET_NAME }}" \
70+
UPLOAD_IMAGE_DOMAIN="${{ vars.UPLOAD_IMAGE_DOMAIN }}" \
71+
DEX_IMAGE_BUCKET_NAME="${{ vars.DEX_IMAGE_BUCKET_NAME }}" \
72+
DEX_IMAGE_DOMAIN="${{ vars.DEX_IMAGE_DOMAIN }}" \
7173
APPLE_CLIENT_ID="${{ secrets.APPLE_CLIENT_ID }}" \
7274
APPLE_TEAM_ID="${{ secrets.APPLE_TEAM_ID }}" \
7375
APPLE_KEY_ID="${{ secrets.APPLE_KEY_ID }}" \

.github/workflows/deploy-to-prod-ec2.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@ jobs:
6666
DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \
6767
IAM_ACCESS_KEY="${{ secrets.IAM_ACCESS_KEY }}" \
6868
IAM_SECRET_KEY="${{ secrets.IAM_SECRET_KEY }}" \
69-
BUCKET_NAME="${{ vars.BUCKET_NAME }}" \
70-
CLOUDFRONT_IMAGE_DOMAIN="${{ vars.CLOUDFRONT_IMAGE_DOMAIN }}" \
69+
UPLOAD_IMAGE_BUCKET_NAME="${{ vars.UPLOAD_IMAGE_BUCKET_NAME }}" \
70+
UPLOAD_IMAGE_DOMAIN="${{ vars.UPLOAD_IMAGE_DOMAIN }}" \
71+
DEX_IMAGE_BUCKET_NAME="${{ vars.DEX_IMAGE_BUCKET_NAME }}" \
72+
DEX_IMAGE_DOMAIN="${{ vars.DEX_IMAGE_DOMAIN }}" \
7173
APPLE_CLIENT_ID="${{ secrets.APPLE_CLIENT_ID }}" \
7274
APPLE_TEAM_ID="${{ secrets.APPLE_TEAM_ID }}" \
7375
APPLE_KEY_ID="${{ secrets.APPLE_KEY_ID }}" \

src/main/java/org/devkor/apu/saerok_server/domain/collection/application/CollectionCommandService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import org.devkor.apu.saerok_server.global.exception.BadRequestException;
2020
import org.devkor.apu.saerok_server.global.exception.ForbiddenException;
2121
import org.devkor.apu.saerok_server.global.exception.NotFoundException;
22-
import org.devkor.apu.saerok_server.global.util.CloudFrontUrlService;
22+
import org.devkor.apu.saerok_server.global.util.ImageDomainService;
2323
import org.locationtech.jts.geom.Coordinate;
2424
import org.locationtech.jts.geom.GeometryFactory;
2525
import org.locationtech.jts.geom.Point;
@@ -36,7 +36,7 @@ public class CollectionCommandService {
3636
private final BirdRepository birdRepository;
3737
private final S3CollectionImageRemover s3CollectionImageRemover;
3838
private final CollectionImageRepository collectionImageRepository;
39-
private final CloudFrontUrlService cloudFrontUrlService;
39+
private final ImageDomainService imageDomainService;
4040
private final CollectionWebMapper collectionWebMapper;
4141

4242
public Long createCollection(CreateCollectionCommand command) {
@@ -136,7 +136,7 @@ public UpdateCollectionResponse updateCollection(UpdateCollectionCommand command
136136
}
137137

138138
String imageUrl = collectionImageRepository.findObjectKeysByCollectionId(command.collectionId()).stream()
139-
.map(cloudFrontUrlService::toImageUrl)
139+
.map(imageDomainService::toUploadImageUrl)
140140
.findFirst()
141141
.orElse(null);
142142

src/main/java/org/devkor/apu/saerok_server/domain/collection/application/CollectionImageCommandService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.devkor.apu.saerok_server.global.exception.ForbiddenException;
1313
import org.devkor.apu.saerok_server.global.exception.NotFoundException;
1414
import org.devkor.apu.saerok_server.global.exception.S3DeleteException;
15-
import org.devkor.apu.saerok_server.global.util.CloudFrontUrlService;
15+
import org.devkor.apu.saerok_server.global.util.ImageDomainService;
1616
import org.slf4j.Logger;
1717
import org.slf4j.LoggerFactory;
1818
import org.springframework.beans.factory.annotation.Value;
@@ -38,10 +38,10 @@ public class CollectionImageCommandService {
3838
private final S3Presigner s3Presigner;
3939
private final CollectionRepository collectionRepository;
4040
private final CollectionImageRepository collectionImageRepository;
41-
private final CloudFrontUrlService cloudFrontUrlService;
41+
private final ImageDomainService imageDomainService;
4242
private final S3Client s3Client;
4343

44-
@Value("${aws.s3.bucket}")
44+
@Value("${aws.s3.upload-image-bucket}")
4545
private String bucket;
4646

4747
public PresignResponse generatePresignedUploadUrl(Long userId, Long collectionId, String contentType) {
@@ -87,7 +87,7 @@ public CreateCollectionImageResponse saveImageMetadata(Long userId, Long collect
8787

8888
return new CreateCollectionImageResponse(
8989
collectionImageRepository.save(image),
90-
cloudFrontUrlService.toImageUrl(image.getObjectKey())
90+
imageDomainService.toUploadImageUrl(image.getObjectKey())
9191
);
9292
}
9393

src/main/java/org/devkor/apu/saerok_server/domain/collection/application/CollectionQueryService.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.devkor.apu.saerok_server.global.exception.BadRequestException;
1818
import org.devkor.apu.saerok_server.global.exception.ForbiddenException;
1919
import org.devkor.apu.saerok_server.global.exception.NotFoundException;
20-
import org.devkor.apu.saerok_server.global.util.CloudFrontUrlService;
20+
import org.devkor.apu.saerok_server.global.util.ImageDomainService;
2121
import org.locationtech.jts.geom.Point;
2222
import org.springframework.stereotype.Service;
2323
import org.springframework.transaction.annotation.Transactional;
@@ -33,7 +33,7 @@ public class CollectionQueryService {
3333
private final CollectionImageRepository collectionImageRepository;
3434
private final CollectionWebMapper collectionWebMapper;
3535
private final UserRepository userRepository;
36-
private final CloudFrontUrlService cloudFrontUrlService;
36+
private final ImageDomainService imageDomainService;
3737

3838
public GetCollectionEditDataResponse getCollectionEditDataResponse(GetCollectionEditDataCommand command) {
3939
userRepository.findById(command.userId()).orElseThrow(() -> new BadRequestException("유효하지 않은 사용자 id예요"));
@@ -49,7 +49,7 @@ public GetCollectionEditDataResponse getCollectionEditDataResponse(GetCollection
4949
.ifPresentOrElse(
5050
image -> {
5151
response.setImageId(image.getId());
52-
response.setImageUrl(cloudFrontUrlService.toImageUrl(image.getObjectKey()));
52+
response.setImageUrl(imageDomainService.toUploadImageUrl(image.getObjectKey()));
5353
},
5454
() -> {
5555
response.setImageId(null);
@@ -67,7 +67,7 @@ public MyCollectionsResponse getMyCollections(Long userId) {
6767
.map(collection -> {
6868
String objectKey = collectionImageRepository.findObjectKeysByCollectionId(collection.getId()).stream()
6969
.findFirst().orElse(null);
70-
String imageUrl = objectKey != null ? cloudFrontUrlService.toImageUrl(objectKey) : null;
70+
String imageUrl = objectKey != null ? imageDomainService.toUploadImageUrl(objectKey) : null;
7171

7272
return new MyCollectionsResponse.Item(
7373
collection.getId(),
@@ -95,7 +95,7 @@ public GetCollectionDetailResponse getCollectionDetailResponse(Long userId, Long
9595
}
9696

9797
List<String> objectKeys = collectionImageRepository.findObjectKeysByCollectionId(collectionId);
98-
String imageUrl = objectKeys.isEmpty() ? null : cloudFrontUrlService.toImageUrl(objectKeys.getFirst());
98+
String imageUrl = objectKeys.isEmpty() ? null : imageDomainService.toUploadImageUrl(objectKeys.getFirst());
9999

100100
return collectionWebMapper.toGetCollectionDetailResponse(collection, imageUrl);
101101
}
@@ -115,7 +115,7 @@ public GetNearbyCollectionsResponse getNearbyCollections(GetNearbyCollectionsCom
115115
List<GetNearbyCollectionsResponse.Item> items = collections.stream()
116116
.map(collection -> {
117117
List<String> objectKeys = collectionImageRepository.findObjectKeysByCollectionId(collection.getId());
118-
String imageUrl = objectKeys.isEmpty() ? null : cloudFrontUrlService.toImageUrl(objectKeys.getFirst());
118+
String imageUrl = objectKeys.isEmpty() ? null : imageDomainService.toUploadImageUrl(objectKeys.getFirst());
119119
return collectionWebMapper.toGetNearbyCollectionsResponseItem(collection, imageUrl);
120120
})
121121
.toList();

src/main/java/org/devkor/apu/saerok_server/domain/collection/infra/S3CollectionImageRemover.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class S3CollectionImageRemover {
1818
private final CollectionImageRepository collectionImageRepository;
1919
private final S3Client s3Client;
2020

21-
@Value("${aws.s3.bucket}")
21+
@Value("${aws.s3.upload-image-bucket}")
2222
private String bucket;
2323

2424
public void removeFromS3(Long collectionId) {

src/main/java/org/devkor/apu/saerok_server/domain/dex/bird/core/entity/BirdImage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public class BirdImage extends Auditable {
1616
@JoinColumn(name = "bird_id", nullable = false)
1717
private Bird bird;
1818

19-
@Column(name = "s3_url", nullable = false)
20-
private String s3Url;
19+
@Column(name = "object_key", nullable = false)
20+
private String objectKey;
2121

2222
@Column(name = "original_url", nullable = false)
2323
private String originalUrl;

src/main/java/org/devkor/apu/saerok_server/domain/dex/bird/core/mapper/BirdMapper.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,37 @@
33
import org.devkor.apu.saerok_server.domain.dex.bird.api.dto.response.BirdSearchResponse;
44
import org.devkor.apu.saerok_server.domain.dex.bird.core.entity.Bird;
55
import org.devkor.apu.saerok_server.domain.dex.bird.core.entity.BirdImage;
6-
import org.mapstruct.Mapper;
7-
import org.mapstruct.Mapping;
8-
import org.mapstruct.MappingConstants;
9-
import org.mapstruct.Named;
6+
import org.devkor.apu.saerok_server.global.util.ImageDomainService;
7+
import org.mapstruct.*;
8+
import org.springframework.beans.factory.annotation.Autowired;
109

1110
import java.util.List;
1211

1312
@Mapper(
1413
componentModel = MappingConstants.ComponentModel.SPRING
1514
)
16-
public interface BirdMapper {
15+
public abstract class BirdMapper {
16+
17+
@Autowired
18+
private ImageDomainService imageDomainService;
1719

1820
@Mapping(source = "name.koreanName", target = "koreanName")
1921
@Mapping(source = "name.scientificName", target = "scientificName")
20-
@Mapping(source = "images", target = "thumbImageUrl", qualifiedByName = "extractThumbImageUrl")
21-
BirdSearchResponse.BirdSearchItem toDto(Bird bird);
22+
@Mapping(target = "thumbImageUrl", ignore = true)
23+
public abstract BirdSearchResponse.BirdSearchItem toDto(Bird bird);
2224

23-
List<BirdSearchResponse.BirdSearchItem> toDtoList(List<Bird> birds);
25+
public abstract List<BirdSearchResponse.BirdSearchItem> toDtoList(List<Bird> birds);
2426

25-
@Named("extractThumbImageUrl")
26-
default String extractThumbImageUrl(List<BirdImage> images) {
27-
BirdImage birdImage = images.stream()
27+
@AfterMapping
28+
public void FillThumbImageUrl(
29+
Bird source,
30+
@MappingTarget BirdSearchResponse.BirdSearchItem target
31+
) {
32+
String thumbImageUrl = source.getImages().stream()
2833
.filter(BirdImage::isThumb)
34+
.map(img -> imageDomainService.toDexImageUrl(img.getObjectKey()))
2935
.findFirst()
3036
.orElse(null);
31-
return birdImage == null ? null : birdImage.getS3Url();
37+
target.setThumbImageUrl(thumbImageUrl);
3238
}
3339
}

src/main/java/org/devkor/apu/saerok_server/domain/dex/bird/query/mapper/BirdProfileViewMapper.java

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,59 @@
33
import org.devkor.apu.saerok_server.domain.dex.bird.api.dto.response.BirdDetailResponse;
44
import org.devkor.apu.saerok_server.domain.dex.bird.api.dto.response.BirdFullSyncResponse;
55
import org.devkor.apu.saerok_server.domain.dex.bird.query.view.BirdProfileView;
6+
import org.devkor.apu.saerok_server.global.util.ImageDomainService;
67
import org.mapstruct.*;
8+
import org.springframework.beans.factory.annotation.Autowired;
79

810
import java.util.List;
911

1012
@Mapper(
1113
componentModel = MappingConstants.ComponentModel.SPRING
1214
)
13-
public interface BirdProfileViewMapper {
15+
public abstract class BirdProfileViewMapper {
1416

15-
BirdFullSyncResponse.BirdProfileItem toDto(BirdProfileView birdProfileView);
17+
@Autowired
18+
private ImageDomainService imageDomainService;
1619

17-
List<BirdFullSyncResponse.BirdProfileItem> toDtoList(List<BirdProfileView> birdProfileViews);
20+
@Mapping(target = "images.s3Url", ignore = true)
21+
public abstract BirdFullSyncResponse.BirdProfileItem toDto(BirdProfileView birdProfileView);
22+
23+
@AfterMapping
24+
protected void fillS3Urls(
25+
BirdProfileView source,
26+
@MappingTarget BirdFullSyncResponse.BirdProfileItem target
27+
) {
28+
29+
for (int i = 0; i < target.getImages().size(); i++) {
30+
target.getImages().get(i).setS3Url(
31+
imageDomainService.toDexImageUrl(source.getImages().get(i).getObjectKey())
32+
);
33+
}
34+
}
35+
36+
public abstract List<BirdFullSyncResponse.BirdProfileItem> toDtoList(List<BirdProfileView> birdProfileViews);
1837

1938
@Mapping(source = "name.koreanName", target = "koreanName")
2039
@Mapping(source = "name.scientificName", target = "scientificName")
2140
@Mapping(source = "description.description", target = "description")
22-
@Mapping(source = "images", target = "imageUrls", qualifiedByName = "extractImageUrls")
41+
@Mapping(target = "imageUrls", ignore = true)
2342
@Mapping(target = "sizeCategory", ignore = true)
24-
BirdDetailResponse toBirdDetailResponse(BirdProfileView view);
25-
26-
@Named("extractImageUrls")
27-
default List<String> extractImageUrls(List<BirdProfileView.Image> images) {
28-
if (images == null) return List.of();
29-
return images.stream()
30-
.map(BirdProfileView.Image::getS3Url)
43+
public abstract BirdDetailResponse toBirdDetailResponse(BirdProfileView view);
44+
45+
@AfterMapping
46+
protected void fillImageUrls(
47+
BirdProfileView source,
48+
@MappingTarget BirdDetailResponse target
49+
) {
50+
target.imageUrls = source.getImages().stream()
51+
.map(img -> imageDomainService.toDexImageUrl(img.getObjectKey()))
3152
.toList();
3253
}
3354

34-
default Long toId(BirdProfileView birdProfileView) {
55+
protected Long toId(BirdProfileView birdProfileView) {
3556
return birdProfileView == null ? null : birdProfileView.getId();
3657
}
3758

38-
List<Long> toIdList(List<BirdProfileView> birdProfileViews);
59+
public abstract List<Long> toIdList(List<BirdProfileView> birdProfileViews);
3960

4061
}

src/main/java/org/devkor/apu/saerok_server/domain/dex/bird/query/view/BirdProfileView.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public static class SeasonWithRarity {
7777
@Data
7878
public static class Image {
7979

80-
@JsonProperty("s3_url")
81-
private String s3Url;
80+
@JsonProperty("object_key")
81+
private String objectKey;
8282

8383
@JsonProperty("original_url")
8484
private String originalUrl;
@@ -92,10 +92,10 @@ public static class Image {
9292

9393
public String toSummaryString() {
9494
// 대표 이미지 URL (없으면 "N/A")
95-
String thumbUrl = images != null
95+
String objectKey = images != null
9696
? images.stream()
9797
.filter(Image::getIsThumb)
98-
.map(Image::getS3Url)
98+
.map(Image::getObjectKey)
9999
.findFirst()
100100
.orElse("N/A")
101101
: "N/A";
@@ -115,7 +115,7 @@ public String toSummaryString() {
115115
String.format("Body Length : %.1f cm\n", bodyLengthCm) +
116116
String.format("Habitats : %s\n", habitats) +
117117
String.format("Updated At : %s\n", updatedAt) +
118-
String.format("Thumbnail URL : %s\n", thumbUrl);
118+
String.format("Object Key : %s\n", objectKey);
119119
}
120120

121121
@Override

0 commit comments

Comments
 (0)