개발일지 82

[spring boot] S3 게시판(이미지 처리) delete 기능 완성

🏕️상황 처음에는 아래의 코드만 있으면 바로 삭제가 될 줄 알았다. public void deleteFile(String fileName) { DeleteObjectRequest request = new DeleteObjectRequest(bucket, fileName); amazonS3Client.deleteObject(request); } 그런데 나는 기존에 임시경로는 "temporary/"로 정식경로는 "final/"로 설정했기 때문에 이에 맞게 코드를 구성하려고 했다. 위의 코드는 루트 디렉터리 기준이고 나는 키(key) 구조를 활용해서 폴더 같은 형식으로 진행하고 싶었기 때문에 추가적인 코드 작업을 할 계획이었다. 하지만.... Amazon S3에서는 특정 폴더 내에 있는 파일을 삭제하기 위해 ..

[post men] 415 error - Content-Type

🏕️상황 post men에서 post 방식으로 테스트를 진행하고 있었는데 계속 저런 오류가 발생하였다. + 🗝️해결 클라이언트 요청 헤더에 Content-Type을 올바르게 설정했는지 확인해야 합니다. 보내는 데이터의 형식에 따라서 Content-Type을 적절히 설정해야 합니다. 예를 들어 JSON 데이터를 보낼 때는 Content-Type을 application/json으로 설정해야 합니다.

[spring boot] S3 이미지 처리_업로드 구조 변경(api 분리)

> 게시글에 이미지를 올린다. 그럼 프런트 단에서 이벤트 감지 기능으로 api를 호출한다. (유효성 + 사이즈 검사를 진행 후 S3 임시 경로에 이미지들을 업로드한다.) 임시 경로가 포함된 해당 이미지의 URL을 반환한다. 사용자가 게시글까지 작성 후에 [등록하기]를 누르면 게시글은 게시글 DB에 저장, 이미지는 임시경로 🔜 정식경로로 이동시킨 후에 정식 경로로 변경된 url을 다시 반환받는다. public class imageService { @Autowired private AmazonS3 amazonS3; private final AmazonS3Client amazonS3Client; private final imageRepository repository; @Value("${cloud.aws.s3..

🤦🏻‍♀️고민하기 - 게시판에서 이미지 api에 대한 처리 방식

🏕️상황 > 나는 일단 하나의 api를 통해서 게시글의 내용들 + 이미지를 한 번에 처리하도록 구현하였다. 이미지를 포함한 게시판 기능을 계속해서 개발하던 중에 프런트 팀과 이야기를 나누게 되었는데 그 팀원의 의견은 다음과 같았다. 1. 예를 들어 사용자가 정상적인 이미지를 올리지 못하거나, 업로드에 실패했을 시에 하나의 api로 진행하게 되면 작성 중이던 게시글까지 날아가게 되니 사용자 입장에서 불편할 수 있는 상황이 생길 것이다. 2. api 분리를 하면 CDN을 이용해서 좀 더 빠르게 렌더링을 할 수 있을 것이다. 하지만 나는 아무리 생각해도 하나의 api로 처리를 하는 것이 괜히 일을 2번 만들지 않고 간단하게 진행하는 방법이라고 생각했기 때문에 생각이 좁혀지지 않았고, 결국 멘토분께 조언을 구하..

[aws] 프로젝트 build와 jar 파일 실행의 차이

🏕️상황 간신히 [.gradlew build] 명령어를 통해서 빌드를 했는데 내가 원하는 건 막 요상한 그림이 나오면서 프로젝트가 '실행'되는 것인데 저렇게 build successful 이라는 글씨만 예쁘게 나오고 끝(?)나는 것이다...ㅠㅠ 원래 프로젝트가 실행되면 서버 엔드포인트를 호출 했을 때 요청에 대한 값이 나오는데 저렇게 502 오류가 발생. 🛣️과정 멘토분께 여쭤보니 굉장히 챙피한 일이었다... 개념 부족으로 인하여 당연한 일을 못한 것이다...ㅎ 🗝️해결 빌드하면 나오는 jar파일을 실행시키셔야죠 라고 하셨다!! 그래서 확인해보니 build를 하면 jar 파일이 생성되고, 그 파일을 java -jar 와 함께 실행시키면 된다. 💚./gradlew build Gradle은 프로젝트의 빌드,..

[aws] RDS DB이름 확인하기

🏕️상황 RDS 연결정보를 입력하기 위해서 중간에 DB이름을 적어야 해서 확인하려 들어갔더니 빈 값이 있는 것이다? 그래서 검색을 해보았는데 가장 많이 나오는 DB이름을 생성하는 방법은 데이터 베이스 생성 시에 만드는 것이다. 하지만 나의 경우에는 이미 만들어져 있는 데이터 베이스가 존재했기 때문에 위의 방법을 사용할 순 없었다. 그래서 지난번에 빌드에 성공했을 때 이미 만들어져 있을 것으로 예상이 되어서 mysql 쉘을 통해서 확인해 보기로 하였다. 🗝️해결 mysql -h your-rds-endpoint -P your-rds-port -u your-username -p 위의 명령어를 내 정보에 맞게 입력하니 바로 mysql 쉘이 등장하였다. 즉, 인스턴스를 통해 RDS에 접근한 것이다. show da..

[spring boot] aws 백엔드 배포하기(3. 서버 빌드 오류잡기)

🏕️상황 오류 메시지들을 다 검색해 보니 결국은 다 하나였다. DB연결이 안 된다는 것!! 이것 때문에 거의 1주일 안 되게 소모를 해버렸다... 원래 우리는 ENC() 방식을 사용해서 DB정보를 암호화했었는데 복호화를 aws에서도 진행하려면 KMS를 사용하거나 좀 더 복잡한 방식을 사용해야 해서 정보 자체를 환경변수에 저장하는 방식으로 가기로 했다. 🛣️과정 여기에 우리가 로컬에서 사용했던 db정보를 넣고 "왜 안 되냐ㅠㅠ"를 외쳤다..ㅋㅋㅋㅋㅋㅋㅋㅋ ec2에서 빌드하려면 rds 연결정보를 넣어야 했는데 바보 같은 짓을 하고서는 고통스러워했다. 인터넷에 있는 것들을 보면 대부분은 '퍼블릭 액세스 허용'을 하여 접근하는 방식이 많이 나와 있지만 그렇게 하면 보안상의 취약점이 생기기 때문에 최대한 저 방식..

[spring boot] aws 백엔드 배포하기(2. 서버에서 빌드)

🏕️상황 우리 프로젝트는 JAR 파일을 사용하여 Java 코드 빌드 방식을 활용했다. 현재 서버에 public ip가 없어서 스프링 코드를 scp 등의 명령어를 이용해 업로드할 수 있는 구조가 아니다 보니 NAT gateway를 설정했다. (NAT gateway가 있으면 private subnet에 있는 서버라고 하더라도 외부 인터넷에 outbound 요청은 가능) private subnet에 있지만 NAT gateway를 설정했기에 직접적인 inbound 요청은 모두 차단하는 상태이다. (대신 서버에서 outbound 요청은 가능하다.) 그래서 직접적으로 파일을 업로드하는 것은 안 되고, git clone, git pull은 가능한 형태이다. 🗝️해결 1. Session Manager로 인스턴스로 접근..

[spring boot] 게시판(이미지 처리) Create, Read 기능 구현

🏕️상황 원래 게시판 쪽은 내 담당이 아니었지만 사성으로 인하여 게시판도 내가 맡게 되었다. 이번에 내가 맡으면서 글 작성만 가능했던 게시판에 이미지 기능도 추가하였다. 🗝️개발 코드 게시글 작성 코드 // BoardService public ResponseDTO create(final Board entity, final List imageList) { try { validate(entity); boardRepository.save(entity); //이미지를 뺀 나머지 컬럼 저장 imageService.upload(imageList, entity.getId()); //이미지 저장 코드 return ResponseDTO.success(boardRepository.findById(entity.getId()..