본문 바로가기

전체 글88

테스트 더블, 목과 스텁 이야기 얼마 전, 우아한테크캠프에 참여하며 미니 세미나를 통해 테스트 더블과 이상적인 단위 테스트를 작성하기 위해 했던 고민을 다른 사람들과 공유하였습니다. 본 게시글을 통해 당시 진행했던 세미나의 내용을 글로써 정리하고 다시 한 번, 이 글을 읽으실 분들과 저의 고민을 공유해보고자 합니다.테스트 더블스턴트 더블이 장면을 보신적이 있나요?이 장면은 미션 임파서블 폴아웃의 오프닝 시퀀스의 장면 일부를 따온 것으로, 톰 크루즈가 이륙하는 실제 비행기에 매달려서 스턴트를 소화하고 있는 모습입니다. 보시는 바와 같이 톰 크루즈는 이런 위험한 스턴트 장면도 대역 없이 직접 소화하는 것으로 유명한 배우입니다. 보통은 실제 배우 대신 스턴트 장면을 대신 촬영할 위한 전담 대역을 두는 것이 일반적입니다. 위 사진은 드웨인 .. 2024. 7. 8.
[MySQL] B-Tree 인덱스 디스크 읽기 방식랜덤 I/O와 순차 I/O랜덤 IO와 순차 IO 모두 하드 디스크 드라이브의 플래터를 돌려 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것은 동일합니다.그러나 순차 IO가 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜을 호출한다면, 랜덤 IO는 3번의 시스템 콜을 호출합니다. 즉, 디스크 헤드를 3번 움직이며 3배의 속도 차이가 발생합니다.쿼리를 튜닝해서 랜덤 IO를 순차 IO로 바꾸는 방법은 많지 않습니다. 쿼리 튜닝의 목적은 랜덤 IO 자체를 줄이는 것이며 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미합니다.인덱스란인덱스란 컬럼의 값과 해당 레코드가 저장된 주소를 키-값 쌍으로 만들어 둔 것을 의미합니다. 컬럼의 값을 기준으로 정렬해서 보관하기 .. 2024. 6. 18.
스프링 @Retry를 이용한 재시도 처리하기 Spring RetrySpring Retry 프로젝트는 스프링 애플리케이션에 대해 명령형 또는 선언적 재시도 처리를 지원합니다. 의존성이를 사용하기 위해서는 다음의 의존성을 추가해주어야 합니다. Spring Retry는 스프링 AOP를 이용하여 선언적 방식을 제공합니다. 따라서 AOP 의존성이 필요하며 다른 스타터 의존성에 AOP 의존성도 포함되어있다면 생략해도 됩니다.implementation 'org.springframework.boot:spring-boot-starter-aop'implementation 'org.springframework.retry:spring-retry'Retryable사용 방식은 간단합니다. 별도의 configuration에 @EnableRetry를 추가한 뒤, 재시도 처리를.. 2024. 6. 12.
스프링 @Async를 이용한 비동기 실행 적용하기 Spring Async@Async비동기 실행을 위한 @Async를 사용하기 위해서는 먼저 적당한 @Configuration 클래스에 @EnableAsync를 추가해주어야 합니다.@EnableAsync @Configuration public class AsyncConfig {}그런 다음 비동기적으로 실행되길 원하는 메서드에 @Async 어노테이션을 추가하면 됩니다. 다음은 Spring Event의 이벤트 리스너의 비동기 실행을 적용하기 위해 @Async를 사용하는 코드입니다.@Async @TransactionalEventListener public void createDefaultLinkBundle(CreateMemberEvent event) { CreateLinkBundleCommand.. 2024. 6. 11.
[MySQL] InnoDB 스토리지 엔진 아키텍처 InnoDB 스토리지 엔진 아키텍처프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링되어 저장됩니다. 따라서 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다.쿼리의 실행 계획에서 클러스터링 된 프라이머리 키는 기본적으로 세컨더리 인덱스에 비해 비중이 높게 설정됩니다.외래 키 지원InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 컬럼에 인덱스 생성이 필요하고, 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요하므로 잠금이 여러 테이블로 전파됩니다. 그로 인해 데드락이 발생할 때가 많으므로 개발할 때도 외래 키의 존재에 주의해야 합니다.외래 키가 복잡하게 얽혀있는 경우 데.. 2024. 6. 9.
[MySQL] MySQL 엔진 아키텍처 MySQL 스레딩 구조MySQL 서버는 스레드 기반으로 작동하며, 포그라운드(Foreground)와 백그라운드(Background) 스레드로 구분할 수 있습니다.포그라운드 스레드(클라이언트 스레드)포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며, 각 클라이언트가 요청하는 쿼리 문장을 처리합니다. 클라이언트가 작업을 마치고 커넥션을 종료하면 스레드는 스레드 캐시(Thread cache)로 돌아갑니다.스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드를 종료시켜 일정 개수의 스레드만 유지합니다. 스레드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수로 결정합니다.포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로.. 2024. 6. 9.