주뇽's 저장소
Spring Boot와 AWS S3를 사용하여 게시글에 이미지 업로드 및 관리하기 본문
728x90
반응형
AWS S3는 확장성, 내구성, 보안성을 제공하는 객체 스토리지 서비스이다. 이 글에서는 Spring Boot 애플리케이션에서 AWS S3를 사용하여 게시글에 이미지를 업로드하고 관리하는 방법에 대해 설명한다.
- AWS S3 버킷 생성
- AWS 관리 콘솔에서 S3 서비스로 이동한다.
- 새 버킷을 생성하고 적절한 이름과 리전을 선택한다.
- 버킷의 접근 권한을 설정하고, 필요한 경우 버전 관리 및 암호화 옵션을 구성한다.
- 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
- build.gradle 파일에 S3 관련 의존성을 추가한다.
- 도메인 모델 설계
- 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<>(); // ... }
- PostImage 엔티티를 생성하여 이미지 파일명과 S3 객체 키를 저장한다.
- 이미지 업로드 및 저장 로직 구현
- 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); } } // ... }
- S3 클라이언트를 사용하여 이미지를 S3 버킷에 업로드하는 로직을 구현한다.
- 이미지 조회 및 반환 로직 구현
- 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의 확장성과 내구성을 활용하여 안정적으로 이미지를 저장하고 제공할 수 있다. 도메인 모델 설계, 업로드 및 조회 로직 구현, 보안 및 비용 최적화 등을 고려하여 프로젝트에 적용해본다.
- S3에서 이미지를 조회하고 클라이언트에게 반환하는 로직을 구현한다.