하이하이.
현재 하고 있는 졸프에서 ML 관련 제외하고 마지막으로 남은게 프로필 업로드 부분이다. 현재 프로필 사진 업로드, 수정 등이 안되는 현상이 발생하고 있고, 나는 이걸 AWS S3을 이용해서 구현해보려고 한다.
그냥 듣기만 하던 AWS 기능들을 하나씩 구현해보고 사용해보니 재밌다.
그러면 시작!
우선 프로필 사진 업로드 기능이 들어가야하는 부분은 회원가입, 개인 정보 수정 내 프로필 수정 기능 이 2개다.
현재 구현되어있는 회원가입 코드이다.
// 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", "프로필 이미지 저장 중 오류가 발생했습니다.")
);
}
//회원가입
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);
}
- AWS S3 버킷과 IAM 사용자 만들기
- Spring에서 S3 연동 설정 (application.yml, S3Client, S3Uploader)
- 회원가입 API에서 S3Uploader를 통해 업로드 및 URL 저장
내가 만든 버킷 설정 요소!
| 항목 | 설정 값 또는 선택 사항 |
|---|---|
| 버킷 이름 | qnb-profile-images |
| 리전 (Region) | ap-southeast-2 (시드니) |
| Object Ownership | ACLs disabled (Bucket owner enforced) |
| Public Access 설정 | 확인 예정 |
| Versioning (버전 관리) | Disabled |
| Tags | 없음 |
| Encryption (암호화) | SSE-S3 + Bucket Key Enabled |
여기서 나는 IAM 사용자가 왜 필요한지에 대한 의문이 들었어서 해당 내용을 찾아보았다.
Spring Boot 애플리케이션에서 AWS 리소스(S3)에 접근하려면,
AWS는 "누가" 요청했는지를 알아야 함. 이걸 위해서 인증 정보(Access Key / Secret Key) 가 필요하다. 이 인증 정보를 발급받기 위해 IAM 사용자를 따로 만드는 것!
그리고 현재 EC2를 위한 IAM 유저가 따로 존재한다. 그래서 이 유저를 사용할 수 있지 않을까 싶어 해당 유저에 S3 권한이 있는지 확인해볼까 했지만 현재 키가 따로 사용되고 있기 때문에 그냥 S3 전용 유저를 하나 만들기로 설정!
| 항목 | 설정 값 또는 선택 사항 |
|---|---|
| 사용자 이름 | qnb-s3-uploader |
| 액세스 유형 | 프로그래밍 방식 액세스 (Programmatic access) |
| 콘솔 로그인 허용 여부 | 허용 안 함 (Console access: Disabled) |
| 권한 부여 방식 | Attach policies directly |
| 부여한 정책 | AmazonS3FullAccess |
| 태그 | 없음 |
| Access Key 생성 여부 | 생성 완료 (Access Key ID & Secret Key 확보) |
implementation platform('software.amazon.awssdk:bom:2.25.8') // 버전 통합 관리
implementation 'software.amazon.awssdk:s3'
해당 코드 build.gradle에 추가!
그리고 config와 uploader까지 추가한 후에 테스트 컨트롤러를 통해서 테스트 해보았다.
해당 서버를 돌린 후 포스트맨 정상작동, 브라우저로 접속, S3에 정상적으로 업로드 된거 모두 확인했다!
사용자가 프론트에서 회원가입 + 프로필 사진 업로드
백엔드는 MultipartFile을 받아
DB에 저장할 User 객체에 profileImageUrl 필드를 포함
사용자 정보와 함께 저장
해서 모두 완료! 생각보다 빠르게 구현 완료했다