[졸프] AWS S3 이용해서 프로필 사진 업로드 기능 구현하기

ssun·2025년 7월 22일

졸업프로젝트

목록 보기
10/21

하이하이.
현재 하고 있는 졸프에서 ML 관련 제외하고 마지막으로 남은게 프로필 업로드 부분이다. 현재 프로필 사진 업로드, 수정 등이 안되는 현상이 발생하고 있고, 나는 이걸 AWS S3을 이용해서 구현해보려고 한다.

그냥 듣기만 하던 AWS 기능들을 하나씩 구현해보고 사용해보니 재밌다.

그러면 시작!
우선 프로필 사진 업로드 기능이 들어가야하는 부분은 회원가입, 개인 정보 수정 내 프로필 수정 기능 이 2개다.

현재 구현되어있는 회원가입 코드이다.

Controller 코드

// 5. 프로필 이미지 저장 처리
        String profileUrl = null;
        try {
            if (profileImage != null && !profileImage.isEmpty()) {
                String fileName = UUID.randomUUID() + "_" + profileImage.getOriginalFilename();
                String savePath = "/your/save/path/" + fileName;
                profileImage.transferTo(new File(savePath));
                profileUrl = "/images/" + fileName;
            }
            request.setProfileUrl(profileUrl);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(
                    Map.of("errorCode", "IMAGE_SAVE_FAILED", "errorMessage", "프로필 이미지 저장 중 오류가 발생했습니다.")
            );
        }
       

Service 코드

//회원가입
    public User registerUser(SignupRequestDto request) {
        User user = new User();
        user.setUserEmail(request.getUserEmail());
        user.setUserPassword(passwordEncoder.encode(request.getUserPassword()));
        user.setName(request.getName());
        user.setUserNickname(request.getUserNickname());
        user.setBirthDate(request.getBirthDate());
        user.setGender(request.getGender());
        user.setPhoneNumber(request.getPhoneNumber());
        user.setProfileUrl(request.getProfileUrl());
        return userRepository.save(user);
    }

전체적인 과정 요약

  1. AWS S3 버킷과 IAM 사용자 만들기
  2. Spring에서 S3 연동 설정 (application.yml, S3Client, S3Uploader)
  3. 회원가입 API에서 S3Uploader를 통해 업로드 및 URL 저장

1. AWS S3 버킷 생성

내가 만든 버킷 설정 요소!

S3 버킷 설정 요약

항목설정 값 또는 선택 사항
버킷 이름qnb-profile-images
리전 (Region)ap-southeast-2 (시드니)
Object OwnershipACLs disabled (Bucket owner enforced)
Public Access 설정확인 예정
Versioning (버전 관리)Disabled
Tags없음
Encryption (암호화)SSE-S3 + Bucket Key Enabled

2. IAM 사용자 생성

여기서 나는 IAM 사용자가 왜 필요한지에 대한 의문이 들었어서 해당 내용을 찾아보았다.

Spring Boot 애플리케이션에서 AWS 리소스(S3)에 접근하려면,
AWS는 "누가" 요청했는지를 알아야 함. 이걸 위해서 인증 정보(Access Key / Secret Key) 가 필요하다. 이 인증 정보를 발급받기 위해 IAM 사용자를 따로 만드는 것!

그리고 현재 EC2를 위한 IAM 유저가 따로 존재한다. 그래서 이 유저를 사용할 수 있지 않을까 싶어 해당 유저에 S3 권한이 있는지 확인해볼까 했지만 현재 키가 따로 사용되고 있기 때문에 그냥 S3 전용 유저를 하나 만들기로 설정!

IAM 사용자 설정 요약

항목설정 값 또는 선택 사항
사용자 이름qnb-s3-uploader
액세스 유형프로그래밍 방식 액세스 (Programmatic access)
콘솔 로그인 허용 여부허용 안 함 (Console access: Disabled)
권한 부여 방식Attach policies directly
부여한 정책AmazonS3FullAccess
태그없음
Access Key 생성 여부생성 완료 (Access Key ID & Secret Key 확보)

3. Spring 프로젝트 연결

3-1. build.gradle 설정

implementation platform('software.amazon.awssdk:bom:2.25.8') // 버전 통합 관리
implementation 'software.amazon.awssdk:s3'

해당 코드 build.gradle에 추가!
그리고 config와 uploader까지 추가한 후에 테스트 컨트롤러를 통해서 테스트 해보았다.

해당 서버를 돌린 후 포스트맨 정상작동, 브라우저로 접속, S3에 정상적으로 업로드 된거 모두 확인했다!

4. 회원가입 API와 연동

회원가입 흐름

  1. 사용자가 프론트에서 회원가입 + 프로필 사진 업로드

  2. 백엔드는 MultipartFile을 받아

    • S3에 저장
    • URL을 얻음
  3. DB에 저장할 User 객체에 profileImageUrl 필드를 포함

  4. 사용자 정보와 함께 저장

해서 모두 완료! 생각보다 빠르게 구현 완료했다

profile
안녕하세요! 백다현입니다

0개의 댓글