Home Pick Place - 공통 파일 업로드 기능 개발
Post
Cancel

Pick Place - 공통 파일 업로드 기능 개발

🚀 공통 파일 업로드 기능 개발 - 이미지 및 파일 업로드 / 관리 시스템

목표: 다양한 도메인에서 재사용 가능한 공통 파일 시스템 설계 및 구현


📅 개발 기간

  • 시작: 2026.04.12
  • 종료: 2026.04.28
  • 총 소요 시간: 5H

🎯 개발 배경 (Why)

  • 서비스 내 여러 기능(위치 기반 추천, 게시글 등)에서 파일 업로드 기능이 중복 개발될 가능성 존재함
  • 도메인마다 파일을 따로 관리하면 유지보수 비용 증가할 수 있음
  • 파일과 도메인 데이터 간의 유연한 매핑 구조 필요

👉 따라서, 공통 파일 테이블 + 도메인 매핑 구조로 설계하여 재사용성과 확장성을 확보하고자 함


🧩 요구사항 (Requirements)

✔️ 기능 요구사항

  • 사용자가 이미지를 포함한 여러 형태의 파일을 업로드 할 수 있어야 함
  • 파일의 메타데이터가 저장되어야 함 (파일명, 경로, 확장자 등)
  • 사용자가 업로드 한 파일을 삭제 할 수 있어야 함 (수정 및 삭제)
  • 다중 파일 업로드 기능을 지원해야 함
  • 특정 도메인(Entity)과 파일 매핑이 가능해야 함

⚙️ 비기능 요구사항

  • 성능 (응답속도, 처리량)
  • 확장성 (ElasticSearch 을 통한 파일 검색 도입 고려 등)
  • 보안 (인증/인가, 파일 접근 제한 등)

🏗️ 설계 (Design)

📌 아키텍처

  • 사용 기술 스택: Spring, JPA, MySQL
  • 파일 저장: 로컬 디스크 (추후 S3 등의 별도의 솔루션 도입 가능)

👉 구조

1
2
3
4
5
6
7
8
9
[Client]
   ↓
[Controller]
   ↓
[Service]
   ↓
[File Entity + Mapping Entity]
   ↓
[MySQL + File System]

🗄️ DB 설계

📁 파일 테이블

컬럼설명
file_srlPK
user_srl파일 업로더 (FK)
file_manage_srl파일 관리 번호 (UUID)
file_seq파일 순번
file_nm원본 파일명
file_src파일 저장 경로 (SRC)
file_extension파일 확장자
upload_date업로드 일자

🔗 매핑되는 테이블 (기본정보)

컬럼설명
OOO_srlPK
file_srl파일 FK
target_table_srl매핑될 테이블 FK

👉 특징

  • 특정 도메인에 종속되지 않는 유연한 구조
  • 하나의 파일을 여러 도메인에 연결 가능

🔗 API 설계

MethodURL설명
POST/files파일 업로드
GET/files/{id}파일 조회 (다운로드)
DELETE/files/{id}파일 삭제

🛠️ 구현 내용 (Implementation)

🔹 핵심 로직

파일 업로드 시

  1. UUID 기반 파일명 생성 (파일 관리용 이름 생성)
    • 연결된 파일은 하나의 UUID를 공유하고, 순번은 1부터 시작한다.
    • 연결된 파일이 단 하나라면 순번은 1로 고정 (기본값)
  2. 로컬 디스크 저장 (다른 솔루션으로 확장 가능)
  3. DB에 메타 데이터 저장
    • 매핑 테이블 저장과 파일 테이블 저장은 하나의 트랜잭션 처리

파일 삭제 시

  1. 물리 파일 삭제
  2. DB 데이터 삭제
    • 매핑 테이블 삭제와 파일 테이블 삭제는 하나의 트랜잭션 처리

파일 다운로드 시

  1. DB에 파일 데이터가 존재하는지 확인
  2. 하나의 파일이라면 일반 파일 다운로드, 2개 이상의 파일이라면 zip 형식으로 다운로드

🔹 주요 코드 전략

  • MultipartFile 사용하여 파일 처리
  • 파일명 충돌 방지를 위해 UUID 적용
  • 트랜잭션 처리로 DB와 파일 시스템 정합성 유지

🔹 사용 기술 / 라이브러리

  • Spring Data JPA
  • MultipartFile
  • MySQL

💡 회고 (Retrospective)

👍 잘한 점

  • 요구사항에 해당하는 모든 기능개발을 완료함

👎 아쉬운 점

  • 파일을 직접 다루다 보니 try-catch 구조가 빈번하게 사용되고 그에 따라 코드가 깔끔하지 않음.

🔥 개선할 점

  • try-catch 구조를 최대한 리팩토링하여 코드를 깔끔하게 개선할 필요성 존재
  • 회원에 대한 개발이 아직 완료되지 않아 개발이 완료되면 회원에 대한 로직을 추가해야 함
  • 보안에 대한 고민과 그에 따른 로직 추가기 필요함

This post is licensed under CC BY 4.0 by the author.