본문 바로가기
반응형

Back-End/Database33

NOT IN 쿼리를 사용할 때 발생할 수 있는 문제와 최적화 방법 아래와 같이 NOT IN을 사용한 쿼리는 직관적이고 사용하기 쉽지만, 대규모 데이터셋에서 심각한 성능 저하를 일으킬 수 있습니다.SELECT pFROM Post pWHERE p.id NOT IN :postIds문제점NOT IN은 부정 조건으로, 대부분의 DBMS에서 전체 테이블 스캔이나 인덱스 풀 스캔을 유발합니다. 전체 데이터나 테이블을 스캔한 후 조건에 맞지 않는 레코드를 필터링 해야하기 때문에 데이터베이스 옵티마이저가 효율적인 실행 계획을 세우기 어렵습니다.인덱스를 효과적으로 활용하지 못합니다. IN 절은 인덱스 Range Scan을 통해 빠르게 처리할 수 있지만, NOT IN은 인덱스 활용도가 현저히 떨어집니다.대량의 값을 IN 절에 넣으면 실행 계획 생성이 늘어나고, 파싱 및 최적화 단계에서 추.. 2025. 9. 15.
SQL Injection (SQL 인젝션) SQL 인젝션(SQL Injection) 은 웹 애플리케이션에서 사용자의 입력값이 SQL 쿼리에 안전하게 처리되지 않을 때 발생하는 보안 취약점입니다. 공격자는 이 취약점을 이용해 쿼리를 조작하여 인증을 우회하거나, 데이터를 조작하거나, 테이블 자체를 삭제할 수도 있습니다.예를 들어, 로그인 검증 시 아래와 같은 코드를 사용한다고 가정해 보겠습니다.public boolean login(String username, String password) { String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; try (Connection conn = DriverMana.. 2025. 9. 11.
NoSQL 데이터베이스 유형 NoSQL 데이터베이스의 유형은 키-값, 문서 지향, 열 지향, 그래프, 시계열이 있습니다.키-값 데이터베이스(Key-value Database) 는 키를 고유한 식별자로 사용하는 키-값 쌍의 형태로 데이터를 저장합니다. 구조가 단순하고, 빠른 읽기 및 쓰기 성능을 제공합니다. Redis, Amazon DynamoDB가 대표적인 예시이고, 세션 저장, 캐시, 실시간 순위 등으로 사용할 수 있습니다.문서 지향 데이터베이스(Document-oriented Database) 는 JSON, BSON, XML 등의 형식으로 데이터를 저장합니다. 유연한 스키마를 가지고 있으며, 복잡한 데이터 구조를 쉽게 표현할 수 있습니다. MongoDB, CouchDB가 대표적인 예시이고, 콘텐츠 관리 시스템, 사용자 프로필 저.. 2025. 9. 9.
트랜잭션 격리 수준 트랜잭션의 격리 수준은 동시에 여러 트랜잭션이 실행될 때 한 트랜잭션이 다른 트랜잭션의 연산에 영향을 받지 않도록 하는 정도를 말합니다.낮은 격리 수준은 동시 처리 능력을 높이지만, 데이터의 일관성 문제를 발생시킬 수 있습니다.반면, 높은 격리 수준은 데이터의 일관성을 보장하지만, 동시 처리 능력이 떨어질 수 있습니다. 즉, 데이터 정합성과 성능은 반비례합니다. 트랜잭션 격리 수준은 개발자가 트랜잭션 격리 수준을 설정할 수 있는 기능을 제공하는 기능입니다.종류 및 특징트랜잭션 격리 수준은 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ가 존재합니다.READ UNCOMMITTED는 커밋이 되지 않은 트랜잭션의 데이터 변경 내용 을 다른 트랜잭션이 조회하는 것을 허용.. 2025. 8. 28.
논리 삭제와 물리 삭제의 차이점 데이터베이스에서 데이터를 삭제하는 방법은 크게 물리 삭제(Hard Delete) 와 논리 삭제(Soft Delete) 가 존재합니다. 물리 삭제는 DELETE 명령어를 통해 직접 데이터를 삭제하는 방식이며, 논리 삭제는 UPDATE 명령을 사용하여 삭제를 여부를 나타내는 컬럼을 수정하는 방식을 의미합니다. 즉, 물리 삭제는 실제로 데이터를 삭제하는 반면 논리 삭제는 데이터가 삭제되었음을 표시만 한다는 점에서 차이가 있습니다.# 물리 삭제 처리delete from member where id = 1;# 논리 삭제 처리와 조회update member set deleted_at = curdate() where id = 1;select * from member where deleted_at is null;어떤 .. 2025. 8. 25.
열 기반 DB 와 행 기반 DB 의 차이점 행 기반 데이터베이스(Row-oriented Database) 는 데이터를 행 단위로 관리하는 DBMS입니다. 행 단위 읽기 맟 쓰기 연산에 최적화돼 있습니다. PostgreSQL, MySQL이 대표적인 행 기반 데이터베이스입니다.반면, 열 기반 데이터베이스(Column-oriented Database) 는 열 기반으로 데이터를 관리한다는 점에서 행 기반 데이터베이스와 차이가 있습니다. 데이터를 조회할 때 필요한 열만 로드하기 때문에 디스크 I/O를 줄일 수 있으며, 같은 종류의 데이터가 연속적으로 저장되므로 압축 효율이 높습니다. 이러한 특징으로 인해 주로 데이터 분석에 사용됩니다. 대표적인 열 기반 데이터베이스로는 BigQuery, Redshift, Snowflake가 존재합니다.예를 들어, 다음과 .. 2025. 8. 7.
RDB 페이징 쿼리의 필요성 페이징 쿼리(Paging Query) 는 전체 데이터를 부분적으로 나누어 데이터를 조회하거나 처리할 때 사용됩니다. 데이터를 상대적으로 작은 단위로 나누어 처리하기 때문에 데이터베이스나 애플리케이션의 리소스 사용 효율이 증가하며, 로직 처리 시간을 단축 시킬 수 있습니다. MySQL에서 페이징 쿼리는 일반적으로 LIMIT, OFFSET 구문을 사용하여 작성합니다.select *from subscribelimit 500offset 0;LIMIT, OFFSET 방식 페이징 쿼리의 단점 및 해결방안LIMIT, OFFSET 방식의 페이징 쿼리는 뒤에 있는 데이터를 읽을 수록 점점 응답 시간이 길어질 수 있는데요. 왜냐하면, DBMS는 지정된 OFFSET 수만큼 모든 레코드를 읽은 이후에 데이터를 가져오기 때문입.. 2025. 7. 31.
낙관적 락과 비관적 락 낙관적 락과 비관적 락은 데이터베이스 트랜잭션에서 동시성 제어를 위한 주요 기법입니다. 데이터 무결성을 유지하면서 여러 트랜잭션이 동시에 데이터에 접근할 때 발생할 수 있는 충돌을 해결할 때 사용됩니다.낙관적 락(Optimistic Lock) 은 데이터 충돌이 적을 것으로 가정하고, 데이터를 읽을 때 락을 설정하지 않고 트랜잭션이 데이터를 수정할 때 충돌이 발생하지 않았는지 확인하는 방식입니다. 보통 version과 같은 별도의 구분 컬럼을 사용해서 데이터가 변경되었는지 확인하며, 충돌이 발생하면 데이터베이스가 아닌 애플리케이션에서 직접 롤백하거나 재시도 처리를 해야 합니다.비관적 락(Pessimistic Lock) 은 데이터 충돌이 많을 것으로 가정하고, 트랜잭션이 시작될 때 공유락(Shared Loc.. 2025. 7. 30.
[DB] JOIN과 LEFT JOIN, 언제 무엇을 써야 할까요? (초보 개발자 필독) 교집합과 합집합 개념으로 이해하는 SQL/JPA 조인 전략데이터베이스를 다루다 보면 여러 테이블을 엮어 원하는 데이터를 조회해야 할 때가 많습니다. 이때 JOIN은 필수적으로 사용되는 기능입니다.JOIN과 LEFT JOIN은 가장 기본이지만, 많은 주니어 개발자분들이 언제 무엇을 써야 할지 헷갈려 하는 개념입니다. 이 글을 통해 두 조인의 차이점을 명확히 이해하고, 어떤 상황에 사용해야 하는지 알아보겠습니다.1. join (INNER JOIN) - "두 데이터가 모두 있어야만!"join은 SQL의 INNER JOIN과 같습니다. 두 테이블에 모두 데이터가 존재하는 행만을 가져오는, 즉 교집합을 구하는 조인입니다.개념 비유: 소개팅 매칭join을 1:1 소개팅 자리에 비유할 수 있습니다. 회원 테이블과 주.. 2025. 7. 15.
728x90
반응형