분류 전체보기 60

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

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

toy/AgileHub 2024.03.27

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

문제 배경로컬에서 정상적으로 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..

toy/AgileHub 2024.03.27

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

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

toy/AgileHub 2024.03.13

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

toy/AgileHub 2024.02.20

해시 테이블의 A부터 Z까지

해시를 사용하는 목적 - 해시 테이블: 해시테이블은 데이터의 해시 값을 테이블 내의 인덱스로 사용하는 자료구조이다. 필요한 데이터를 찾는 데 시간복잡도가 평균 O(1)인 굉장히 빠르게 데이터를 조회할 수 있다. - 암호화: 해시는 입력받은 데이터를 해시함수를 통해 원본의 모습을 전혀 알 수 없게 바꾼다. 이러한 해시의 특성 덕분에 해시는 암호화 영역에서 사용되고 있다. SHA 알고리즘이 대표적인 예이다. - 데이터 축약: 해시는 길이가 서로 다른 입력 데이터에 대해 일정한 길이의 출력을 만들 수 있다. 이 특성을 이용하면 대량 데이터를 해싱하여 짧은 길이로 축약할 수 있다. 해시 함수 해시테이블이란, 큰 숫자나 문자열을 해시 테이블의 인덱스로 사용할 수 있는 작은 정수로 매핑하는 함수이다. 해시함수를 고..

젠킨스 플러그인 설치 오류 - java.net.sockettimeoutException

상황 프리티어 EC2에 Swap 메모리를 설정하고 도커를 설치한다음 Jdk 11버전 Jenkins 최신버전 이미지를 run 했다. 그리고나서 추천플러그인을 설치하는데..(참고로 이후에도 jenkins/jenkins:latest 로 최신버전 이미지를 pull했는데도 같은 상황이다) 다음과 같이 몇 개의 플러그인들은 설치가 됐지만 다른 것이 설치가 안되었다. 도커 로그 명령어 (docker logs -f [컨테이너명])을 봤는데 네트워크 오류인가 SocketTimeoutException: connect timed out이라는 에러가 생겼다. 정말 여러 상황이 있는데 차근 차근 본인이 속한 오류가 뭔지 생각해보자 네트워크 연결 확인 젠킨스 이미지를 실행시킬 때 볼륨 생략하고 보통 이렇게 띄울 수 있다.`sud..

인프라 2024.02.06

github actions를 통한 CI/CD 구축 (+ 도커)

CI(Continuous Integration): 지속적 통합, 배포 가능한 아티팩트(Jar / Image)를 빌드하는 단계 CD(Continuous Delivery/Deployment): 지속적 배포, 실제 환경에 아티팩트를 배포하는 단계 CI/CD 파이프라인을 구축해야 하는 이유 파이프라인은 소스코드에서 시작해서 배포 환경 관리까지의 모든 프로세스를 자동화하는 것을 의미한다. 파이프라인이 없을 경우 사람이 직접 빌드 및 배포를 수행해야하고, 휴먼 에러가 발생하고 표준화가 어려워진다. GitHub Actions 장점 - 깃허브는 파이프라인을 구성하고 자동화할 수 있는 깃허브 액션을 제공한다. - 깃허브에 소스코드를 푸시하면 깃허브 액션에서 CI/CD 파이프라인을 자동으로 실행시킬 수 있다. - 깃허브 ..

인프라 2024.02.01

망 구성하기(외부망/내부망)

이번 글은 목차대로 원하는 곳에 가서 보는 방식의 구성을 하기가 조금 어려웠다. 결국 이번엔 위를 수행해야 아래를 수행할 수 있는 실습 방식으로 글을 썼다. VPC 생성 EC2 인스턴스들이 그냥 서로 막 연결되고 인터넷에 연결만 되는 요구사항이라면 VPC 생성할 필요가 없다. 그런데 이런식으로 망을 구성하면 (구성도 아니고 그냥 인스턴스만 생성한 것이다) 시스템의 복잡성도 올라가고 하나의 인스턴스가 추가되면 그에 대해 누구랑 연결해야 할지 누구랑은 연결이 되면 안될지 구성하는 데 시간이 많이 걸린다. vpc를 적용하면 vpc별로 네트워크를 구성할 수 있다. 하지만 내가 하는 프로젝트는 가장 작은 규모의 프로젝트이기 때문에 하나의 VPC만을 생성하면 된다. 1. aws VPC 들어가서 VPC 생성 클릭 2..

인프라/aws 2024.01.17

본인 PC에서 네이버 서버까지 연결하는 전체적인 그림

1. 동그라미 친 PC가 새로 산 본인 PC라 가정하자. 먼저 컴퓨터를 키면 IP, GateWay, DNS, Subnetmask 가 빈칸인 상태이다. 이때, 자동설정으로 둔 경우 동그라미 친 PC는 이 4가지를 알기 위해서 DHCP 서버를 찾는 broadcast를 보낸다. 그러면 스위치를 거쳐 분산 스위치를 거쳐 여기저기로 해당 내용을 보낸다. (단, 해당 LAN영역에만 보낸다. 인터넷 너머로는 보내지 않는다) 2. 그렇게 각종 호스트는 이 응답내용을 받을 것이고 본인이 DHCP가 아니면 폐기한다. DHCP 서버는 이 내용을 받고 새로 할당한 IP 주소 + GateWay 주소 + DNS 주소 + SubnetMask 주소를 해당 PC에 보내준다. + 집 공유기가 보통 DHCP 서버 기능을 내장하고 있다. ..

1.4MB 사진 파일이 서버에서 클라이언트로 전송되는 방식

예를들어, 네이버라는 서버가 있고 한 클라이언트가 네이버서버에 사진 파일 (약 1.4MB 정도의 크기. 패킷 MTU 보다 약 1400배 큰 크기)을 요청 한다고 하자. 네이버 서버는 먼저 HDD / SDD 에 저장된 1.4MB 파일을 애플리케이션에 올린다. 그러나 보통은 1.4MB라는 방대한 크기를 한꺼번에 읽어서 올리지는 않는다. 예를들면 애플리케이션 내에 버퍼 (자료구조 중 하나를 이용할거라 추측된다) 크기가 15바이트 정도라면 1.4MB의 사진 파일 중 5픽셀 정도(RGB 채널 이라면 1픽셀당 3바이트 이기 때문에) 만큼 NIO Buffer를 활용해서 copy 작업을 한다. 이제 socket 파일의 출력 스트림에 버퍼에 저장되있던 데이터를 I/O Copy를 한다. (Send / Receive 작업..