본문 바로가기
spring boot

(1) spring boot 게시글 이미지 구현 흐름 (AWS S3)

by junjunjun 2023. 3. 7.
반응형

본 글은 정확하지 않을 수 있습니다. 참고용으로만 봐주시면 감사하겠습니다.

 

(1) spring boot 게시글 이미지 구현 흐름 (AWS S3)

(2) spring boot 게시글 이미지 기능 구현 (AWS S3, AWS cloudfront)

 

상황

게시글 작성 페이지

게시글에 여러 이미지를 등록할 수 있도록 요구사항이 바뀌었다. 바뀐 요구사항에 맞게 여러 가지 고민거리가 생겼다.

 

1. 이미지를 업로드하는 시점을 언제로 정할지?

내가 생각할 수 있었던 방식은 크게 두 가지였다.

  1. 사진 우측상단에 있는 올리기 버튼을 클릭하였을 때 게시글 내용과 이미지를 동시에 전송하는 방법
  2. 이미지를 등록하는 순간 이미지만 먼저 요청을 보내고 이후 올리기 버튼을 클릭하면 게시글 내용과 이미지 정보를 전송하는 방법

1번의 단점이 명확했기 때문에 고민 없이 2번을 선택하게 되었다. 

  • 데이터 전송이 증가하게 되면서 페이지 로딩이 길어지게 되고 결국 사용자 경험이 안 좋아진다.
  • 많은 데이터를 처리하기 때문에 서버에도 부하가 생긴다.
  • 잘못된 이미지 여부를 사용자가 올리기 버튼을 누르는 시점에서야 알 수 있다.
  • 대부분의 사이트에서 2번 방식을 사용하고 있다.

 

 

2. 이미지를 단일 요청으로 받을지, 아니면 한꺼번에 받을지?

1번의 단점과 같은 이유로 단일로만 요청을 받기로 정했다.

대략 코드를 보면 아래와 같다.

    @PostMapping("/post-image")
    public ResponseEntity<FileInfoResponse> upload(@RequestPart("file") MultipartFile multipartFile) {
        ... 생략 ...
    }

클라이언트에서는 유저가 사진을 등록할 때마다 /post-image를 요청한다. 만약 여러 사진을 한 번에 등록하여도 사진의 수만큼 /post-image 요청이 나간다.

 

대부분의 사이트도 이런 방식을 활용하는 것 같다.

아래는 "오늘의 집" 게시글 작성 페이지에서 이미지를 여러 장 등록하였을 때 발생하는 요청이다.

오늘의 집 네트워크

 

3. 이미지 저장 공간

비용적인 측면에서 고민을 많이하였다. 현재 우리 프로젝트는 aws 서비스를 프리티어로 이용하고 있는데 이미지의 경우 용량이 크기 때문에 자칫 잘못하면 과금이 발생할 수 있는 문제가 있었다.

 

하지만 다른 대책은 없었기에 s3를 이용하기로 하였다.

ec2 서버에 직접 이미지를 저장할 수 있었지만, ec2 프리티어에도 용량 제한이 있다.

s3이란 파일을 저장해주는 클라우드 서비스이다. 이미지를 조회할 수 있도록 url을 제공한다.
아래 블로그에서 자세하게 설명해 준다.
https://inpa.tistory.com/entry/AWS-📚-S3-버킷-생성-사용법-실전-구축

 

결정된 상황을 정리하면 다음과 같다.

이미지 전송을 게시글 등록 시점이 아닌 이미지 등록 시점에 한다.

이미지는 단일로 서버에 요청을 보낸다.

파일 저장소로 aws의 s3 서비스를 이용한다.

 

흐름

구현에 앞서서 대략 어떤 흐름으로 동작하는지 알아보자.

 

그전에 s3에서 이미지 url을 불러오기 위해서는 키 값(이미지 이름)을 알고 있어야 한다. 따라서 db에 이미지 정보를 저장해줘야 한다.

 

1. 이미지 등록

이미지 등록 흐름

1,2. 유저가 게시글 페이지에서 이미지를 등록하는 순간 서버에 /post-image api 요청을 보낸다.

3,4,5. 서버에서는 해당 이미지를 s3에 저장시키고 이미지 url를 반환해서 가져온다.

6. db에 이미지 정보를 저장한다.

7. 클라이언트에 이미지 정보를 반환해 준다. 이미지가 어떤 게시글의 이미지인지 알기 위해서 필요하다.

2. 게시글 등록

게시글 등록 흐름

1,2. 유저가 게시글 등록 버튼을 누르면 "이미지 정보 + 게시글 내용" 데이터 담고 서버에 /posts api 요청을 보낸다.

3. 이미지가 어느 게시글에 사용되었는지 알기 위해 이미지 정보를 가지고 이미지와 게시글을 매핑해 준다.

4. db에 게시글을 저장한다.

 

+ 이미지 조회

이미지 조회는 간단하다.

서버에서 이미지 url을 반환해 주면 된다. 이미지 url은 s3에서 제공해 준다.

 

 

구현하기에 앞서 전체적인 상황과 흐름에 대해서 정리하였다.

이후 구현 방법에 대해 정리할 예정이다.

반응형

댓글