토이 프로젝트로 혼자서 클라우드 서비스를 이용하여 웹 개발부터 배포까지 온 과정을 경험해 보았습니다.
이 과정을 단계별로 나누어서 정리해 보려고 합니다.!
많은 피드백은 감사합니다!
목차
STEP 01) NCP 서버
STEP 02) AWS RDS, S3
STEP 03) Web Application 개발
STEP 04) Jenkins pipeline 배포
STEP 05) Domain 등록
* Web Application 개발은 앞에서 살펴보았던 AWS 서비스를 사용하는 방법만 소개하도록 하겠습니다.
개발 환경
- SpringBoot 2.6.6
- Mariadb 2.7.5
- Gradle 7.4.1
1. RDS 연결(yml 설정)
spring:
datasource:
url: jdbc:mariadb://rds end point 주소 + prot + schema name
예) jdbc:mariadb://rds.amazonaws.com:3306/rdstest
driver-class-name: org.mariadb.jdbc.Driver
username: admin
password: 패스워드
2. S3 연결
1. spring cloud starter 의존성 추가
- build.gradlew
implementation 'io.awspring.cloud:spring-cloud-starter-aws:2.3.1'
2. yml 설정
cloud:
aws:
credentials:
access-key: access key
secret-key: secret key
s3:
region: ap-northeast-2
endpoint: s3-bucket
- access key, secrey key 새 액세스 키 만들기로 생성
- region, endpoint 작성
endpoint는 :::뒤에 복/붙
AwsS3Config.java
package com.bumblebee.dailyspecial.domain.aws;
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;
/**
* @author bumblebee
*/
@Configuration
public class AwsS3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.s3.region}")
private String region;
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.build();
}
}
AwsS3Service.java
package com.bumblebee.dailyspecial.domain.aws;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.bumblebee.dailyspecial.domain.comutils.CommonUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/**
* @author bumblebee
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class AwsS3Service {
private final AmazonS3Client amazonS3Client;
@Value("${cloud.aws.s3.endpoint}")
private String bucketName;
public String uploadFileV1(String category, MultipartFile multipartFile) {
validateFileExists(multipartFile);
String fileName = CommonUtils.buildFileName(category, multipartFile.getOriginalFilename());
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(multipartFile.getContentType());
try (InputStream inputStream = multipartFile.getInputStream()) {
amazonS3Client.putObject(new PutObjectRequest(bucketName, fileName, inputStream, objectMetadata)
.withCannedAcl(CannedAccessControlList.PublicRead));
} catch (IOException e) {
// throw new FileUploadFailedException();
}
return amazonS3Client.getUrl(bucketName, fileName).toString();
}
private void validateFileExists(MultipartFile multipartFile) {
if (multipartFile.isEmpty()) {
// throw new EmptyFileException();
}
}
}
AwsS3Config class에 amazonS3Client 메소드를 @Bean으로 등록합니다.
파일을 업로드가 필요한 로직에 AwsS3Service class에서 uploadFIleV1 메소드를 이용해서 S3에 업로드 합니다.
예)
awsS3Service.uploadFileV1("Img", multipartFile);
그 외 다운로드 및 다중 업로드 기능도 제공하고 있습니다.
참조
'Spring' 카테고리의 다른 글
[Spring] @Value 애노테이션 null 점검 (0) | 2022.10.20 |
---|---|
[Spring] 동시성 해결(ThreadLocal) (0) | 2022.09.06 |
[SpringBoot] Interceptor 적용하기 (0) | 2022.06.23 |
[SpringBoot] Filter 적용하기 (0) | 2022.06.22 |
토이 프로젝트 _ STEP 02(AWS S3) (0) | 2022.06.12 |