-
AWS S3를 이용한 사진 저장프로젝트/Trend-Pick 2023. 7. 31. 19:00
AWS의 S3를 이용해서 S3 버킷을 생성했다.
프리티어를 이용하면 20000개의 GET 요청과 2000개의 PUT, POST 요청이 월별 무료라고 한다.
기본 설정
build.gradle에 추가
implementation 'org.springframework.cloud:spring-cloud-starter-aws'
application.properties에 추가
cloud.aws.credentials.accessKey='엑세스 키' cloud.aws.credentials.secretKey='엑세스 비밀 키' cloud.aws.s3.bucket=trendpick-photo cloud.aws.region.static=ap-northeast-2 cloud.aws.stack.auto=false
S3 Configuration
@Configuration public class S3Config { @Value("${cloud.aws.credentials.accessKey}") private String accessKey; @Value("${cloud.aws.credentials.secretKey}") private String secretKey; @Value("${cloud.aws.region.static}") private String region; @Bean public AmazonS3 amazonS3Client() { AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); return AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(region) .build(); } }
Service 계층에서의 upload 로직 추가
public class S3FileService { @Value("${cloud.aws.s3.bucket}") private String bucket; private final AmazonS3 amazonS3; public String upload (MultipartFile multipartFile) throws IOException { String s3FileName = UUID.randomUUID() + "-" + multipartFile.getOriginalFilename(); // filename을 랜덤으로 생성 ObjectMetadata objMeta = new ObjectMetadata(); objMeta.setContentLength(multipartFile.getInputStream().available()); // file 사이즈 알려주는거 amazonS3.putObject(bucket, s3FileName, multipartFile.getInputStream(), objMeta); // S3의 메서드인데 파일 stream을 열어서 S3에 파일을 업로드 하는 기능 return amazonS3.getUrl(bucket, s3FileName).toString(); // 업로드 된 사진 URL을 가져오는 기능 } }
Service 계층에서 bucket을 이용해서 fine이름을 UUID로 랜덤으로 생성한 다음에 업로드 된 사진의 url을 return 해주는 로직이다.
컨트롤러에서 이미지 저장 로직 사용
@PostMapping("/create_picture") public CreatePictureDto savePicture(@RequestParam("cody_img") MultipartFile codyImg) throws Exception{ // PictureCreateDto pictureDto = new PictureCreateDto.builder() // 여기서 날라왔을 때 Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); String oriImgName = codyImg.getOriginalFilename(); String imgName = ""; String imgUrl = ""; imgName = s3FileService.upload(codyImg); imgUrl = imgLocation+"/"+ imgName; Picture picture = Picture.builder() .picture_member(member) .imgName(imgName).oriImgName(oriImgName).imgUrl(imgUrl).pictureTime(LocalDateTime.now()).build(); pictureService.save(picture); return new CreatePictureDto(picture); // codyImgService.save(picture_member,codyImg); }
가운데 보이는 s3FileService.upload() 로직으로 S3에 파일을 저장할 수 있다.
로컬로 했을 때에는 FileSerivce에서 로컬로 저장했는데 이제는 S3에 있는 저장소로 저장되게 된다.
투표를 하는 cody_image랑 post_image, member_image가 같은 S3에 들어가는게 문제인데 이 문제는 폴더를 만들거나 S3 버킷을 여러개 만드는 것을 공부해가면서 분리해야겠다.
'프로젝트 > Trend-Pick' 카테고리의 다른 글
join fetch와 left join fetch의 차이 (0) 2023.09.18 fetch join으로 성능 최적화 (0) 2023.08.16 자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select (0) 2023.07.28 비어있을 수도 있는 객체의 조회 -> Optional 사용 (0) 2023.07.27 @RequestParam과 @RequestBody의 차이점 (0) 2023.07.22