JPA 37

[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..

[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()..

🤦🏻‍♀️고민하기 - entity 클래스_관련은 있지만 저장되지 않는 컬럼을 어떻게 처리해야 하나?

🏕️상황 Board entity의 image 컬럼 자료형이 list 형이면 DB에 저장되는 컬럼이 아니고, 다른 엔티티 클래스와의 관계를 정의하는 컬럼이다. 정석(?)의 방식이라면 Image 엔티티에서도 [private Board board] 으로 관계를 정의하는 것이 맞지만, 다른 부분에서 개발하면서 저렇게 양쪽에서 하는 방식을 해보니 굳이 Many쪽(Image) 엔티티에서는 board 컬럼이 있는 필요가 없다는 생각이 들었다. 왜냐?? 저렇게 Board 자료형을 사용하면 굳이 Image에서는 board 테이블을 조회할 필요가 없는데, Hibernate에서 board 관련 쿼리를 날리기 때문에 오히려 불필요한 쿼리를 발생시키는 느낌이 들었다. 그래서 그냥 다음과 같이 정의해버렸다. 이렇게 구성하고 im..

[spring boot] aws 백엔드 배포하기(1. jar파일로 빌드)

🏕️상황 원래는 7월에는 배포를 진행할 예정이었는데, 여차저차 미뤄지게 되었다. 그래서 한이음 팀장님이 더 이상 미뤄지면 안 될 거 같다고 얘기하기도 했고, 나의 경험 측면에서도 하루빨리 서버 배포를 해보는 것이 도움이 될 거 같다는 생각에 당장 배포를 제1의 목표로 가지게 되었다. 하지만 맨날 로컬 환경에서 기능 개발이나 해봤지.. 이쪽 aws, 서버 세계는 이번이 완전 처음이라 두려움이 앞섰다. 멘토분과 멘토링을 통해 서버 배포 진행 : - 장점 1. 내가 편하다. 2. 몰라서 헤매는 과정 없이 빠르게 배포를 할 수 있다. -단점 1. 내 실력 향상엔 내가 직접 하는 것보단 좋지 않다. 2. 그 과정을 내가 직접 하지 않았기 때문에 추후 유지/보수에 오히려 어려움이 생길 수 있다. 3. 멘토님과 진행..

list null(empty)체크하기

🏕️상황 list형인 변수 imageList에 아무런 값이 들어있지 않다면 해당 메서드가 실행되면 안 되는데 저렇게 조건을 2개나 걸었는데도 계~~ 속 메서드가 실행되는 것이다..? 그래서 다른 방법을 모색해 보았다. 🚋과정 list에서 null을 체크하는 방법으로는 대충 3가지가 있다고 한다. list.isEmpty() list.size() CollectionUtiles.isEmpty() 근데 모두 upload 메소드가 실행되었다.... 🗝️해결 자세히 알아보니 post men에서 아무런 값을 전달하지 않으면 null 값이 아니라 empty라고 한다. imageList 변수는 초기화 시점에 이미 빈 리스트로 생성되었기 때문에 null이 아닌 비어있는 리스트가 된다. 그래서 나의 경우에는 != null ..

[Spring boot] s3 이미지 업로드 구현(완성)

https://grogrammer.tistory.com/66 Spring boot_s3 이미지 업로드 구현(초안) 🏕️기존 상황 이미 S3 버킷은 만들어져 있는 상황이었고 모든 권한을 가진 iam 유저도 1명 있는 상태였다. 그 상황에서 더 추가적으로 필요한 것들을 추가해서 개발하였다. 🔺S3연동을 위해 해 grogrammer.tistory.com 🏕️상황 위에 있는 블로그에 쓰여있듯이 지난번에는 이미지가 S3 버킷에 잘 올라가는지 확인하는 용도였다. (아직 남은 개발 사항이 있는 상태) 현재 우리 프로젝트에서 이미지를 다루는 부분은 게시판 부분인데, 게시판 쪽 코드와 합쳐서 게시글과 이미지가 하나가 되도록 만들어야 했다. 🔜 현재 완료 이미지 1개만 업로드가 가능했는데 다중 이미지 업로드 기능을 구현해..

@PathVariable, @RequestParam의 차이점

🏕️상황 @GetMapping("/list/{schId}") public ResponseDTO boardList(@PathVariable("schId") Long schId, @RequestParam(name = "cateNo") Long cateNo) 다음과 같은 코드가 있을 때, URL 경로에는 cateNo라는 값이 없는데 왜 매개변수에는 있는지 의아했다. 🗝️해결 @PathVariable("schId") Long schId: @PathVariable은 URL 경로에서 특정 변수를 추출하는데 사용된다. schId라는 변수명으로 URL 경로에서 값을 추출하여 Long 데이터 타입으로 매핑하게 된다. 예를 들어, URL 경로가 "/schedule/123"인 경우, schId 변수에는 123이 할당된다. ..