- [ backend/프레임워크 ][spring] 스프링 AOP2024-11-10 15:43:11AOP; Aspect-Oriented Programming애스펙트는 프레임워크가 메서드 호출을 가로채고 그 메서드의 실행을 변경할 수 있는 방법이다. 애스펙트를 활용하면 비즈니스 로직과 함께 실행되는 로직을 분리하여 코드 중복을 줄이고 관심사를 명확하게 할 수 있다.여러 메서드에 로깅을 적용하는 과정을 가정해보자. 각 메서드에 중복된 로깅 코드를 추가하는 대신, 애스펙트를 적용하여 해당 메서드가 실행될 때 자동으로 로깅되도록 할 수 있다.애스펙트 (aspect) : 특정 메서드를 호출할 때 실행되는 코드 (= `execute` 메서드)어드바이스 (advice) : 언제 애스펙트를 실행해야 하는지 정의 (= `@Around` 어노테이션)포인트컷 (pointcut) : 어떤 메서드를 가로채야 하는지 정의 ..
- [ backend/프레임워크 ][spring] 스프링 컨텍스트2024-11-10 14:16:59스프링프레임워크는 어플리케이션을 개발하는 데 사용하는 기본 기능을 제공하는 소프트웨어 집합이다. 스프링은 자바 어플리케이션을 위한 프레임워크다.스프링 코어 : 스프링의 기본 기능을 제공하고, 대표적으로 스프링이 앱의 인스턴스를 관리할 수 있도록 컨텍스트를 제공한다.스프링 MVC스프링 데이터 액세스스프링 테스팅 스프링은 IoC를 원칙으로 동작한다. 즉, 스프링에게 제어 권한을 위임한다. 우리는 Configuration을 작성하여 스프링에 제어를 지시한다. 이렇게 스프링에게 제어 권한을 위임하여 인스턴스를 관리하게 되면 AOP를 통해 인스턴스의 메서드를 가로치는 것도 가능하다. 📁 스프링 프로젝트 구조 `src` 폴더 `main` 폴더 : 어플리케이션 소스 코드를 저장하는 곳으로, 자바..
- [ backend ][etc] access token & refresh token & JWT2024-09-22 21:52:42access token과 refresh tokenaccess token과 refresh token은 인증/인가 시스템에서 사용자의 신원을 확인하고 자원 접근을 제어하는 중요한 역할을 수행한다.access token인증/인가에 사용되는 토큰이다.짧은 유효기간을 가지기 때문에 탈취되더라도 보안 위험이 적다. (하지만 자주 갱신해야 한다)각 요청마다 토큰을 확인하여 인증하기 때문에 세션 관리의 부담을 줄일 수 있다.🤔 access token이 세션에 비해 갖는 장점비상태 : 사용자 요청이 올 때마다 세션 스토리지에서 사용자의 세션 정보를 조회할 필요가 없다. (= 단순 토큰 검증 만으로 상태 정보를 확인할 수 있다! 데이터베이스 조회 부담 X)확장성 : 서버 간에 세션 정보를 동기화할 필요가 없으므로 동기화..
- [ backend/k8s ][k8s] 쿠버네티스 시작하기 (클러스터링/오케스트레이션/도커 스웜/파드/레플리카셋/디플로이먼트/서비스)2024-06-20 16:21:38클러스터링 & 오케스트레이션클러스터링은 여러 대의 컴퓨터를 하나로 묶어 마치 하나의 컴퓨터처럼 사용하는 것을 의미한다. 이때 단일 컴퓨터를 노드라고 부른다. (여러 개의 노드가 모여서 하나의 클러스터로~) 오케스트레이션은 여러 대의 클러스터에서 컨테이너를 자동으로 배포/관리하는 것을 말한다. 오케스트레이션 도구로는 쿠버네티스, 도커 스웜, 아파치 메소스 등이 있다.🎻🎹🪈 : 특정 역할 담당 = 여러 연주자 (노드) 로 구성된 클러스터🎼 : 연주자 조율 = 컨테이너를 배포하고 관리하는 오케스트레이션🤯 기존 방식의 문제점확장성 부족 : 하드웨어 성능의 한계로 인해 쉽게 확장할 수 없으며, 트래픽 증가 시 서비스 장애가 발생한다.관리의 복잡성 : 여러 대의 서버를 수동으로 관리하는 것은 복잡하고 많은..
- [ 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트랜잭션 최적화 트랜잭션은 데이터의 일관성과 안전성을 보장하는 핵심 요소다. 특히 다수의 데이터를 처리할 때 트랜잭션 범위를 어떻게 설정하느냐가 성능에 큰 영향을 미친다. 하지만 다수의 쿼리를 하나의 트랜잭션으로 처리하는 것이 반드시 성능 향상으로 이어질까? 한 트랜잭션에서 여러 쿼리를 처리하면 커밋이나 롤백이 발생하기 전까지 모든 변경사항이 보류된다. 그동안 다른 트랜잭션들이 해당 데이터에 접근하지 못하고 기다려야 하므로 트랜잭션의 처리 속도가 감소할 수 있다. 🚨 대량의 행을 삽입/수정/삭제한 후 롤백을 실행하는 것은 성능을 저하시킬 수 있다. 대규모 데이터 변경이 필요한 경우, 주기적으로 커밋을 실행하거나 작은 크기의 트랜잭션으로 나누는 것이 좋다. 한편, 각각의 쿼리를 개별적인 트랜잭션으로 처리하..