Skip to content

링크 생성 시 OG 이미지 S3 업로드 및 저장소 구축 #163

@ckdals4600

Description

@ckdals4600

이슈 배경

  • OG 태그 크롤링을 통해 수집한 외부 이미지 링크는 원본 서버의 정책(Hotlinking 방지)이나 게시물 삭제에 따라 접근이 불가능해질 위험이 있음.
  • 데이터의 영속성을 보장하고 안정적인 이미지 제공을 위해, 외부 이미지를 다운로드하여 S3 버킷에 저장하고 해당 URL을 반환하는 기능을 구현함.

이슈 내용

1. AWS 리소스 및 환경 설정

  • IAM & S3:
    • S3 버킷 생성 및 접근 권한(PutObject, GetObject)을 가진 IAM 사용자 설정.
    • application.yml에 AWS 관련 프로퍼티(AccessKey, SecretKey, Bucket, Region) 추가.
  • 의존성: spring-cloud-starter-aws 추가.

3. 환경 설정 (build.gradle & application.yml)

  • 의존성 추가: AWS S3 연동을 위한 spring-cloud-starter-aws 의존성 추가.
  • 프로퍼티 설정:
    • Access Key, Secret Key, Region, Bucket Name 등을 환경 변수 또는 yml로 구성.
    • 보안을 위해 민감 정보는 환경 변수로 분리 관리.

2. 이미지 업로드 로직 구현 (ImageUploader)

  • 입력: 링크 생성 요청 시 전달받은 imageUrl (String).
  • 프로세스:
    1. 파일명 추출 및 중복 검사:
      • URL에서 파일명을 추출하여 S3에 이미 존재하는지 확인함 (doesObjectExist).
      • 존재 시: 다운로드 없이 기존 S3 URL을 즉시 반환 (리소스 절약).
    2. 다운로드 & 업로드:
      • 미존재 시, 해당 URL의 이미지를 다운로드하여 S3 버킷에 업로드.
    3. 반환: 업로드된 S3 객체의 접근 URL 반환.
  • 예외 처리 (Soft Fail):
    • 다운로드 실패(404, Timeout) 시 업로드를 중단하고, 원본 URL 그대로 반환하거나 null 처리하여 링크 저장 트랜잭션 자체는 성공하도록 함.

5. 예외 처리

  • 다운로드 실패: 원본 서버 타임아웃, 404, 접근 거부 시 기본 이미지(Placeholder) URL을 반환하거나 null 처리(Soft Fail).
  • 유효성 검사: 다운로드한 데이터가 실제 이미지 파일인지(MIME Type), 파일 크기가 과도하게 크지 않은지 검증 로직 추가.
  • 중복 방지: 이미 저장된 파일명에 대해 불필요한 다운로드/업로드가 발생하지 않는지 확인 바람.
  • 트랜잭션: 이미지 업로드가 조금 늦어지더라도 링크 저장이 너무 오래 걸리지 않는지(동기/비동기 처리 여부) 검토 필요.

체크리스트

  • AWS S3 연동 설정이 완료되었는가?

참고 자료

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions