NCP

DAY 58 - NCP (2024.09.26)

summ.n 2024. 9. 26. 11:35

Object Storage

 



본인 고유 번호로 !!! 아니면 충돌 난다~!








파일명은 네이버클라우드에 저장되고

실제이미지는 Object Storage에 저장이 된다 !!!

 

Amazon  서버 설정

Folder: imageboard.service

File: NCPObjectStorageService.java

package imageboard.service;

public class NCPObjectStorageService{
	private String accessKey = "";
}

이렇게 key를 주면 안 좋다. properties로 빼는게 좋다 ! 아니면 남들도 다 들어오므로 

하지만 properties로 빼는건 나중에 할거임.

package imageboard.service;

public class NCPObjectStorageService{
	private String accessKey = ""; //접근할 수 있는 키값
	private String secretKey = ""; //보안 키값
	private String regionName = "";
	private String endPoint = "";
}



난 두 개가 있는데,,, 일단 밑에껄로 했다 !

package imageboard.service;

public class NCPObjectStorageService{
	private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
	private String secretKey = ""; //보안 키값
	private String regionName = "kr-standard";
	private String endPoint = "https://kr.object.ncloudstorage.com";
}

final AmazoneS3 s3;

 이 Amazon을 사용하려면 jar 파일이 많이 필요하다 !! 다운받아보자 !!

 

① aws-java-sdk-s3 검색
② aws-java-sdk-core 검색 - 스프링에서 할때는 자동으로 의존성이 처리되지만, 여기서는 직접 jar를 넣어주어야 한다.

aws-java-sdk-s3-1.12.767.jar
aws-java-sdk-core-1.12.767.jar
commons-logging
jackson-databind
jackson-core
jackson-annotations

httpclient
httpcore

joda-time

jaxb-api


https://mvnrepository.com/

 

aws-java-sdk-s3-1.12.767.jar

 




aws-java-sdk-core-1.12.767.jar


commons-logging


jackson-databind


jackson-core


jackson-annotations


httpclient


httpcore


joda-time


jaxb-api


D:\AWS S3\lib


서버끄고 프로젝트 Clean 하기 !!

AmazonS3가 import 되는 것을 확인할 수 있다.

package imageboard.service;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

public class NCPObjectStorageService{
	private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
	private String secretKey = ""; //보안 키값
	private String regionName = "kr-standard";
	private String endPoint = "https://kr.object.ncloudstorage.com";
    
	final AmazonS3 s3; //s3 - Object Storage 보관하는 곳
	
	public NCPObjectStorageService() {
		s3 = AmazonS3ClientBuilder
				.standard()
				.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
				.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
				.build();
	}
}

 

s3 - Object Storage 보관하는 곳

s3에 대해 환경설정을 잡아주는데 endPoint로 저장할 수 있는 포인트 줌


imageboardWriteAJaxService.java

		//실제폴더
		String realFolder = request.getServletContext().getRealPath("/storage");
		System.out.println("realFolder = " + realFolder);

storage라는 realFolder로 올라간다.

 

		MultipartRequest multi = new MultipartRequest(
				request, 
				realFolder, //이미지가 저장되는 위치
				5 * 1024 * 1024, //5MB
				"UTF-8",
				new DefaultFileRenamePolicy());

여기까지해서 이미지가 업로드 된다.

 

		//데이터
		String imageId = multi.getParameter("imageId");
		String imageName = multi.getParameter("imageName");
		int imagePrice = Integer.parseInt(multi.getParameter("imagePrice"));
		int imageQty = Integer.parseInt(multi.getParameter("imageQty"));
		String imageContent = multi.getParameter("imageContent");
		String image1 = multi.getOriginalFileName("image1");
		String fileName = multi.getFilesystemName("image1"); //파일명만 DB에 저장

데이터 얻어왔다.

fileName

file에대한 정보를 가지고있는게 아닌 이름만 가지고 있기 때문에 파일정보 객체를 생성해준다.

 

파일 객체 생성

		//파일 객체 생성
		File file = new File(realFolder, image1);

 

Object Storage(NCP)의 새로운 이미지 올리기

		//Object Storage(NCP)의 새로운 이미지 올리기
		NCPObjectStorageService ncp = new NCPObjectStorageService();

업로드하려면 필요한 것

우리는 bucket이라는 것을 생성해놨다. 

그 이름 필요 !!

public class ImageboardWriteAJaxService implements CommandProcess {
	private String bucketName = "bitcamp-9th-bucket-132";
		//Object Storage(NCP)의 새로운 이미지 올리기
		NCPObjectStorageService ncp = new NCPObjectStorageService();
		ncp.uploadFile(bucketName, "storage/", file);


NCPObjectStorageService.java

fileIn = new FileInputStream(file);

 

  파일 안에 있는 이름을 읽어와라

 

ObjectMetadata objectMetadata = new ObjectMetadata();

 

  Metadata는 파일의 정보를 얘기하는 것 jpa, png ~~ 이런거랑 파일의 크기 이런 거 올려야하는데   metadate가 담고 있다.

 


objectMetadata.setContentType("image/jpeg");

 

 이런식으로 contentType을 잡아버리면 다른  png, jpg이런건 안올라간다.

 이렇게하면 if문으로 걸어야되는데

 이렇게 하기 싫으므로 !!!

Path path = Paths.get(file.getAbsolutePath());

 

절대경로를 얻어와서 파일이 어떤 파일인지 알아내는 것 !


String contentType = null;

try {

      contentType = Files.probeContentType(path);

} catch (IOException e) {

      e.printStackTrace();

}

 


objectMetadata.setContentType(contentType); //파일의 contentType도 잡았고

objectMetadata.setContentLength(file.length()); //파일의 길이도 잡았다.

 

파일의 contentType도 잡았고 파일의 길이도 잡았다.

 

 

PutObjectRequest putObjectRequest =

new PutObjectRequest(bucketName,

directoryPath + fileName,

fileIn,

objectMetadata)

.withCannedAcl(CannedAccessControlList.PublicRead);  //리소스에 대한 접근 권한
//모든 사용자가 객체를 읽을 수 있지만, 수정과 삭제는 불가능하다. -- 나만 가능하다는 것

 

 

객체까지 다 만들었으니 이제 올리자.

 

s3.putObject(putObjectRequest);

 

 이렇게 하면 이제 올라가는 것 !


NCPObjectStorageService.java  전체코드

package imageboard.service;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class NCPObjectStorageService{
	private String accessKey = "DA4C49B42C898921242E"; //접근할 수 있는 키값
	private String secretKey = ""; //보안 키값
	private String regionName = "kr-standard";
	private String endPoint = "https://kr.object.ncloudstorage.com";
	
	final AmazonS3 s3; //s3 - Object Storage 보관하는 곳
	
	public NCPObjectStorageService() {
		s3 = AmazonS3ClientBuilder
				.standard()
				.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
				.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
				.build();
	}

	public void uploadFile(String bucketName, String directoryPath, File file) {
		String fileName = file.getName();
		FileInputStream fileIn = null;
		try {
			fileIn = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		ObjectMetadata objectMetadata = new ObjectMetadata();
		//objectMetadata.setContentType("image/jpeg");
		
		Path path = Paths.get(file.getAbsolutePath());
		String contentType = null;
		try {
			contentType = Files.probeContentType(path);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		objectMetadata.setContentType(contentType);
		objectMetadata.setContentLength(file.length());
		
		PutObjectRequest putObjectRequest =
				new PutObjectRequest(bucketName, 
								     directoryPath + fileName,
								     fileIn,
								     objectMetadata)
				.withCannedAcl(CannedAccessControlList.PublicRead); //리소스에 대한 접근 권한
				//모든 사용자가 객체를 읽을 수 있지만, 수정과 삭제는 불가능하다.
		s3.putObject(putObjectRequest);
	}
}

이미지 등록해보기 !



https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132/storage/%EC%82%AC%EA%B3%BC.jpg

 

https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132 이거 그대로 복사해서

 

 

imageboardList.jsp

             <td>
                <a href="#">
                    <!-- src="가상폴더의 위치" -->
                    <img src="https://kr.object.ncloudstorage.com/bitcamp-9th-bucket-132/storage/${imageboardDTO.getImage1()}" alt="${imageboardDTO.getImageName()}" width="100" height="100" />
                </a>
            </td>


이렇게 지우려하니 에러 발생한다 !!!

delete from imageboard;

 

11:11:25 delete from imageboard Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.  To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.672 sec

얘를 해제하던가 ! 아니면

 

set sql_safe_updates=0;

이렇게하면 lock이 풀린다.

delete from imageboard;

다시하면 잘 지워지는 거 확인 가능 !!


 

잘 올라온 거 확인 가능 !!


이렇게 같은 거 두 개 올리게 되면 하나만 올라온다.


계속 다르게 올리고싶으면

NCPObjectStorageService.java

	public void uploadFile(String bucketName, String directoryPath, File file) {
		//String fileName = file.getName();
		String fileName = UUID.randomUUID().toString();

 

이렇게하면 숫자형식으로 다르게 올라가게된다.

똑같은 이미지를 올려도 이런식으로 다르게 올라간다.

그러므로 나중에 확인할 때는 날짜로 확인해야한다.


코드 추가하기 !!

NCPObjectStorageService.java

public String uploadFile(String bucketName, String directoryPath, File file) {
		return fileName;

ImageboardWriteAJaxService.java

image1 = ncp.uploadFile(bucketName, "storage/", file);

 

 

 

select * from imageboard;

위에처럼 해야 DB에도 저런식으로 숫자로 올라가는 거 확인할 수 있다 !!