- [ backend/k8s ][k8s] 쿠버네티스 시작하기 (클러스터링/오케스트레이션/도커 스웜/파드/레플리카셋/디플로이먼트/서비스)2024-06-20 16:21:38클러스터링 & 오케스트레이션클러스터링은 여러 대의 컴퓨터를 하나로 묶어 마치 하나의 컴퓨터처럼 사용하는 것을 의미한다. 이때 단일 컴퓨터를 노드라고 부른다. (여러 개의 노드가 모여서 하나의 클러스터로~) 오케스트레이션은 여러 대의 클러스터에서 컨테이너를 자동으로 배포/관리하는 것을 말한다. 오케스트레이션 도구로는 쿠버네티스, 도커 스웜, 아파치 메소스 등이 있다.🎻🎹🪈 : 특정 역할 담당 = 여러 연주자 (노드) 로 구성된 클러스터🎼 : 연주자 조율 = 컨테이너를 배포하고 관리하는 오케스트레이션🤯 기존 방식의 문제점확장성 부족 : 하드웨어 성능의 한계로 인해 쉽게 확장할 수 없으며, 트래픽 증가 시 서비스 장애가 발생한다.관리의 복잡성 : 여러 대의 서버를 수동으로 관리하는 것은 복잡하고 많은..
- [ backend/프레임워크 ][spring] 설정 분리 (@SpringBootTest, @Profile, @ActiveProfiles, @TestPropertySource, @TestConfiguration)2024-06-18 23:57:21@SpringBootTest`@SpringBootTest`는 스프링 부트 어플리케이션의 통합 테스트를 위한 어노테이션이다. 전체 어플리케이션 컨텍스트를 로드하여 실제 어플리케이션과 동일한 환경에서 테스트를 진행할 수 있다.`@BootstrapWith(SpringBootTestContextBootstrapper.class)`은 테스트 컨텍스트를 부트스트랩하고 어플리케이션 컨텍스트를 로드한다.`SpringBootTestContextBootstrapper` : `TestContextBootStrapper`를 상속하여 테스트 환경을 설정한다.컨텍스트 로더로 `SpringBootContextLoader`를 사용한다.`@SpringBootApplication`을 사용하여 어플리케이션 컨텍스트를 초기화한다.스프링 부..
- [ backend/프레임워크 ][spring] 스프링 컨테이너 & 빈 (IoC/DI/라이프사이클/빈 정의/빈 스코프)2024-06-15 19:15:32스프링 컨테이너스프링 컨테이너는 스프링 프레임워크의 핵심으로, 어플리케이션 객체 (Bean) 을 관리한다. 즉, 스프링 컨테이너는 개발자를 대신하여 객체를 관리한다.어플리케이션 실행 시 필요한 객체 생성객체 간의 의존성 설정 및 주입객체의 생명 주기 관리스프링 컨테이너는 스프링 IoC 컨테이너, DI 컨테이너로 불리기도 한다. 빈에 대해 살펴보기 전에 IoC, DI, 컨테이너 라이프사이클에 대해 알아보자. IoC; Inversion of ControlIoC는 객체의 제어를 코드 외부에 맡기는 것을 의미한다. 다시 말해 코드 외부 컨테이너나 프레임워크가 객체를 관리하도록 한다. 의존성을 외부에서 주입받기 때문에 객체 간의 결합도가 낮아지며, 구현에 종속되지 않아 구현체를 쉽게 교체하고 확장할 수 있어 유연..
- [ backend/devops ][프로젝트 관리] GitHub Actions로 PR에 라벨, 이슈, 담당자 등록하기2024-02-18 20:44:08PR의 설정들을 활용하면 개발 및 협업 프로세스를 향상시킬 수 있다. 라벨, 이슈, 담당자를 등록함으로써 변경사항을 쉽게 추적할 수 있고, 누가 어떤 작업을 담당하고 있는지 확인할 수 있다. `feature`, `bug` 같은 라벨을 통해 PR의 목적을 빠르게 이해할 수 있으며 우선순위를 판단하는 데에도 도움을 준다. 하지만 PR을 설정하는 과정은 굉장히 번거로운 작업이다. 따라서 자동화된 프로세스를 통해 각 PR에 알맞은 설정 정보를 등록함으로써 개발자가 실제 개발 작업에 집중할 수 있도록 만들 것이다. 🚨 PR을 수동으로 설정하면 실수가 발생할 수 있으므로 자동화된 프로세스를 통해 작업의 정확성을 보장한다. 아래 코드는 액션 파일의 전문이다. PR이 오픈되었을 때 자동으로 설정들을 등록한다. 아래에서..
- [ backend/데이터베이스 ][mysql] 성능 최적화 3편 (데이터 크기)2024-02-13 15:36:22데이터 구조 최적화 테이블을 설계할 때 적절한 데이터 타입을 설정하는 것이 매우 중요하다. 최소한의 데이터 크기를 사용함으로써 테이블이 차지하는 디스크 공간을 최적화할 수 있고, 데이터가 메모리에 로드될 때 메모리 공간을 적게 사용하기 때문에 더 많은 데이터를 캐싱할 수 있다. 데이터 크기 최적화 데이터 크기를 최적화하면 디스크에 저장되는 데이터 양을 줄일 수 있다. 이는 저장소 비용을 절감하고 데이터 전송 시간을 단축시킨다. 테이블 컬럼 최적화 작은 크기의 데이터 타입을 사용하여 디스크 공간과 메모리를 확보한다. 가능한 `NOT NULL`로 선언하여 각 값이 null인지 테스트하는 오버헤드를 제거한다. `TINYINT` `SMALLINT` `MEDIUMINT` `INT` `BIGINT` 바이트 1 2 ..
- [ backend/docker ][docker] GitHub Actions에서 도커 캐싱하기(cache from/cache to)2024-02-11 21:05:55CI/CD에서는 이미지 빌드 실행 시간을 최소화하는 것이 중요하다. 따라서 도커 파일을 작성할 때 각 레이어를 작은 단위로 분리하여 효율적으로 캐싱되도록 설계하는 것이 좋다. 하지만 깃헙 액션의 특성상 새로운 환경의 러너를 할당받게 되어 이전 빌드 내용이 남아있지 않아 캐시를 활용할 수 없었다. 도커에 대해 좀 더 공부하다보니 도커에서 캐싱할 수 있는 옵션이 있었다. 이미지 빌드 시에 `--cach-from` 및 `--cache-to`를 사용하여 캐싱을 관리할 수 있다. 지금부터 이러한 옵션을 활용하여 이미지 빌드 시간을 최적화해보자. 캐시 유형 `inline` - 빌드 캐시를 동일한 이미지에 내장하어 레지스트리에 푸시될 때 캐시도 함께 푸시한다. `registry` - 빌드 캐시를 별도의 이미지에 내장..
- [ backend/데이터베이스 ][mysql] 성능 최적화 2편 (트랜잭션)2024-02-06 20:39:51트랜잭션 최적화 트랜잭션은 데이터의 일관성과 안전성을 보장하는 핵심 요소다. 특히 다수의 데이터를 처리할 때 트랜잭션 범위를 어떻게 설정하느냐가 성능에 큰 영향을 미친다. 하지만 다수의 쿼리를 하나의 트랜잭션으로 처리하는 것이 반드시 성능 향상으로 이어질까? 한 트랜잭션에서 여러 쿼리를 처리하면 커밋이나 롤백이 발생하기 전까지 모든 변경사항이 보류된다. 그동안 다른 트랜잭션들이 해당 데이터에 접근하지 못하고 기다려야 하므로 트랜잭션의 처리 속도가 감소할 수 있다. 🚨 대량의 행을 삽입/수정/삭제한 후 롤백을 실행하는 것은 성능을 저하시킬 수 있다. 대규모 데이터 변경이 필요한 경우, 주기적으로 커밋을 실행하거나 작은 크기의 트랜잭션으로 나누는 것이 좋다. 한편, 각각의 쿼리를 개별적인 트랜잭션으로 처리하..
- [ backend/데이터베이스 ][mysql] 성능 최적화 1편 (인덱스/커버링 인덱스)2024-02-05 22:44:23데이터베이스 성능에는 테이블, 쿼리, 설정 등 다양한 수준의 요소들이 영향을 미친다. 최적화를 위해 소프트웨어, 하드웨어 수준에서 조절할 수 있지만 이 글에서는 하드웨어 최적화는 다루지 않을 것이다. 데이터베이스 최적화최적화 방법을 살펴보기 전에 아래 질문으로 어떤 점을 고려해야 하는지 간단히 알아보자.테이블은 올바른 데이터 유형의 열을 가지고 있고 적절한 수의 열을 갖추고 있는가인덱스가 적절히 구성되어 있는가각 테이블에 적합한 스토리지 엔진을 사용하고 해당 엔진의 강점과 기능을 활용하고 있는가디스크 낭비를 줄이고 I/O 시간을 단축하기 위해 압축된 테이블을 사용하고 있는가동시성을 위해 적절한 락 전략을 사용하고 있는가메모리 캐싱 영역을 올바른 크기로 설정했는가 SQL문 최적화sql문은 데이터베이스를 조..