Skip to content

Commit

Permalink
Merge pull request #21 from 28th-meetup/feat/image
Browse files Browse the repository at this point in the history
[Feat] 이미지 추가를 위한 s3 세팅
  • Loading branch information
eckrin authored Nov 10, 2023
2 parents 2f84d1e + 2b6ceb0 commit 02ccf17
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 7 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ dependencies {
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//s3 bucket (img)
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kusitms.jipbap.common;
package com.kusitms.jipbap.common.utils;

import com.querydsl.core.types.Order;
import com.querydsl.core.types.OrderSpecifier;
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/com/kusitms/jipbap/config/S3Config.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.kusitms.jipbap.config;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class S3Config {

@Value("${cloud.aws.credentials.access-key}")
private String accessKey;

@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;

@Value("${cloud.aws.region.static}")
private String region;

@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

return (AmazonS3Client) AmazonS3ClientBuilder
.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/kusitms/jipbap/food/FoodController.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class FoodController {

private final FoodService foodService;

@Operation(summary = "가게 등록하기")
@Operation(summary = "음식 등록하기")
@PostMapping
public CommonResponse<FoodDto> registerFood(@Auth AuthInfo authInfo, RegisterFoodRequestDto dto) {
return new CommonResponse<>(foodService.registerFood(authInfo.getEmail(), dto));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kusitms.jipbap.store;

import com.kusitms.jipbap.common.QueryDslUtil;
import com.kusitms.jipbap.common.utils.QueryDslUtil;
import com.kusitms.jipbap.store.dto.StoreDetailResponseDto;
import com.kusitms.jipbap.store.dto.StoreDto;
import com.kusitms.jipbap.user.User;
Expand All @@ -17,7 +17,6 @@
import java.util.ArrayList;
import java.util.List;

import static com.kusitms.jipbap.store.QStore.*;
import static com.kusitms.jipbap.store.QStore.store;
import static org.springframework.util.ObjectUtils.isEmpty;

Expand Down
44 changes: 41 additions & 3 deletions src/main/java/com/kusitms/jipbap/test/TestController.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
package com.kusitms.jipbap.test;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.kusitms.jipbap.auth.exception.InvalidEmailException;
import com.kusitms.jipbap.common.response.CommonResponse;
import com.kusitms.jipbap.security.Auth;
import com.kusitms.jipbap.security.AuthInfo;
import com.kusitms.jipbap.user.User;
import com.kusitms.jipbap.user.UserRepository;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
@Slf4j
public class TestController {

private final UserRepository userRepository;
private final AmazonS3 amazonS3;

@Value("${cloud.aws.s3.bucket}")
private String bucket;

/**
* 커넥션 테스트용 컨트롤러
Expand All @@ -34,4 +47,29 @@ public String test2(@Auth AuthInfo authInfo) {
User user = userRepository.findByEmail(authInfo.getEmail()).orElseThrow(()->new InvalidEmailException("회원정보가 존재하지 않습니다."));
return "Healthy Connection";
}

@Operation(summary = "s3 이미지 저장, 조회 테스트용 컨트롤러")
@PostMapping("/image")
public String saveImageTest(@RequestParam("file") MultipartFile file) {
try {
return saveFile(file);
} catch(IOException e) {
log.info("s3 이미지 저장 테스트 중 IOException 발생");
return null;
}
}


// 파일 저장 후 uri 반환
private String saveFile(MultipartFile multipartFile) throws IOException {
String originalFilename = multipartFile.getOriginalFilename();

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());

amazonS3.putObject(bucket, originalFilename, multipartFile.getInputStream(), metadata);
return amazonS3.getUrl(bucket, originalFilename).toString();
}

}
14 changes: 14 additions & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,20 @@ spring:
host: ${REDIS_URL}
port: ${REDIS_PORT}

cloud:
aws:
s3:
bucket: ${BUCKET_NAME}
credentials:
access-key: ${BUCKET_ACCESS_KEY}
secret-key: ${BUCKET_SECRET_KEY}
region:
static: ap-northeast-2
auto: false
stack:
auto: false


secret:
pwd: ${SECRET_PWD}
jwt: ${SECRET_JWT}

0 comments on commit 02ccf17

Please sign in to comment.