사이드 프로젝트 13

간헐적으로 JUnit5 테스트가 깨지는 문제

문제 사항 테스트코드가 40개를 넘어가면서 갑자기 그 이후로 간헐적으로 깨짐이 발생했다. 처음 생겼던 에러는 다음과 같았다. org.hibernate.exception.JDBCConnectionException: Unable to release JDBC Connection [The database has been closed [90098-224]] [n/a] 문제해결 시도 해당 에러를 검색해보니 원인은 다양했다. 1. H2 데이터베이스 설정 확인 H2 데이터베이스가 테스트 하나 실행하고 닫지 않도록 DB_CLOSE_DELAY=-1; 을 추가했다. 테스트가 독립적으로 실행하니깐 H2에 필요로 하는 커넥션이 많아진것으로 예상이 되어 HikariCP maximum pool size을 100개로 늘렸다. dat..

무결성 제약조건이 위배되는 경우에 대한 예외처리는 어디서 할까

문제 상황 같은 키를 가진 프로젝트를 생성하면 UNIQUE 제약조건에 의해 예외(DataIntegrityViolationException)가 발생한다. 4가지 방법 1. 서비스계층에서 flush + try catch 엔티티를 저장하고 unique key에 의해 중복이 감지되면, try catch를 통해 예외 변화를 하면 된다. flush를 해야하는 이유는 @Transactional 이 붙은 메서드에서 사용되는 CrudRepository의 save()와 saveAll()은 메서드를 호출할 때 바로 쿼리를 실행하지 않고 1차캐시에 우선적으로 저장했다가 메서드가 정상적으로 종료되면 커밋이 되어 실제 DB에 반영된다. try-catch 블럭 내부에서는 쿼리가 실행되지 않으니 잡아낼 DataIntegrityVio..

NGINX 로그가 드러낸 미확인 공격 시도 - SSL 적용

문제 배경 로컬에서 정상적으로 API를 만들고 POSTMAN으로 테스트까지 해보고 배포를 했다. 하지만 정상적으로 요청이 오질 않아(404 error) NGINX 로그를 살피던 도중 의도치 않게 다른 문제를 발견하게 되었다. (위 문제는 Reverse Proxy 설정을 잘못한거라 해결했다) 에러로그가 굉장히 많이 쌓여 있었고 그중 수상하게 용량이 매우 크고 에러로그(error.log.6.gz)가 있길래 한번 살펴봤다. 가장 첫번째 줄에 client: 124.156.187.113의 위치를 한번 검색해봤다. 무슨 홍콩 지역이 나온다. 그리고 request: "HEAD /Core/Skin/Login.aspx 이라는 요청을 보낸다. Login.aspx 이란, https://dotnet.microsoft.com/..

스토리지 용량 늘리기 (EBS)

처음 인스턴스를 시작할 때 스토리지 구성을 건들지 않았다. 스토리지 유형은 EFS, Amazon EC2 Instance Store, EBS, S3가 있다. 아마존 EBS는 인스턴스 중지나 종료에 상관없이 데이터가 유지되어 있는 영구 스토리지 이며, EC2 인스턴스를 생성할 때 프리티어로 사용할 경우 root 디바이스 유형이 기본적으로 EBS로 되어있다. 최대 30GB까지 EBS 범용 SSD를 사용할 수 있는데 난 8GiB로 설정을 해버려서 다음과 같이 프로젝트를 시작한지 몇 주만에 30%의 가용량 밖에 남아있지 않았다. 늘리는 방법은 굉장히 쉽다. 먼저 해당 인스턴스에 들어가서 스토리지의 볼륨 ID로 들어가서 볼륨 수정을 눌른 후 원하는 만큼의 크기로 늘리면 시간이 지난 뒤 할당 된다. 하지만 이로서 끝..

CI/CD 파이프라인 구축 (Github Actions self-hosted runners)

신규 Repo 생성 > Actions 탭 > set up a workflow yourself 클릭합니다. CI 테스트 워크 플로우 작성 backend_ci.yml name: 애자일허브 백엔드 CI 테스트 자동화 on: pull_request: branches: - main - develop permissions: write-all jobs: build: runs-on: ubuntu-latest steps: - name: 레포지토리를 가져옵니다 uses: actions/checkout@v3 - name: JDK 17를 설치합니다 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - name: 그래들 캐시 uses: ac..

대피소 csv파일 제작과정

8월 초 노션에 정리했던 글인데 블로그로 옮김. 사용자가 위치한 지역에 가까운 대피소를 클라이언트에 전송하기 위해 각 재난대피소 위치에 대한 CSV파일이 필요했다. 하지만 민방위 CSV파일 말고는 존재하지 않았다. 그래서 직접 CSV파일을 만들어본 경험을 적어본다. 문제 발생 https://www.safekorea.go.kr/idsiSFK/neo/main/main.html 이 사이트에 여러개가 존재한다. 그중 필요한건 이재민임시주거시설, 지진옥외대피소 안타깝게도 전체를 가져오는 건 불가능해 보인다 최소 시도선택과 시군구 선택 후 검색을 눌러야지 가져오는 걸로 보인다.(api요청할 때 그렇게 하도록 한 듯) 요청헤더를 보면 다음 url을 get요청하면 문제없이 가져오는 것을 postman으로 확인을 하였다..

[Beacon] 프로젝트 한달 차 회고

백엔드 2, 프론트 1 이서 모여진 이 프로젝트는 공개 SW 개발자 대회에 참가라는 명목으로 동기부여를 주고 사실 협업 프로젝트는 나에게는 처음이라 공부하는 겸 시작된 프로젝트이다. 먼저 진행된 프로젝트는 https://github.com/Beacon-2023/Beacon-backend 링크에서 볼 수 있고 진행은 한달안에 어느정도 완성된 프로젝트를 제출해야 하기에 스크럼으로 6주간의 스프린트로 진행했다. 해당 내용은 이 https://github.com/orgs/Beacon-2023/projects?query=is%3Aopen 링크에서 볼 수 있다 이번 회고글은 자랑하고 싶은 건 전혀 없고 (자랑할 거리가 없다;) 앞으로 해당 프로젝트를 혼자서라도 계속 진행할 수 있을 지 또는 여기서 그만둬야 할지 방..

깃허브로 소스코드 관리할 때 정신줄 잡고 푸시하기

불과 일주일전 이야기이다. 코딩을 하고 아무 생각없이 gitignore파일에 중요한 파일들을 추가했으니 잘되겠지 하고 푸시해버리다가 public 레포에 api키 , aws rds 비번, firebase admin key 다 유출되버렸다. 물론 pr로 push했기에 rebase하면 되겠지 하고 1시간동안 해봤지만 커밋기록은 여전히 있었고 뒤늦게 이동욱님의 블로그 ( https://jojoldu.tistory.com/307 )를 참조해 해봤지만 diff는 되어도 여전히 기록이 있었고 reset하면 된다고 하길래 해봤지만 이미 멘탈이 나간뒤에 한거라 포기했다. 이렇게 4시간이 넘는 소중한 시간이 날라가고 결국 깃허브에 요청하고 키 새로 다 발급받고 비번도 바꿨다.. git은 여전히 너무 어렵다. 브랜치를 분기..

14주차 CafeMate 주문 관리 프로세스 구현

어느새 인증 구현, 메뉴구현에 이어 가장 중요하다 싶은 주문 관리 페이지를 만들어 보도록 하겠습니다. 시나리오 1. 고객이 주문을 했을 때, 직원이 주문 등록 페이지에서 쉽게 주문 정보를 입력한다. 2. 직원은 간단한 폼을 사용하여 필요한 정보(이름,연락처,주문내역 등)을 입력하도록 한다. 3. 주문 등록 페이지에 주문 상태(조리중, 조리완료, 배달중,배달완료)를 등록하고 추후 변경할 수 있도록 합니다. 4. 메뉴 품절정보를 표시하여 직원들이 주문시 품절된 품목을 확인할 수 있도록 합니다. 일단 UI를 보면 로직을 짜기 쉽기에 이런식으로 만들면 될듯 합니다. 다시 정확하게 컨트롤러에 넘길 데이터를 알기 위해 주문 테이블 스키마를 자세히 살펴보겠습니다. 그리고 팀원이 짠 OrderService 코드중 주문..

11주차 CafeMate 브랜치에서 실수로 다른 기능 구현을 했을때

문제 인지 현재 저의 사항은 다음과 같습니다. 보시다시피 feature-auth 브랜치에 다음과 같은 문제가 발생했습니다. 1. feature-auth는 인증 관련 기능을 수행하는 브랜치 2. 브랜치를 바꾸지 않은 상태로 상품등록폼 구현 및 리스트 구현 중에 브랜치 바뀌지 않은 상태였다는 것을 인지 3. 다행이 아직은 커밋을 하지 않은 상태 문제 해결 어떻게 하면 안전하게 상품등록폼 구현 및 리스트 구현중인 작업을 feature-product 브랜치에 옮길 수 있을까 고민을 해봤습니다. 저의 생각은 다음과 같습니다 먼저, develop브랜치로 switch 2번째, develop 브랜치에서 feature-branch를 생성(git checkout -b feature-branch): 위의 그림처럼 아직 생성..