Light Blue Pointer
본문 바로가기
Developing/TIL(CS)

DB 로직 최소화 하기

by Greedy 2024. 4. 5.

DB 로직이란

데이터베이스에서 데이터를 저장, 검색, 업데이트, 삭제하는데 사용되는 프로세스 및 규칙

MySQL을 사용하는 애플리케이션에서 주로 사용하는 데이터베이스 로직

MySQL에서의 데이터베이스 로직은 주로 SQL(Structured Query Language) 쿼리

  • 데이터 검색
SELECT * FROM users WHERE age > 18;
  • 데이터 삽입, 갱신, 삭제
INSERT INTO users (name, age) VALUES ('John', 25);
UPDATE users SET age = 26 WHERE name = 'John';
DELETE FROM users WHERE name = 'John';
  • 트랜잭션 관리
BEGIN; -- 트랜잭션 시작
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 트랜잭션 커밋
  • 보안 및 권한 관리
GRANT SELECT, INSERT, UPDATE ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';
REVOKE SELECT ON database.* FROM 'user'@'localhost';

DB로직 최소화의 중요성

  • 데이터베이스 성능 개선
  • 유지보수성 향상

DB 로직 최소화를 하는 방법

비즈니스 로직 분리

  • 데이터베이스보다 서버(또는 클라이언트)에서 비즈니스 로직을 처리하는 것이 효율적인 경우가 있다.
  • 데이터를 가져온 후 서버(또는 클라이언트)에서 추가적인 계산을 수행하여 데이터베이스 부하를 줄일 수 있다.

쿼리 최적화

 

쿼리 최적화 방법 Query Optimization

쿼리 최적화 Nested Query를 지양 SELECT * FROM Orders WHERE customer_id IN (SELECT customer_id FROM Customers WHERE region = 'Asia'); 인덱싱 자주 액세스되는 필드에 인덱스를 생성하여 데이터 검색 속도를 향상시킨다 인

greedydeveloper.tistory.com

쿼리 캐싱

  • 자주 사용되는 쿼리 결과를 캐시해 반복적인 쿼리 실행을 피하고 성능 개선
  • 쿼리 캐싱 시 고려해야 할 점
    • 타겟 쿼리 : 어떤 쿼리를 캐싱할 것인지
    • 캐시 유효 기간 : 캐시된 결과를 얼마나 오랫동안 유지할 것인지
    • 쿼리 캐시의 크기 : 얼마나 많은 쿼리 결과를 저장할 것인지
    • 쿼리 캐시를 비울 시점 :
    • 성능 모니터링 및 최적화 : 캐시 히트율, 쿼리 응답 시간 등의 지표를 모니터링하고 필요한 경우 쿼리 캐시의 설정을 조정하여 성능을 최적화해야 함
  • 쿼리 캐시를 지원하는 DB
    • MySQL, MariaDB, PostgreSQL, Oracle Database, SQL Server

데이터 캐싱

  • 자주 사용되는 데이터를 애플리케이션 내에 캐싱하여 반복적인 db쿼리를 피할 수 있다
  • Redis나 Memcached와 같은 인메모리 캐시 솔루션을 사용할 수 있다

트랜잭션 사용 최소화

  • 필요한 데이터 조작 작업을 하나의 논리적 작업으로 그룹화하여 트랜잭션 내에서 수행해야 한다
    • ex : 사용자가 주문을 생성할 때 주문 생성, 주문 상품 추가, 결제 등의 작업을 하나의 트랜잭션으로 묶는 것
  • 트랜잭션 범위를 가능한 한 작게 유지해야 한다.
    • ex : 읽기 작업만 수행할 때는 트랜잭션을 사용하지 않는다.
    • ex : 사용자의 로그인 세션과 같이 빈번하게 발생하는 작은 작업에 트랜잭션을 사용하면 트랜잭션 범위를 너무 커지게 하여 성능이 저하된다.
  • 데이터베이스 리소스를 절약할 수 있다.
  • 불필요한 롤백 및 커밋 작업을 피할 수 있어 성능이 향상된다.

배치 처리

  • 데이터를 실시간으로 처리하는 대신 일정한 주기로 데이터를 축적하고 일괄적으로 처리
  • 대량의 데이터를 처리할 때 실시간 트래픽의 부하를 줄일 수 있다
  • 적절한 커밋 주기와 배치 크기를 설정하여 성능을 최적화 해야 함

스토어드 프로시저 및 함수 사용

  • 데이터베이스 서버에서 미리 컴파일되고 최적화되기 때문에, 일반적으로 쿼리를 직접 실행하는 것보다 빠르게 작동한다
  • 반복적인 작업이나 복잡한 쿼리를 수행할 때 성능 향상이 잘 된다

추가 효과 보안 강화 : 사용자가 직접 SQL문을 작성하고 실행하는 것보다 데이터베이스 보안이 강화됨 재사용성 증가 : 데이터베이스에 저장되어 여러 애플리케이션에서 재사용할 수 있음, 코드의 중복을 줄이고 유지보수를 용이하게 함 트랜잭션 관리 : 데이터 일관성을 유지하고 데이터베이스의 무결성을 보장함

쿼리 결과 제한

  • 필요한 만큼의 결과만을 조회하도록 쿼리를 제한하여 데이터베이스 부하를 줄인다

데이터 정규화 및 비정규화

  • 데이터 정규화 : 데이터 중복을 최소화
  • 데이터 비정규화 : 데이터 검색을 더 빠르게 만들 수 있다

데드라인 및 타임아웃 설정

  • 장기 실행되는 쿼리나 작업에 대한 타임아웃 및 데드라인을 설정하여 시스템 안정성을 유지한다

 

레퍼런스
https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html

 

'Developing > TIL(CS)' 카테고리의 다른 글

디자인 패턴  (0) 2024.04.17
HTTP/HTTPS  (0) 2024.04.11
SSL/TLS  (0) 2024.04.11
쿼리 최적화 방법 Query Optimization  (0) 2024.04.05
TCP와 UDP  (0) 2024.04.03