Spring Boot JDBC/실습

Java와 AWS S3로 이미지 업로드: DB 연동 및 URL 기반 포스트 관리 실습

qoeka 2025. 1. 3. 12:03

 

 

파일, 이미지는  form-date 를 선택해줘야한다.

 

 

 

이제 이미지를 저장할 버킷을 aws에가서 만들것이다

 

 

 

 

버킷 이름은 자신의 아이디를 조합하여 생성한다

비활성화를 선택하면 문제가 발생할 수 있지만, 잘못 선택하더라도 나중에 변경이 가능하다

이제, 이미지를 저장할 버킷을 AWS에서 생성한다.

 

 

 

 

 

 

 

 

 

 

AWS SDK for Java 2.x 라이브러리를 maven 에 추가

 

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>software.amazon.awssdk</groupId>
				<artifactId>bom</artifactId>
				<version>2.25.60</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	// -----------------------------------------------------
	<dependencies>

		<dependency>
			<groupId>software.amazon.awssdk</groupId>
			<artifactId>s3</artifactId>
		</dependency>

 

 

 

 

 

 

이름쓰고 밑에는 체크하지 말고 

그냥 다음다음 누른 다음 

 

이거 나오면 한번만 보여준다. 그래서 이거 다운 꼭 받아야한다.

 

 아니면 다시 만들어야 하는 불상사가 발생한다

 

단, 이건 노출되면 안됨 이게 노출되면 상대가 업로드 삭제를 마음대로 할 수 있기에 함부로 노출하면 안된다

 

application.yml 파일에 다음을 추가

spring:
  profiles:
    active: dev

cloud:
  aws:
    credentials:
      access-key: AKIA6GBMHC3MJWH46LNP
      secret-key: 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
    s3:
      bucket: block-posting
      region: ap-northeast-2

 

 

위에 노란상자는 임시로 써둔거라 방금 만들어준 IAM으로 바꿔주면된다.

region은 서울 경로지 미국경로지 알려주는거다

 

 

config 패키지 안에  S3Config 클래스 만들기  -  이건 한번 만들면 바꿀일이 없다.

 

@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.s3.region}")
    private String region;

    @Bean
    public S3Client amazonS3Client() {
        AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey);
        return S3Client.builder()
                .region(Region.of(region))
                .credentialsProvider(StaticCredentialsProvider.create(awsCreds))
                .build();
    }
}

 

Value 는 위에껄로 아래껄로 하면 위에 임폴트문삭제하고 다시 하면된다.

 

나머지 클래스 불러오기 안되면 메이븐 잘못넣어서 그런거라 위치 확인하기 이거 잘못넣어서 순간 밑에 부분 안되서 당황했다.

 

 

평소랑 다른건 이거두개 레이팅은 더블이나 인트일수있지만 우리가 포스트맨에서 택스트라고 해둔게 있기에 스트링으로한다

 

int 가 없다. 텍스트나 파일 두가지밖에 없다

 

 

위는 서비스 완성코드작성 후 이다 이거 보면서 아래의 왔다 갔다를 이해하면 편할것이다

 

 


util 패키지 안에 새로 만들어준다

 

파일을 유니크하게 만들어줘야한다 유저의 아이디와 파일 업로드 시간을 조합해서 만들어야한다. 이래야 연월일 시분초 밀리세컨드랑 유저 아이디 랑 조합해서 그래야 유니크한 파일이름이 겹치지않는 이름들이 생긴다 그래야 헷갈리지 않는다 

 

나중에도 이대로 재활용하면된다

public class UniqueFileNameGenerator {
    public static String generateUniqueFileName(long userId, String extension) {
        LocalDateTime now = LocalDateTime.now();
        String timestamp = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
        return userId + "_" + timestamp + "_" + System.nanoTime() + extension;
    }
}

 

 

 PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                .bucket(bucketName)
                .key(fileName)
                .contentLength(image.getSize())
                .contentType(image.getContentType())
                .acl(ObjectCannedACL.PUBLIC_READ)
                .build();

 

 

 

빨간 상자 아래로 어노테이션을 써야하니깐 보여주려고 위에다 쓴거일뿐이다.

아래와 같은 순서로 써주면된다.

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

 

얘가 업로드랑 다 관리하는애도 써준다.

@Autowired
S3Client s3Client;

 

 

 

 

 

 

 String imageUrl = String.format("https://%s.s3.amazonaws.com/%s", bucketName, fileName);

 

유알엘 주소 생성 후 다오에 필요한 함수를 만들러갔다 하지만sql 작성 하려는데 url 테이블이 없다 

 

그래서 새로운 컬럼을 만들어줘야한다 

 

 

 

 

 

디폴트에  '' 넣어 빈공간으로 만들어주는게 처리가 편하다

 

 

다오 완성! 다시 서비스 레츠고

 

 

서비스 완성!  컨트롤러 레츠고

 

 

코드 완성

 

 

 

 

어?...

 

당황하지 말고

 

 

 

권한 설정을 안하면 이렇게된다

 

그니깐 권한에 가서 다시 활성화를 눌러주면된다

 

 

 

해결!

 

그러면 이렇게 들어간다!

 

 

 

확인을 해보면 이렇게 잘 들어가 있음 을 확인 할 수 있다.