S3

    이미지가 포함된 게시글 관련 API 설계

    서론 과거에 '맞춤 케이크 중개 플랫폼' 프로젝트를 진행했을 때는 아래와 같이 게시글 관련 API 에 이미지 처리를 결합하여 구현하였다. 즉, 게시글 생성, 삭제, 조회하는 API 안에서 연관된 이미지도 함께 처리해줬다는 의미이다. (아래의 코드에서 Order 를 게시글이라고 생각하면 된다.) @Component @RequiredArgsConstructor public class OrderFacade { private final OrderService orderService; private final ImageService imageService; @Transactional public Long createOrder(OrderCreateRequest orderCreateRequest) { Long ord..

    스케줄링, 배치로 S3 이미지 삭제 처리

    개요 현재 제가 진행하고 있는 프로젝트에서는 이미지 삭제를 hard delete 로 처리하고 있습니다. 주문글, 댓글 등 다른 엔티티들은 모두 soft delete로 처리하는데 이미지만 hard delete 를 하고 있는 이유가 무엇일까요? 우선 soft delete를 사용하는 이유는 삭제된 데이터를 복구해야 할 일이 생길 수도 있고, 데이터 자체를 활용하여 추후 기능 개발에 활용할 수도 있기 때문입니다. 즉, 데이터가 서비스의 자산이기 때문입니다. 현재 제 프로젝트에서는 이미지를 독립적인 엔티티로 관리하고 있는데, 이미지를 soft delete 를 해야하는 이유가 크게 없습니다. S3와 같은 스토리지에서는 삭제를 하고 DB 에서는 soft delete 된 상태로 놓아 두는 것은 의미가 없고, S3 에서..

    AWS S3 에서 이미지를 관리해보자

    우선 S3 에서 자주 사용하는 버킷과 객체라는 간단한 개념에 대해 먼저 알아보고 가겠습니다. 버킷 특징 객체를 저장하고 관리하는 역할 Amazon S3에서 생성되는 최상위의 디렉토리이며, Amazon S3에 저장된 객체의 컨테이너 이다. S3 상의 모든 객체는 버킷에 포함된다. 버킷의 이름은 S3에서 유일해야 한다. 즉, 전세계에 어디에도 중복된 이름이 존재 할 수 없다. 객체 특징 객체는 데이터와 메타 데이터를 구성하고 있는 저장 단위 객체는 키를 통해서 버킷에서 유일한 것으로 식별되고, 버킷에 존재하는 모든 객체는 단 하나의 키를 지닌다. S3 내에서 버킷, 키, 버전 id를 통해서 특정 객체를 파악할 수 있다. S3 서비스를 위한 코드는 정말 간단합니다. 일단 우선 AWS 와 연결을 해주기 위해 아..

    @TransactionalEventListener 파헤치기

    @TransactionalEventListener 란? 개요 이미지 엔티티를 DB 에 저장/삭제하는 것과 S3 에 업로드/삭제하는 것의 생명주기를 같게 하고 싶었습니다. 쉽게 말하자면, DB 저장/삭제가 성공한다면 S3 업로드/삭제도 함께 성공하고, 실패한다면 함께 실패해야하는 것입니다. 이런 경우 보통 트랜잭션을 이용하는 것을 쉽게 떠올릴 수 있지만 S3 는 트랜잭션과는 연관이 없으므로 어떻게 해결해야할까 찾아보다가 @TransactionalEventListener 를 공부하고 사용해보게 되었습니다. 참고로 @TransactionalEventListener 와 비슷한 @EventListener 의 경우 event 를 pulish 하는 코드 시점에 event 가 발행됩니다. event 를 발행하는 트랜잭..