Skip to content

Commit

Permalink
feat : 일정 주기 meme 생성하도록 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
wnsrl1228 committed May 28, 2024
1 parent 3d06e5a commit fcd7b9f
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 3 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ out/

### 설정 ###
/src/main/resources/application.yml
/src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public enum ErrorCode {
INVALID_FILE_EXTENSION(8005, "지원되지 않는 이미지 형식입니다. 유효한 형식은 jpg, jpeg, png, gif 입니다."),
INVALID_FILE(8006, "업로드된 파일이 이미지 형식이 아닙니다. 유효한 이미지 파일을 업로드해주세요."),
FAILED_TO_DELETE_FILE(8007, "이미지 삭제에 실패했습니다."),
FAILED_TO_ACCESS_S3(8008, "s3 접근에 실패했습니다."),

SERVER_ERROR(9999, "서버에 문제가 발생하였습니다.");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.memetitle.image.infrastructure;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.*;
import com.memetitle.global.exception.StorageException;
import com.memetitle.image.dto.FileInfoResponse;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -75,6 +73,23 @@ public void delete(final String imageAddress){
}
}

public String getUrlByPrefix(final String prefix) {
final ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucket)
.withPrefix("memes/" + prefix + "-");

try {
final ObjectListing objectListing = amazonS3.listObjects(listObjectsRequest);
if (objectListing.getObjectSummaries().isEmpty()) {
return null; // 객체가 없는 경우 null 반환
} else {
return createUrlName("/" + objectListing.getObjectSummaries().get(0).getKey());
}
} catch (Exception e) {
throw new StorageException(FAILED_TO_ACCESS_S3);
}
}

/**
* 이미지 유효성 체크 후 BufferedImage 반환
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.memetitle.meme.repository.TitleRepository;
import com.memetitle.meme.repository.TopTitleRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -16,6 +17,7 @@
import java.time.LocalTime;
import java.util.List;

@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
Expand All @@ -34,6 +36,7 @@ public void updateScoreByTitleLikeCount() {
// 없을 경우 종료
if (endedMemes.isEmpty()) return;

log.info("[updateScoreByTitleLikeCount] start");
// 있을 경우 해당 meme의 title을 likeCount가 많은 순서로 5개만 가져옴
for (Meme meme : endedMemes) {

Expand All @@ -52,6 +55,7 @@ public void updateScoreByTitleLikeCount() {
// - 동수 무시하고 3개만 저장
saveTopTitles(meme, titles);
}
log.info("[updateScoreByTitleLikeCount] end");
}

private List<Meme> findEndedMemes() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface MemeRepository extends JpaRepository<Meme, Long> {
List<Meme> findAllByEndDateBetween(LocalDateTime start, LocalDateTime end);

Optional<Meme> findFirstByStatusOrderByStartDateDesc(MemeStatus status);

Optional<Meme> findFirstByOrderByIdDesc();
}
56 changes: 56 additions & 0 deletions src/main/java/com/memetitle/meme/service/MemeSchedulerService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.memetitle.meme.service;

import com.memetitle.image.infrastructure.AwsS3Provider;
import com.memetitle.meme.domain.Meme;
import com.memetitle.meme.repository.MemeRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Optional;

@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class MemeSchedulerService {

private final AwsS3Provider awsS3Provider;
private final MemeRepository memeRepository;

@Scheduled(cron = "0 1 0 */7 * *") // 0시 1분, 7일 주기
public void generateMeme() {

Long id = generateNextMemeId();

String imgUrl = awsS3Provider.getUrlByPrefix(id.toString());

// s3에 다음 밈에 대한 이미지가 없는 경우
if (imgUrl == null) {
log.info("s3에 밈에 대한 이미지가 없습니다.");
return;
}

final Meme meme = new Meme(
extractImgOriginalName(imgUrl),
imgUrl,
LocalDateTime.now(),
LocalDateTime.now().plusDays(7)
);

log.info("[generateMeme] success");
memeRepository.save(meme);
}

private Long generateNextMemeId() {
Optional<Meme> lastMeme = memeRepository.findFirstByOrderByIdDesc();
return lastMeme.map(meme -> meme.getId() + 1).orElse(1L);
}
private String extractImgOriginalName(String url) {
String[] parts = url.split("/");
return parts[parts.length - 1];
}
}

0 comments on commit fcd7b9f

Please sign in to comment.