DB 이중화가 뭔가요?
DB 이중화는 데이터베이스의 가용성과 안전성을 높이기 위해 두 개 이상의 데이터베이스 인스턴스를 운영하는 방식입니다. 주로 마스터-슬레이브 구조로 이루어지며, 마스터는 쓰기와 읽기를 담당하고, 슬레이브는 읽기 작업을 처리하며, 마스터의 데이터를 실시간으로 복제받습니다.
이런 이중화방식은 장애 발생시 서비스 중단 시간을 최소화하고, 데이터 손실을 방지할 수 있는 장점이 있습니다.
고가용성이 뭔가요?
고가용성이란 장애 발생 시 슬레이브가 자동으로 마스터 역할을 대체해 서비스의 연속성을 보장하는 것을 말합니다.
DB 이중화의 단점?
DB 이중화는 읽기 성능을 향상시키고 고가용성을 제공하는데 유리하긴하지만, 쓰기 성능에 한계가 있을 수 있습니다. 왜냐하면 마스터가 모든 쓰기 작업을 담당하기에 트래픽이 증가하면 마스터 노드에 쓰기 병목 현상이 발생할 수 있다고 생각합니다.
데이터베이스 내의 동시성 이슈를 해결하기 위한 낙관적 락과 비관적 락이란?
낙관적 락은 데이터가 수정될 때 데이터를 잠그지 않고 다른 트랜잭션과 동시에 접근하도록 허용하는 방식입니다. 이를 통해 수정 중에 데이터가 충돌이 발생했는지 확인하고 발생했다면 롤백하는 방식으로 작동됩니다. -> 상품 재고 관리 시스템
비관적 락은 트랜잭션이 데이터를 수정하기 전 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 차단합니다. 따라서 잠금이 되어 있는 동안 다른 트랜잭션은 수정하기까지 대기합니다. -> 은행시스템
트랜잭션과 롤백이란 무엇인가요?
트랜잭션은 데이터베이스에서 하나의 작업 단위로, 여러 작업을 하나의 논리적인 연산으로 묶어 처리합니다. 롤백은 트랜잭션 도중 오류가 발생했을 때 모든 변경 사항을 이전 상태로 되돌리는 기능입니다. 롤백을 통해 데이터 일관성을 유지할 수 있습니다.
데이터 무결성이란 무엇이며, 이를 보장하는 방법은 무엇인가요?
데이터 무결성은 데이터가 정확하고 일관된 상태를 유지하는 것을 의미합니다. 이를 보장하기 위해 데이터베이스에서는 기본 키(Primary Key), 외래 키(Foreign Key), 유니크 제약 조건, 체크 제약 조건 등을 사용합니다. 트랜잭션을 사용하여 ACID 원칙을 준수하는 것도 중요한 방법입니다.
ORM(Object-Relational Mapping)이란 무엇이며, 이를 사용하는 이유는 무엇인가요?
ORM은 객체 지향 프로그래밍 언어에서 데이터베이스 테이블을 객체로 매핑해주는 기술입니다. 이를 사용하면 데이터베이스 접근 코드를 객체로 다룰 수 있어 코드의 재사용성과 유지보수성이 높아집니다. 또한 SQL 작성의 복잡함을 줄이고, 데이터베이스의 변경 사항을 쉽게 반영할 수 있습니다.
인덱스 설계 시 고려해야 할 점은 무엇인가요?
인덱스 설계 시에는 자주 조회되는 컬럼에 인덱스를 생성하여 성능을 최적화해야 합니다. 하지만 인덱스가 많으면 삽입과 업데이트 성능이 저하될 수 있으므로, 트랜잭션 성능에 영향을 미치지 않도록 주의해야 합니다. 또한, 복합 인덱스의 순서를 잘 설계하여 다양한 쿼리에서 효율적으로 사용할 수 있도록 해야 합니다.
배치 작업이란 무엇이며, 어떻게 처리하나요?
배치 작업은 대량의 데이터를 일정한 주기 또는 비동기적으로 처리하는 작업입니다. 주로 야간이나 특정 시간대에 대량의 데이터를 처리하는 데 사용됩니다. 배치 작업은 데이터베이스 부하를 최소화하기 위해 적절한 트랜잭션 처리와 효율적인 쿼리 사용이 필요합니다. Spring Batch 같은 프레임워크를 사용해 작업을 쉽게 구현할 수 있습니다.
시퀀스와 자동 증가(auto-increment)의 차이점은 무엇인가요?
시퀀스는 사용자가 정의한 값으로 원하는 범위 내에서 번호를 생성하는 기능이며, 주로 Oracle에서 사용됩니다. 자동 증가(auto-increment)는 MySQL에서 주로 사용되는 기능으로, 테이블에 새로운 행이 삽입될 때 자동으로 증가하는 번호를 부여합니다. 시퀀스는 여러 테이블에서 공유할 수 있는 반면, 자동 증가는 특정 테이블에서만 사용됩니다.
데이터베이스 연결 수 증가로 인한 병목 현상을 어떻게 해결할 수 있나요?
데이터베이스 연결 수가 증가할 경우 병목 현상이 발생할 수 있습니다. 이를 해결하기 위해 Connection Pooling을 사용하여 데이터베이스 연결을 재사용함으로써 성능을 최적화할 수 있습니다. 또한, 데이터베이스를 읽기 전용 서버와 쓰기 전용 서버로 분리하여 트래픽을 분산시키는 방법도 있습니다.
캐싱이란 무엇이며, 어떻게 성능을 향상시킬 수 있나요?
캐싱은 자주 조회되는 데이터를 미리 메모리에 저장하여, 데이터베이스 접근 없이 빠르게 응답하는 방법입니다. Redis나 Memcached 같은 캐시 시스템을 사용하면 자주 조회되는 데이터를 캐싱하여 성능을 대폭 향상시킬 수 있습니다. 하지만 캐시된 데이터가 오래된 경우 데이터 일관성이 문제가 될 수 있으므로 적절한 캐시 무효화 전략이 필요합니다.
대규모 트래픽에서 발생할 수 있는 Connection Pool 이슈를 어떻게 해결하나요?
대규모 트래픽에서는 데이터베이스 연결(Connection)이 부족해지는 문제가 발생할 수 있습니다. 이를 해결하기 위해 Connection Pool을 설정하여 데이터베이스 연결을 효율적으로 재사용할 수 있습니다. 또한, 각 애플리케이션에 적절한 최대 연결 수를 설정하고, 연결 시간이 길어지는 것을 방지하기 위해 타임아웃을 설정하는 것이 좋습니다.
대규모 트래픽 처리 시 데이터베이스 로드를 줄이기 위한 방법은 무엇인가요?
데이터베이스 로드를 줄이기 위해 읽기-쓰기 분리와 캐싱 전략을 사용할 수 있습니다. 읽기 전용 복제본을 사용하여 읽기 트래픽을 분산하고, 자주 조회되는 데이터를 Redis 같은 캐시 시스템에 저장해 데이터베이스에 대한 읽기 요청을 줄입니다. 또한, 비동기 처리 및 메시지 큐를 사용하여 데이터베이스에 동시성 부하를 줄일 수 있습니다.