TIL 86 - [ Spring 최종 프로젝트 ( Day 22 ) - S3 문제 이미지 수정/삭제 기능 구현 ]

2025. 6. 28. 00:12·[내일배움캠프-Sparta]/Spring 6기
반응형

amazonS3 클래스내 deleteObject 라는 메소드가 선언되어 있다. 그것으 활용해서 로직을 구현해보았다.

1️⃣ Problem 엔티티 내에서 해당 메소드 추가 ( DB 내에서 초기화 )

// 이미지 초기화
public void clearImages() {
    this.imageUrl.clear();
}

해당하는 Problem의 DB 내에서 imageUrl을 초기화 해주는 로직이다. → AWS S3 내 에서 영향 X

 

2️⃣ S3Uploader 클래스 내 delete 로직 추가

// 이미지 삭제
public void delete(String imageUrl) {
    try {
        String fileName = extractKeyFromProblemUrl(imageUrl);
        amazonS3.deleteObject(bucket, fileName); // S3 내 이미지 객체 제거.
        log.info("S3에서 이미지 삭제 완료: {}", fileName);
    } catch (Exception e) {
        log.error("S3 이미지 삭제 실패: {}", imageUrl, e);
        throw new S3Exception(S3ExceptionCode.S3_DELETE_FAILED);
    }
}

// 문제 이미지 URL 가져오기
private String extractKeyFromProblemUrl(String fileUrl) {
    // S3 주소 포맷 기준으로 잘라내기
    return fileUrl.substring(fileUrl.indexOf("problem/"));
}

extarctKey~ 메소드로 problem/ 으로 시작하는 파일로부터 이미지 파일 URL 을 가져오는 로직을 만들어주고, 이에 delete 메소드내에서 사용을 해준다.

그래서 처음에 언급했던 amazonS3 클래스 내 deleteObject를 활용해서 지금 사용하고 있는 버킷과, 이미지 파일 URL을 가져와서 실행해주는 로직으로 구현을 하였다. ( 실패시, 커스텀 예외 처리 적용 )

 

3️⃣ ProblemService 적용

// 문제 수정 ( 관리자 )
@Transactional
public void modifyProblem(Long problemId, ProblemUpdateRequest request, MultipartFile newImage) {

    Problem findProblem = problemDomainService.getProblem(problemId);

    findProblem.update(
        findProblem.getCreator(),
        request.title(),
        request.description(),
        request.difficulty(),
        request.memoryLimit(),
        request.timeLimit(),
        request.reference()
    );

    // 이미지 수정 처리
    if (newImage != null && !newImage.isEmpty()) {
        updateProblemImage(findProblem, newImage);
    }

    problemDomainService.updateCategoryAndSearchEngine(findProblem, request.categories());

}

// 문제 삭제 ( 관리자 )
@Transactional
public void removeProblem(Long problemId) {

    Problem findProblem = problemDomainService.getProblem(problemId);

    // 문제 이미지가 있으면 삭제
    if (!findProblem.getImageUrl().isEmpty()) {
        for(String fileUrl : findProblem.getImageUrl()) {
            s3Uploader.delete(fileUrl); // <----- 적용
        }
    }

    // Soft Delete
    problemDomainService.removeProblem(findProblem);
}

S3Uploader에 선언된 메소드들을 활용해서, 서비스 로직에 적용한다. ( 수정, 삭제 ) 

// 이미지 수정
private void updateProblemImage(Problem problem, MultipartFile newImage) {

    // 기존 이미지가 있다면 삭제 처리
    if (!problem.getImageUrl().isEmpty()) {
        for(String fileUrl : problem.getImageUrl()) {
            s3Uploader.delete(fileUrl);
        }
        problem.clearImages();
    }

    String newImageUrl = uploadImageAfterTransaction(newImage, problem.getId());
    problem.addImage(newImageUrl);
}

 

이렇게 로직을 추가하게 되면서, 이제 DB내에서 뿐만아니라 AWS S3 버킷 내에서도 파일이 수정되거나 삭제처리가 되는 것을 볼수 있었다.

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

TIL 88 - [ Spring 최종 프로젝트 ( Day 24 ) - 파일 크기 제한, 문제 이미지 수정/삭제 DB 잔존 현상 리팩토링 ]  (0) 2025.07.01
TIL 87 - [ Spring 최종 프로젝트 ( Day 23 ) - 문제 조회 성능 최적화 ]  (0) 2025.06.30
TIL 85 - [ Spring 최종 프로젝트 ( Day 21 ) - Category, Difficulty 리팩토링 ]  (0) 2025.06.26
TIL 84 - [ Spring 최종 프로젝트 ( Day 20 ) - S3 문제 이미지 기능 구현, contextLoads() 에러 ]  (0) 2025.06.25
TIL 83 - [ Spring 최종 프로젝트 ( Day 19 ) - S3 문제 이미지 기능 구현, 브로셔 작업 ]  (0) 2025.06.24
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • TIL 88 - [ Spring 최종 프로젝트 ( Day 24 ) - 파일 크기 제한, 문제 이미지 수정/삭제 DB 잔존 현상 리팩토링 ]
  • TIL 87 - [ Spring 최종 프로젝트 ( Day 23 ) - 문제 조회 성능 최적화 ]
  • TIL 85 - [ Spring 최종 프로젝트 ( Day 21 ) - Category, Difficulty 리팩토링 ]
  • TIL 84 - [ Spring 최종 프로젝트 ( Day 20 ) - S3 문제 이미지 기능 구현, contextLoads() 에러 ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    AWS
    세션
    db
    KPT
    운영체제
    network
    컴퓨터구조
    Testcode
    메모리
    It
    개발자
    cs
    OS
    알고리즘
    web
    내일배움캠프
    배포
    Til
    SQL
    코딩테스트
    백엔드
    네트워크
    트랜잭션
    Java
    SQLD
    spring
    docker
    웹
    CPU
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 86 - [ Spring 최종 프로젝트 ( Day 22 ) - S3 문제 이미지 수정/삭제 기능 구현 ]
상단으로

티스토리툴바