기록

API/이미지 처리 및 저장 방법 본문

Web/Spring

API/이미지 처리 및 저장 방법

youngyin 2024. 1. 29. 12:00

들어가면서

토이 프로젝트를 진행하면서 이미지를 효과적으로 처리하는 방법을 고려하였다. 그 과정과 결과를 고려하려고 한다.

예를 들어서 공지사항을 저장하는 기능을 구현한다고 해보자.

공지사항과 이미지 정보를 데이터베이스에 저장하도록 설계하였고, 각 테이블은 아래와 같다.

공지사항 테이블

TB_NOTICE type comment
notice_id String 공지사항 구분자
content String 공지사항 내용
title String 공지사항 제목

이미지 테이블

TB_IMAGE type comment
image_id String 이미지 구분자
file_name String 이미지파일 이름
file_size Integer 이미지파일 크기

본론

1. 공지사항 저장하기

클라이언트에서 공지사항을 저장하기 위해서는 API-server에 두번의 요청을 보내야한다.

(1) POST /api/image

  • 클라이언트에서 Api-Server로 이미지를 전송
  • Api-Server에서 이미지 메타정보를 데이터베이스에 저장
  • Api-Server에서 이미지 소스를 이미지-저장소에 저장
  • Api-server에서 이미지 아이디를 클라이언트에 전달
{
  "data": {
    "imageId": "IM001"
  },
  "status": "OK",
  "message": "Your request has been processed successfully."
}

(2) POST /api/notice

  • 클라이언트에서 Api-Server로 공지사항 정보를 전송
{
  "title": "공지 제목",
  "content": "공지 테스트입니다.",
  "target": "CUSTOMER",
  "imgaeId": "IM001"
}
  • Api-Server에서 공지사항 정보를 데이터베이스에 저장
  • Api-server에서 처리결과를 클라이언트에 전달
{
  "data": {
    "noticeId": "NT001"
  },
  "status": "OK",
  "message": "Your request has been processed successfully."
}

2. 공지사항 조회하기

(1) GET /api/notice/{noticeId}

  • 클라이언트에서 Api-Server으로 공지사항을 조회 요청
  • Api-Server에서 데이터베이스로 공지사항 정보를 조회
  • Api-server에서 처리결과를 클라이언트에 전달
{
  "data": {
    "noticeId": "NT001",
    "title": "General Notice",
    "content": "Content for everyone"
  },
  "status": "OK",
  "message": "Your request has been processed successfully."
}

(2) GET /api/image/{imageId}

  • 클라이언트에서 Api-Server으로 이미지 조회 요청
  • Api-server에서 이미지 소스를 클라이언트에 전달

마무리하면서

다중 요청 문제

이미지와 공지사항 정보를 따로 저장하는 구조에서는 이미지 저장공지사항 저장 프로세스 중 어느 하나라도 문제가 발생한다면 일관성이 깨질 수 있습니다. 예를 들어 이미지 업로드는 성공했지만, 공지사항 저장에서 실패하는 경우 트랜잭션 처리가 어려워 문제가 발생할 수 있다.

위 글에서는 공지사항에 대해서만 다루었지만 이미지 정보와 도메인의 정보를 함꼐 저장해야 하는 경우가 있을 것이다. 이 경우 이미지 저장과 도메인 정보를 함께 저장하려면 두 번의 요청이 필요하므로 처리 과정에서 오버헤드가 발생할 수 있다.

그럼에도 이 방법을 선택한 이유는 이미지와 도메인 정보를 함께 받아 처리하게 되면 이미지 크기나 개수에 제한이 있을 수 있기 때문이다. 또한 관련된 엔드포인트를 모두 수정하고 클라이언트 단에서 모든 이미지 처리를 포함하는 요청의 코드를 변경해야 하기 때문이다. 작업량을 고려해서 향후에는 클라이언트 단에서 이미지 저장과 도메인 저장을 함께 처리하는 방법도 고려해볼 계획이다.

보안문제

이미지 저장소에 직접 접근 가능한 URL이 노출될 경우 보안에 취약할 수 있습니다. 따라서 이미지 저장소의 위치를 직접 외부에 노출하지 않기 위해 별도의 엔드포인트(/api/image/{imageId})를 만들어 처리했다. 이를 통해 외부에서 직접적인 이미지 저장소 접근을 방지하였다.

Comments