MySQL 미드레벨 테스트·코드품질 기술면접

MySQL 미드레벨 (3~7년) 테스트 · 코드품질 7문항 조회수 11 · 2026-09-15 (화) 22:11:50
1 데이터베이스 테스트 전략
Medium

Q. MySQL을 사용하는 애플리케이션의 단위 테스트에서 실제 데이터베이스 대신 테스트 더블(Test Double)을 사용하는 방법들을 설명하고, In-Memory Database(H2), Docker 컨테이너, Mock 객체 중 어떤 전략이 어떤 상황에서 적합한지 테스트 속도, 격리성, 실제 환경과의 일치도 관점에서 비교해주세요.

각 전략이 제공하는 피드백의 신뢰도와 테스트 실행 속도의 트레이드오프를 고려해보세요.

A. 모범답안

Mock 객체는 가장 빠르지만 SQL 문법이나 트랜잭션 동작을 검증할 수 없어 Repository 계층의 인터페이스 테스트에만 적합합니다. H2 같은 In-Memory DB는 빠른 속도와 격리성을 제공하지만 MySQL과 SQL 방언이 달라 프로덕션과 차이가 발생할 수 있습니다. Docker 컨테이너로 실제 MySQL을 띄우는 방식은 가장 느리지만 실제 환경과 동일한 테스트가 가능하여 통합 테스트나 복잡한 쿼리 검증에 적합합니다. 실무에서는 단위 테스트는 Mock이나 H2로 빠르게 실행하고, CI 파이프라인에서는 Docker MySQL로 통합 테스트를 수행하는 계층적 전략을 사용합니다. Testcontainers 라이브러리를 활용하면 Docker 기반 테스트를 쉽게 구성할 수 있습니다.

핵심 포인트
  • • Mock은 속도는 빠르지만 실제 SQL 동작을 검증하지 못함
  • • In-Memory DB는 SQL 방언 차이로 프로덕션과 불일치 가능
  • • Docker MySQL은 느리지만 실제 환경과 동일한 테스트 제공
  • • 계층적 테스트 전략으로 속도와 신뢰도 균형
답변에 넣으면 좋은 키워드
Test Double In-Memory Database Testcontainers 테스트 격리 SQL 방언 통합 테스트
실무에서는

CI/CD 파이프라인에서 테스트 실행 시간과 신뢰도를 균형있게 유지하기 위한 테스트 전략 설계에 사용됩니다.

Follow-up 질문

Testcontainers를 사용할 때 테스트 실행 시간을 단축하기 위해 컨테이너를 재사용하는 전략과 그로 인한 테스트 격리 문제를 어떻게 해결할 수 있을까요?

2 트랜잭션 테스트
Medium

Q. Spring Framework의 @Transactional 어노테이션을 테스트 메서드에 사용하면 테스트 종료 후 자동으로 롤백됩니다. 이 기능의 장점과 단점을 설명하고, 실제 커밋 동작을 검증해야 하는 경우(예: 트랜잭션 이벤트, 커밋 후 동작)에는 어떻게 테스트를 작성해야 하는지 설명해주세요.

자동 롤백이 테스트 격리에는 유리하지만, 실제 프로덕션 동작과 다를 수 있는 부분을 생각해보세요.

A. 모범답안

테스트의 @Transactional은 각 테스트를 격리하고 데이터베이스를 깨끗한 상태로 유지하는 장점이 있어 테스트 간 의존성을 제거합니다. 하지만 실제 커밋이 발생하지 않아 커밋 후 트리거되는 이벤트나 TransactionalEventListener의 AFTER_COMMIT 단계를 테스트할 수 없습니다. 또한 지연 로딩 예외나 플러시 타이밍 이슈를 놓칠 수 있습니다. 실제 커밋을 검증하려면 @Commit 어노테이션을 사용하거나, 테스트 메서드에서 명시적으로 커밋하고 @AfterEach에서 데이터를 정리하는 방식을 사용합니다. 또는 TransactionalTestExecutionListener를 커스터마이징하여 특정 테스트만 커밋하도록 설정할 수 있습니다. 실무에서는 대부분의 테스트는 롤백을 사용하고, 커밋 동작이 중요한 시나리오만 별도로 테스트합니다.

핵심 포인트
  • • 자동 롤백은 테스트 격리와 빠른 실행에 유리
  • • 커밋 후 이벤트나 트리거 동작을 검증하지 못함
  • • @Commit 어노테이션으로 실제 커밋 테스트 가능
  • • 대부분은 롤백, 필요시에만 커밋 테스트 분리
답변에 넣으면 좋은 키워드
@Transactional 테스트 격리 TransactionalEventListener @Commit 플러시 지연 로딩
실무에서는

결제 완료 후 이메일 발송 같은 커밋 후 이벤트 처리 로직을 테스트할 때 사용됩니다.

Follow-up 질문

여러 트랜잭션이 중첩되는 복잡한 비즈니스 로직을 테스트할 때, 트랜잭션 전파(Propagation) 설정을 어떻게 검증할 수 있을까요?

3 데이터베이스 스키마 테스트
Medium

Q. 데이터베이스 마이그레이션 도구(Flyway, Liquibase)를 사용하는 프로젝트에서 스키마 변경 스크립트의 품질을 검증하는 테스트 전략을 설명해주세요. 특히 롤백 스크립트의 정합성, 인덱스 생성의 성능 영향, 데이터 마이그레이션 로직의 안전성을 어떻게 테스트할 수 있는지 설명해주세요.

스키마 변경은 프로덕션 데이터에 직접 영향을 주므로, 변경 전후의 데이터 무결성과 성능을 검증해야 합니다.

A. 모범답안

마이그레이션 스크립트는 프로덕션 복제본 데이터베이스에서 실행하여 실제 데이터 볼륨에서의 성능을 측정해야 합니다. 롤백 스크립트는 마이그레이션 후 즉시 실행하여 원래 상태로 복구되는지 데이터 정합성을 검증하는 자동화 테스트를 작성합니다. 인덱스 생성은 ALGORITHM=INPLACE, LOCK=NONE 옵션을 사용했는지 확인하고, 대용량 테이블에서 실행 시간과 락 발생 여부를 측정합니다. 데이터 마이그레이션 로직은 배치 단위로 처리되는지, 실패 시 재시도 가능한지, 트랜잭션 경계가 적절한지 검증합니다. CI 파이프라인에 마이그레이션 테스트 단계를 추가하여 빈 데이터베이스와 샘플 데이터가 있는 데이터베이스 양쪽에서 마이그레이션을 실행하고 검증합니다. 프로덕션 배포 전에는 스테이징 환경에서 실제 데이터 스냅샷으로 최종 검증을 수행합니다.

핵심 포인트
  • • 프로덕션 복제본에서 실제 볼륨 테스트 수행
  • • 롤백 스크립트의 데이터 정합성 자동 검증
  • • 인덱스 생성 시 락 발생 여부와 실행 시간 측정
  • • CI 파이프라인에 마이그레이션 테스트 통합
답변에 넣으면 좋은 키워드
Flyway Liquibase 스키마 마이그레이션 롤백 테스트 Online DDL 데이터 무결성
실무에서는

프로덕션 배포 시 스키마 변경으로 인한 장애를 예방하고 안전한 롤백을 보장하기 위해 사용됩니다.

Follow-up 질문

대용량 테이블에 NOT NULL 컬럼을 추가하면서 기본값을 설정해야 할 때, 무중단 배포를 위한 안전한 마이그레이션 단계는 무엇인가요?

4 데이터베이스 테스트 데이터 관리
Medium

Q. 통합 테스트에서 테스트 데이터를 준비하는 방법으로 SQL 파일, 코드 기반 Fixture, 데이터 빌더 패턴이 있습니다. 각 방식의 장단점을 유지보수성, 가독성, 재사용성 관점에서 비교하고, 복잡한 연관 관계를 가진 엔티티들의 테스트 데이터를 효율적으로 관리하는 전략을 설명해주세요.

테스트 데이터는 테스트 의도를 명확히 드러내면서도 중복을 최소화해야 합니다.

A. 모범답안

SQL 파일은 데이터베이스 종속적이고 스키마 변경 시 유지보수가 어렵지만, 대량의 초기 데이터 로딩에는 빠릅니다. 코드 기반 Fixture는 타입 안정성과 IDE 지원을 받지만, 보일러플레이트 코드가 많아질 수 있습니다. 데이터 빌더 패턴은 테스트에 필요한 속성만 명시적으로 설정하고 나머지는 기본값을 사용하여 가독성과 유지보수성이 좋습니다. 실무에서는 ObjectMother 패턴이나 TestDataBuilder 패턴을 사용하여 재사용 가능한 테스트 데이터 생성 함수를 만듭니다. 복잡한 연관 관계는 Fixture Monkey 같은 라이브러리로 랜덤 데이터를 생성하되, 테스트 의도와 관련된 속성만 명시적으로 설정합니다. 각 테스트는 자신이 필요한 데이터만 생성하는 Given 단계를 명확히 하여 테스트 간 결합도를 낮춥니다.

핵심 포인트
  • • SQL 파일은 대량 데이터에 유리하지만 유지보수 어려움
  • • 데이터 빌더 패턴은 가독성과 유지보수성 제공
  • • ObjectMother나 TestDataBuilder로 재사용성 확보
  • • 테스트 의도와 관련된 속성만 명시적으로 설정
답변에 넣으면 좋은 키워드
Test Fixture ObjectMother TestDataBuilder Fixture Monkey Given-When-Then 테스트 데이터
실무에서는

복잡한 도메인 모델을 가진 시스템에서 테스트 작성 시간을 단축하고 테스트 코드의 가독성을 높이기 위해 사용됩니다.

Follow-up 질문

테스트 데이터가 테스트 간에 공유될 때 발생하는 문제점과, 각 테스트가 독립적인 데이터를 사용하도록 보장하는 방법은 무엇인가요?

5 쿼리 성능 테스트
Hard

Q. 프로덕션에서 성능 문제가 발생한 쿼리를 리팩토링한 후, 개선된 쿼리가 다양한 데이터 분포와 볼륨에서도 안정적인 성능을 보이는지 검증하는 테스트 전략을 설명해주세요. 특히 EXPLAIN 분석, 실행 시간 측정, 인덱스 사용 검증을 자동화하는 방법과 회귀 테스트에 포함시키는 방법을 설명해주세요.

쿼리 성능은 데이터 분포와 볼륨에 따라 달라지므로, 다양한 시나리오에서 테스트해야 합니다.

A. 모범답안

먼저 프로덕션 데이터의 통계적 분포를 분석하여 대표적인 시나리오들을 식별합니다. 테스트 데이터는 최소/평균/최대 볼륨과 균등/편향 분포를 포함하여 준비합니다. JUnit의 ParameterizedTest로 다양한 데이터 조건에서 쿼리를 실행하고, EXPLAIN 결과를 파싱하여 type이 ALL이 아닌지, Extra에 Using filesort가 없는지 자동으로 검증합니다. 실행 시간은 여러 번 측정하여 평균과 표준편차를 계산하고, 임계값을 초과하면 테스트를 실패시킵니다. MySQL의 Performance Schema나 프로파일링을 활성화하여 쿼리 실행 단계별 시간을 측정합니다. 리팩토링 전후의 쿼리를 모두 실행하여 성능 개선을 정량적으로 비교하는 벤치마크 테스트를 작성합니다. CI 파이프라인에서 nightly build로 대용량 데이터 성능 테스트를 실행하고, 성능 메트릭을 시계열로 저장하여 성능 회귀를 모니터링합니다.

핵심 포인트
  • • 프로덕션 데이터 분포를 반영한 테스트 시나리오 준비
  • • EXPLAIN 결과를 파싱하여 실행 계획 자동 검증
  • • 실행 시간과 표준편차 측정으로 안정성 확인
  • • CI에서 성능 메트릭 시계열 저장 및 회귀 감지
답변에 넣으면 좋은 키워드
EXPLAIN ParameterizedTest Performance Schema 벤치마크 성능 회귀 쿼리 프로파일링
실무에서는

쿼리 최적화 후 다양한 데이터 조건에서도 안정적인 성능을 보장하고, 향후 코드 변경으로 인한 성능 회귀를 방지하기 위해 사용됩니다.

Follow-up 질문

MySQL 버전 업그레이드 후 옵티마이저 동작이 변경되어 기존 쿼리의 실행 계획이 달라질 수 있습니다. 이를 사전에 감지하는 테스트 전략은 무엇인가요?

6 동시성 테스트
Hard

Q. 재고 차감이나 좌석 예약 같은 동시성 제어가 중요한 로직을 테스트할 때, 실제 동시 요청 상황을 시뮬레이션하고 Race Condition이나 Lost Update를 검증하는 테스트를 어떻게 작성해야 하는지 설명해주세요. CountDownLatch, ExecutorService 등을 활용한 멀티스레드 테스트 작성법과 테스트의 신뢰성을 높이는 방법을 설명해주세요.

멀티스레드 테스트는 타이밍에 민감하므로, 확실하게 동시성 문제를 재현할 수 있는 구조가 필요합니다.

A. 모범답안

ExecutorService로 고정된 스레드 풀을 생성하고, CountDownLatch로 모든 스레드가 준비될 때까지 대기했다가 동시에 실행되도록 합니다. 예를 들어 재고 100개에 200개의 동시 구매 요청을 보내고, 최종 재고가 0이고 성공한 구매가 정확히 100건인지 검증합니다. 비관적 락이나 낙관적 락의 동작을 검증하려면 트랜잭션 격리 수준을 명시적으로 설정하고, 예외 발생 횟수와 재시도 로직을 확인합니다. 테스트 신뢰성을 높이기 위해 충분한 반복 횟수를 설정하고, CyclicBarrier로 모든 스레드가 정확히 같은 시점에 시작하도록 합니다. Awaitility 라이브러리로 비동기 결과를 폴링하며 검증합니다. 실패한 경우 로그를 상세히 남겨 어떤 스레드에서 문제가 발생했는지 추적 가능하게 합니다. 로컬에서는 반복 횟수를 줄이고 CI에서는 충분한 횟수로 실행하여 간헐적 실패를 감지합니다.

핵심 포인트
  • • CountDownLatch로 동시 실행 시점 제어
  • • 최종 상태 검증으로 동시성 문제 감지
  • • 충분한 반복과 CyclicBarrier로 신뢰성 확보
  • • Awaitility로 비동기 결과 검증
답변에 넣으면 좋은 키워드
CountDownLatch ExecutorService Race Condition CyclicBarrier Awaitility 멀티스레드 테스트
실무에서는

이커머스의 한정 수량 상품 구매나 예약 시스템에서 동시성 제어 로직이 올바르게 동작하는지 검증하기 위해 사용됩니다.

Follow-up 질문

멀티스레드 테스트가 간헐적으로 실패하는 경우, 테스트 자체의 문제인지 실제 동시성 버그인지 구분하는 방법은 무엇인가요?

7 코드 리뷰와 쿼리 품질
Medium

Q. 코드 리뷰 시 MySQL 쿼리와 관련된 코드 품질을 검증하는 체크리스트를 제시하고, N+1 쿼리 문제, 불필요한 SELECT *, 인덱스 미사용, SQL Injection 취약점을 자동으로 감지할 수 있는 도구나 정적 분석 방법을 설명해주세요. 또한 ORM 사용 시 주의해야 할 쿼리 품질 이슈도 함께 설명해주세요.

쿼리 품질 문제는 개발 단계에서 발견하기 어려우므로, 자동화된 검증과 명확한 가이드라인이 필요합니다.

A. 모범답안

코드 리뷰 체크리스트는 1) 쿼리에 적절한 WHERE 조건과 인덱스 사용 여부, 2) SELECT *이 아닌 필요한 컬럼만 조회, 3) Prepared Statement 사용으로 SQL Injection 방지, 4) 페이지네이션 누락 여부, 5) 트랜잭션 범위가 적절한지 확인합니다. N+1 쿼리는 Hibernate의 Batch Fetching이나 쿼리 카운터 라이브러리로 감지하고, 테스트에서 예상 쿼리 수를 검증합니다. SonarQube나 PMD 같은 정적 분석 도구로 SQL Injection 패턴을 탐지하고, Flyway나 Liquibase의 린트 도구로 스키마 변경을 검증합니다. ORM 사용 시 지연 로딩으로 인한 N+1, 영속성 컨텍스트 크기 증가, 불필요한 Dirty Checking을 주의해야 합니다. 실무에서는 쿼리 로그를 활성화하고 슬로우 쿼리 임계값을 낮게 설정하여 개발 단계에서 문제를 조기 발견합니다. 코드 리뷰 시 EXPLAIN 결과를 함께 공유하여 실행 계획을 검토하는 문화를 만듭니다.

핵심 포인트
  • • 인덱스, SQL Injection, 페이지네이션 등 체크리스트 기반 리뷰
  • • 쿼리 카운터로 N+1 문제 자동 감지
  • • 정적 분석 도구로 취약점 사전 탐지
  • • ORM의 지연 로딩과 영속성 컨텍스트 이슈 주의
답변에 넣으면 좋은 키워드
코드 리뷰 N+1 쿼리 SQL Injection 정적 분석 SonarQube 쿼리 카운터
실무에서는

코드 리뷰 단계에서 데이터베이스 성능 문제와 보안 취약점을 사전에 발견하여 프로덕션 장애를 예방하기 위해 사용됩니다.

Follow-up 질문

Pull Request에서 데이터베이스 관련 변경이 포함된 경우, 리뷰어가 반드시 확인해야 할 사항과 승인 기준은 무엇인가요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!