Index를 생성해서 약 10배 성능 개선
·
Dev
자주 조회되는 컬럼에 인덱스를 생성해두면 빠른 검색이 가능해지기 때문에 프로젝트에서 인덱스를 생성해서 성능을 높일 수 있는 부분이 있는지 찾아 보았습니다. 인덱스가 단점으로는 데이터 변경 시 인덱스도 업데이트 해야 되기 때문에 데이터를 추가하거나 변경, 삭제시에 느려지게 됩니다.재료를 이용해 레시피를 검색하는 쿼리가 있어서 재료에 대해 인덱스를 생성해보았습니다.jpa를 이용해 index를 생성했습니다.@Table( name = "recipe", indexes = @Index(name = "idx_ingredient", columnList = "ingredient")) index를 생성하고 explain을 이용해서 인덱스가 잘 사용되는지 확인 했더니 인덱스가 사용되지 않고 있었습니..
terraform으로 aws 인프라 구축하기 (3) (상태 관리)
·
Infra
Terraform이 인프라 상태를 추적하는 방법과 Terraform 프로젝트의 파일 레이아웃, 격리 및 잠금에 미치는 영향을 살펴보겠습니다.Terraform의 상태 추적Terraform은 인프라의 현재 상태를 파일(일반적으로 terraform.tfstate 파일)에 저장합니다.이 파일에는 프로비저닝한 리소스 정보가 담겨 있으며, Terraform이 인프라의 변경 사항을 추적하고 관리하는 데 사용됩니다.terraform을 팀에서 사용한다면 상태 파일을 관리할 수 있는 공유 저장소가 필요합니다.가장 좋은 방법은 Terraform의 기본 기능인 원격 백엔드 지원을 사용하는 것입니다.  Terraform의 상태 파일을 공유 저장소에 저장할 때, 버전 제어 시스템(Git 등)을 사용하는 것은 다음과 같은 문제를 ..
terraform으로 aws 인프라 구축하기 (2) (Auto Scaling)
·
Infra
시리즈 1에서는 ec2와 보안 그룹까지 생성했습니다. 이제 변수 설정과 오토 스케일링이 가능한 웹 서버 클러스터를 구축해 보겠습니다.변수 설정하는 방법변수를 선언할 때는 variable 블록을 사용합니다.//숫자인 변수variable "number_example" { description = "An example of a number variable in Terraform" type = number default = 42}//list인 변수variable "list_example" { description = "An example of a list in Terraform" type = list default = ["a", "b", "c"]}변수 적용하기변수를 설정한 후에는 var.변수명 형식으로 변..
terraform으로 aws 인프라 구축하기 (1)
·
Infra
Terraform이란재사용 및 공유가 가능한 사람이 읽을 수 있는 구성 파일로 클라우드 및 온프레미스 리소스를 모두 정의할 수 있는 코드 도구로서의 인프라입니다.일관된 워크플로우를 사용하여 수명주기 전반에 걸쳐 모든 인프라를 프로비저닝하고 관리할 수 있습니다 프로비저닝은 서버 자체를 생성해서 제공하는 것을 말합니다. 코드를 이용해서 웹 서버를 배포할 수 있습니다.Terraform을 사용하는 이유Terraform을 사용해서 인프라를 구축하면 개발을 하던 환경을 그대로 배포 환경을 만들어 내서 재사용성이 높아집니다.배포 프로세스가 안정화 되면 일관되게 반복이 가능하고 사람이 하지 않기 때문에 안정성이 높아지고 빠릅니다.제가 사용하면서 느낀점은 코드로 작성하면서 기능을 좀 더 자세하게 알 수 있게 된 것 같습..
stream 만들어낸 이유가 있지 않을까?
·
Dev
글을 작성하는 이유Java로 개발을 하다 보면 컬렉션이나 배열의 요소를 처리할 때 for문 대신 Stream을 사용하는 코드를 자주 마주하게 됩니다. 더 빠르다는 말에 이끌려 저 또한 Stream을 사용했습니다. 하지만 최근 들어 단순히 빠르다는 이유만으로 기술을 선택하는 것은 안일하다는 생각이 들었습니다. '왜 Stream을 사용해야 할까?'라는 근본적인 질문에 대한 답을 찾고 싶어졌습니다. 그리고 좋은건 더 공부해서 적극적으로 사용해야 한다고 생각했습니다.for문과 Stream, 어떤 차이가 있을까?특징for문Stream개념명시적인 반복함수형 스타일의 데이터 처리구조순차적인 실행파이프라인 구성장점직관적, 간단한 로직가독성, 유지보수성, 병렬 처리 가능단점복잡한 로직에서 가독성 저하, 병렬 처리 어려움..
N+1 문제 해결해서 성능 개선하기
·
Dev
문제상황조회 할 때 쿼리가 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하는 n+1 문제가 발생하였습니다. 쿼리가 추가로 발생해서 성능 저하로 이어지기 때문에 문제를 해결해야 하는 상황입니다.추가로 발생되는 쿼리 확인Post가 10개씩 조회되는데 아래의 쿼리가 10개씩 추가로 발생하고 있습니다.2024-10-23 04:00:12.166 DEBUG 71806 --- [nio-8080-exec-1] org.hibernate.SQL : select postimgs0_.post_id as post_id4_10_0_, postimgs0_.post_img_id as post_img1_10_0_, postimgs..
메트릭 모니터링 환경 구축하기
·
Ops
Introduce서비스를 운영하면서 중요한 메트릭을 수집해서 모니터링 할 수 있는 환경을 구축해보았습니다.Prometheus 설치$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts$ helm install prometheus prometheus-community/prometheusGrafana 설치nginx ingress를 사용하기 위해서 values.yaml을 수정했습니다.nginx ingress는 설치되어 있어야 합니다. 저는 ci/cd할때 설치가 되어 있어서 바로 진행하겠습니다.$ helm repo add grafana https://grafana.github.io/helm-charts$ hel..
Jenkins로 ci/cd 파이프라인 구축하기(3)
·
Ops
ArgoCD 설치//가용성 없는 버전$ kubectl create namespace argocd$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.0/manifests/install.yaml//가용성 있는 버전 kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.12.0/manifests/ha/install.yaml argocd를 local kind 클러스터에서 사용할 것이기 때문에 nginx ingress를 이용해서 접근하겠습니다.//nginx-ingres..
Jenkins로 ci/cd 파이프라인 구축하기(2)
·
Ops
Introduce지난번에 gitlab과 jenkins를 연동하는 것까지 했으니 이제 script를 작성해서 gitlab에 코드가 push 됐을 때 spring 서버 이미지를 빌드할 수 있도록 해보겠습니다. sonarqube를 이용해 소스코드 취약점을 분석하고 harbor로 private한 이미지 저장소를 구축해 보았습니다.Harbor 저장소 띄우기이미지를 빌드해서 올릴 저장소를 먼저 띄워보겠습니다.먼저 harbor 인증서를 생성해줍니다.# Root CA의 비밀키 생성$ mkdir -p ~/certs$ cd ~/certs$ openssl genrsa -out ca.key 4096#Root CA의 비밀키와 짝을 이룰 공개키 생성$ openssl req -x509 -new -nodes -sha512 -days..
Jenkins로 ci/cd 파이프라인 구축하기(1)
·
Ops
Introducejenkins를 이용해서 이미지를 빌드해서 argocd를 이용해 k8s 환경에 자동 배포 되도록 ci/cd 파이프라인을 만들어 보고자 합니다.sonarqube는 소스코드 취약점 분석 오픈소스이고 harbor는 private image reagistry이고 trivy를 통해 이미지 취약점 분석을 할 수 있습니다.Jenkins 띄우기컨테이너를 만들면서 플러그인도 함께 설치 해줬습니다.//gcp 무료 크레딧을 이용해 서버를 띄웠습니다.//DockerfileFROM jenkins/jenkins:ltsCOPY plugins.txt /usr/share/jenkins/ref/plugins/plugins.txtUSER rootRUN jenkins-plugin-cli -f /usr/share/jenkin..