본문 바로가기

반응형
SMALL

Project/Nuwa

(21)
Nuwa Project - Spring Boot Admin (모니터링) 현 프로젝트는 EC2 서버 한대로 한 개의 어플리케이션만 동작을 시키고 있어서 다양한 모니터링 툴 중에서 라이트하게 사용 하기 좋은 Spring Boot Admin을 사용하기로 했습니다. Spring Boot Admin을 사용하기 위해선 client와 server 따로 Spring Boot 프로젝트를 만들어야하고 이미 EC2 메모리 부족도 경험을 한 상태여서 하나의 인스턴스에 더 넣을 수 없다고 판단을 했습니다. 그래서 EC2는 과금이 무섭고.. 좋은 방법이 없을까 생각하다 ! 평생 무료인 Oracle Cloud를 한번 사용을 해보자 생각을 했습니다. 먼저.. 처음부터 난관이였습니다. 처음 이메일 인증부터 갑자기 백색 화면이 되더니.. 새로고침 후 다시 시도하니 요청 수 초과가 등장했습니다. 다시 시도를..
Nuwa Project - HikariCP pool 리소스 해제(issue) DB Connection Pool 부족 프로젝트를 진행하면서 DB 커넥션이 부족한 현상이 나타났습니다. 프론트에서 API 요청을 했는데 요청이 되지 않았고 해당 내용을 위해 로그를 확인했습니다. 분명 Transaction을 사용하여 비지니스 로직을 수행 후 정상적으로 커넥션 반환이 되는 것도 확인을 했었는데 어느 부분에서 커넥션을 지속해서 연결을 하고 있는지 찾아야했습니다. 아래에 yml 설정을 넣어 datasource: hikari: leak-detection-threshold: 30000 커넥션 누수가 발생하는 지점을 위해 추가를 해줬습니다. 누수 지점을 확인해보니 SSE subscribe를 할 때 누수가 발생을 했습니다. 현재 jpa open-in-view 가 활성화가 되어 있어서 서비스와 레포지토..
Nuwa Project - EC2 메모리 부족 현상 처음 서버 구축 당시에 EC2 서버에서 내 레포지토리를 Pull을 받은 후 jar 파일을 찾아 미리 작성한 start.sh를 이용하여 애플리케이션을 실행하고 stop.sh를 이용하여 종료하고 다시 배포하는 과정을 거치다가 CI/CD를 이용하여 편리하게 배포를 해보자! 이렇게하여 Github Actions, AWS S3, CodeDeploy를 사용하여 자동화 배포를 진행을 해보고 Downtime이 생기는 것을 방지하기 위해 Github Actions, Nginx, Docker, docker-compse를 이용하여 블루/그린 전략으로 자동화 배포를 성공한 적이 있었습니다. 현재도 동일한 방법을 사용하고 있었고 docker-compose로 현재 컨테이너가 무엇이 실행 중인지를 찾아 green -> blue b..
Nuwa Project - S3 Delete File (issue) AWS S3를 사용하여 이미지와 파일 업로드를 구현을 하고 이제 삭제 로직을 추가를 해야했습니다. 처음엔 DB에 저장된 URL을 가져와서 파일 이름만 가져오게 파싱을 진행하고 삭제 로직을 보냈지만.. 정상적으로 삭제가 되지 않았습니다. 그래서 검색 도중 파일명을 일치를 시켜줘야 된다는 것을 알게 되었습니다. (기존에 사용했을 땐.. 되는 것 같았는데) 하여튼 현재 사용하는 로직에 파일 이름을 decoding 해주고 보내주니 정상적으로 삭제에 성공했습니다. public void deleteFile(String fileUrl, FileType fileType) { int lastIndex = fileUrl.lastIndexOf("/") + 1; String fileName = fileUrl.substring..
Nuwa Project - MongoDB 해킹 (issue) 오늘은 프론트분과 소켓 관련 채팅 작업 진행 도중 생겼던 문제입니다. MongoDB로 데이터가 제대로 들어오는지 확인을 하던 도중 갑작스럽게 데이터가 사라졌습니다. 혹시나 프론트에서 잘못 요청하면 데이터가 사라지나..? 그럴 수가 있을까? 서로 상의를 하고 있었고 그 사이에 전 docker로 생성한 mongodb 컨테이너 로그를 확인했습니다. 다양한 로그들 사이에 drop database를 발견을 할 수 있었습니다. 그래서 로그를 살펴보니 drop database가 된 후에 새롭게 collection이 생성이 된 것을 확인했습니다. "namespace":"READ__ME_TO_RECOVER_YOUR_DATA.README" 이런 collection이 생성이 되어 있었고 데이터를 복구를 하려면 읽으라고 나와..
Nuwa Project - Monitoring (Actuator & Prometheus & Grafana) 프로젝트를 진행을 할 때 모니터링이 필요하다고 느껴졌습니다. 오류는 Sentry를 사용해서 보고 있었기 때문에 문제는 따로 없었지만 서버 로그를 확인을 하려면 서버에 접속을 해서 확인을 해야되는 문제점이 생겼습니다. 그래서 Actuator와 Prometheus 그리고 시각화를 도와주는 Grafana를 사용하기로 했습니다. Actuator : 매트릭 정보를 쉽게 제공을 합니다. Prometheus: 매트릭 정보를 수집 및 저장을 합니다. Grafana: 수집된 매트릭 정보들을 사용자에게 보기 좋게 대시보드 형태로 제공합니다. 프로젝트에 적용 전 먼저 빈 프로젝트를 생성하여 로컬에서 확인을 진행을 했습니다. build.gradle implementation 'org.springframework.boot:sp..
Nuwa Project - 문자열 Decode S3 업로드를 로직을 작성을 한 후에 해당 URL을 파싱을 한 후에 데이터 베이스에 원본 파일 이름을 저장을 하려고 했습니다. 해당 URL 값을 가져온 후 제가 설정한 URL 값에서 underbar 또는 slash 를 기준으로 파싱을 하여 값을 가져왔습니다. 이렇게 가져오면 이름 값은 %20과 같이 인코딩 된 값으로 가져와졌습니다. %E1%84%91%E1%85_2024-02-25T20%3A01%3A35.392840.pdf 다음과 같은 형태로 데이터가 넘어왔습니다. 이 형태에서 파일 이름으로 저장을 하기 위해 URLDecoder를 사용해서 데이터를 넘겼습니다. // 파일 원본 이름 private String getOriginFileName(String fileUrl) { int slashIndex = fi..
Nuwa Project - Querydsl 정렬 Nuwa Project - Querydsl 적용기 이번 프로젝트 진행에서 처음으로 Querydsl을 사용을 해보고자 했습니다. 이전까진 항상 JPQL을 사용을 해서 쿼리를 구현을 했었는데 동적 쿼리를 구현을 할 때 굉장히 힘들게 구현을 했습니다. 검 classruntime.tistory.com Querydsl을 사용을 하던 도중 하나의 로직으로 동적으로 정렬하고 싶었습니다. 정렬을 하려고 하는 기준에 따라 내림차순 또는 오름차순으로 만들고 싶었습니다. public Slice fileList(Long workSpaceId, String fileExtension, FileType fileType, Pageable pageable) { log.info("파일 조회 Query"); List fileInfoRes..

반응형
LIST