주뇽's 저장소

Spring Boot와 AWS S3를 사용하여 게시글에 이미지 업로드 및 관리하기 본문

웹개발/SpringBoot

Spring Boot와 AWS S3를 사용하여 게시글에 이미지 업로드 및 관리하기

뎁쭌 2024. 5. 15. 00:00
728x90
반응형

AWS S3는 확장성, 내구성, 보안성을 제공하는 객체 스토리지 서비스이다. 이 글에서는 Spring Boot 애플리케이션에서 AWS S3를 사용하여 게시글에 이미지를 업로드하고 관리하는 방법에 대해 설명한다.

  1. AWS S3 버킷 생성
    • AWS 관리 콘솔에서 S3 서비스로 이동한다.
    • 새 버킷을 생성하고 적절한 이름과 리전을 선택한다.
    • 버킷의 접근 권한을 설정하고, 필요한 경우 버전 관리 및 암호화 옵션을 구성한다.
  2. Spring Boot 프로젝트 설정
    • build.gradle 파일에 S3 관련 의존성을 추가한다.
      dependencies {
          implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
      }
       
    • application.properties 또는 application.yml 파일에 S3 관련 설정을 추가한다.
      cloud.aws.credentials.accessKey=YOUR_ACCESS_KEY
      cloud.aws.credentials.secretKey=YOUR_SECRET_KEY
      cloud.aws.s3.bucket=YOUR_BUCKET_NAME
      cloud.aws.region.static=YOUR_REGION
  3. 도메인 모델 설계
    • PostImage 엔티티를 생성하여 이미지 파일명과 S3 객체 키를 저장한다.
      @Entity
      public class PostImage {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
      
          @Column(nullable = false)
          private String fileName;
      
          @Column(nullable = false)
          private String s3Key;
      
          @ManyToOne(fetch = FetchType.LAZY)
          @JoinColumn(name = "post_id")
          private Post post;
      
          // 생성자, 연관관계 메서드 등 추가
      }
    • Post 엔티티에 PostImage와의 일대다 관계를 추가한다.
      @Entity
      public class Post extends BaseTimeEntity {
          // ...
      
          @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
          private List<PostImage> images = new ArrayList<>();
      
          // ...
      }
  4. 이미지 업로드 및 저장 로직 구현
    • S3 클라이언트를 사용하여 이미지를 S3 버킷에 업로드하는 로직을 구현한다.
      @Service
      public class PostService {
          private final AmazonS3 amazonS3;
      
          @Value("${cloud.aws.s3.bucket}")
          private String bucketName;
      
          // ...
      
          public void savePostImages(Post post, List<MultipartFile> files) {
              for (MultipartFile file : files) {
                  String fileName = file.getOriginalFilename();
                  String s3Key = "post-images/" + post.getId() + "/" + fileName;
      
                  try {
                      ObjectMetadata metadata = new ObjectMetadata();
                      metadata.setContentType(file.getContentType());
                      amazonS3.putObject(bucketName, s3Key, file.getInputStream(), metadata);
                  } catch (IOException e) {
                      // 예외 처리
                  }
      
                  PostImage postImage = new PostImage();
                  postImage.setFileName(fileName);
                  postImage.setS3Key(s3Key);
                  postImage.setPost(post);
      
                  post.getImages().add(postImage);
              }
          }
      
          // ...
      }
  5. 이미지 조회 및 반환 로직 구현
    • S3에서 이미지를 조회하고 클라이언트에게 반환하는 로직을 구현한다.
      @Service
      public class PostService {
          // ...
      
          public byte[] getPostImage(String s3Key) {
              try {
                  S3Object s3Object = amazonS3.getObject(bucketName, s3Key);
                  return IOUtils.toByteArray(s3Object.getObjectContent());
              } catch (IOException e) {
                  // 예외 처리
              }
              return null;
          }
      
          // ...
      }

      이상으로 Spring Boot와 AWS S3를 사용하여 게시글에 이미지를 업로드하고 관리하는 방법에 대해 알아보았다. S3의 확장성과 내구성을 활용하여 안정적으로 이미지를 저장하고 제공할 수 있다. 도메인 모델 설계, 업로드 및 조회 로직 구현, 보안 및 비용 최적화 등을 고려하여 프로젝트에 적용해본다.