8주차 후기
크흠.. 8주차는 불참했다...
벌써 다음이 마지막 cs스터디이다 마지막까지 파이팅
트랜잭션
트랜잭션이란 무엇인지 설명해주세요
트랜잭션(Transaction)은 데이터베이스에서 실행되는 하나의 논리적인 작업 단위를 말합니다. 보통은 여러 개의 쿼리문들로 이루어지며, 이 중 하나라도 실패하면 전체 작업이 롤백되어 이전 상태로 돌아갑니다. 따라서 데이터베이스의 무결성을 보장하기 위해 사용됩니다.
트랜잭션과 Lock
트랜잭션을 사용할 때 동시에 여러 사용자가 동일한 데이터에 접근하여 문제가 발생할 수 있습니다. 이를 방지하기 위해 Lock(락) 기능을 사용합니다. Lock은 특정 데이터나 테이블에 대해 다른 사용자들의 접근을 막아 동시에 접근하는 것을 방지합니다.
트랜잭션의 특성(ACID)에 대해 설명해주세요
트랜잭션의 특성은 ACID라고 불립니다.
ACID란 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)의 약자입니다.
- 원자성(Atomicity) : 하나의 트랜잭션은 작업의 일부만 실행되는 것이 아니라, 전체가 실행되거나 전혀 실행되지 않아야 합니다.
- 일관성(Consistency) : 트랜잭션이 실행되기 전과 후의 데이터베이스 상태가 일관성이 있어야 합니다.
- 고립성(Isolation) : 여러 트랜잭션이 동시에 실행될 경우, 각 트랜잭션은 독립적으로 실행되는 것처럼 보이게 합니다.
- 지속성(Durability) : 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 반영되어야 합니다.
트랜잭션의 상태
- 활동(Active) : 트랜잭션이 실행 중인 상태입니다.
- 실패(Failed) : 트랜잭션 실행 중 오류가 발생하여 실패한 상태입니다.
- 중단(Aborted) : 트랜잭션이 실행에 실패하고 롤백된 상태입니다.
- 부분 완료(Partially Committed) : 트랜잭션 실행이 끝나고, 커밋되기 직전 상태입니다.
- 완료(Committed) : 트랜잭션이 정상적으로 완료되고, 커밋된 상태입니다.
트랜잭션을 사용할 때 주의할 점
- 트랜잭션 범위를 최소화하여 데드락 등의 문제를 방지합니다.
- 가능한 한 빠르게 처리하여 다른 트랜잭션과 충돌하지 않도록 합니다.
- 데이터베이스에서 지원하는 격리 수준을 이해하고 적절하게 사용합니다.
- 예외 처리를 적절하게 처리하여 롤백이 제대로 이루어지도록 합니다.
- 트랜잭션 범위 내에서 락을 적절하게 사용하여 동시성 문제를 방지합니다.
Statement vs PreparedStatement
Statement와 PreparedStatement는 SQL 쿼리를 실행할 때 사용되는 인터페이스입니다.
Statement는 실행 시 매번 SQL 쿼리를 파싱하고 컴파일하기 때문에 성능이 떨어지고 보안상 취약점이 존재할 수 있습니다.
PreparedStatement는 SQL 쿼리를 미리 파싱하여 컴파일해 둔 상태에서 매개 변수를 전달하여 실행하므로 성능이 더 빠르고 보안상 안전합니다.
PreparedStatement를 사용하는 것이 일반적으로 좋은 방법입니다. 또한 PreparedStatement를 사용하면 SQL Injection 등의 보안 문제를 방지할 수 있습니다.
트랜잭션 격리 수준
Isolation level 필요성
격리 수준(Isolation level)은 데이터베이스에서 동시성 제어(concurrency control)를 위해 사용되는 개념으로, 동시에 여러 트랜잭션이 실행될 때 발생하는 문제를 해결하기 위한 수준을 설정하는 것입니다.
격리 수준의 종류와 발생하는 동시성 제어 문제
- Read uncommitted: 트랜잭션이 완료되지 않은 다른 트랜잭션의 변경 내용을 읽을 수 있습니다. 이로 인해 dirty read(더러운 읽기)라는 문제가 발생할 수 있습니다.
- Read committed: 트랜잭션에서 커밋된 변경 내용만 읽을 수 있습니다. 하지만 커밋되지 않은 변경 내용은 다른 트랜잭션에서 읽을 수 있으므로 non-repeatable read(반복 불가능한 읽기) 문제가 발생할 수 있습니다.
- Repeatable read: 트랜잭션이 읽은 데이터는 다른 트랜잭션에서 변경할 수 없습니다. 하지만 새로운 데이터가 추가되거나 삭제되는 경우 phantom read(유령 읽기) 문제가 발생할 수 있습니다.
- Serializable: 트랜잭션 간에 직렬화(serialization)를 보장하여 동시성 문제를 완전히 해결할 수 있지만, 성능이 저하될 수 있습니다.
동시성 제어로 발생하는 문제
- Dirty read(더러운 읽기): 트랜잭션이 완료되지 않은 다른 트랜잭션의 변경 내용을 읽는 문제입니다. 이 경우, 다른 트랜잭션이 롤백되면 읽은 내용이 무효화되는 문제가 발생할 수 있습니다.
- Non-repeatable read(반복 불가능한 읽기): 트랜잭션에서 읽은 데이터가 다른 트랜잭션에서 변경되어 읽은 내용과 다른 경우입니다.
- Phantom read(유령 읽기): 트랜잭션에서 읽은 데이터와 다른 트랜잭션에서 새로 추가된 데이터가 있을 때 발생하는 문제입니다.
낮은 단계 Isolation Level을 활용할 때 발생하는 현상들
- Dirty read(더러운 읽기): Read uncommitted 레벨에서 발생할 수 있는 문제입니다.
- Non-repeatable read(반복 불가능한 읽기): Read committed 레벨에서 발생할 수 있는 문제입니다.
- Phantom read(유령 읽기): Repeatable read 레벨에서 발생할 수 있는 문제입니다.
Redis란
정의
Redis는 Remote Dictionary Server의 약자로, 메모리 기반의 key-value 데이터 저장소입니다.
Redis는 NoSQL 데이터베이스 중 하나로, 메모리 기반의 데이터 저장 방식으로 빠른 응답 속도를 제공합니다. Redis는 디스크에 저장된 데이터를 메모리에 캐싱하여 읽기 속도를 높이는 기술인 인 메모리 데이터 그리드(in-memory data grid)의 일종입니다.
Redis의 특징
- 데이터 저장 방식: Redis는 key-value 형식으로 데이터를 저장합니다. 데이터는 메모리에 저장되며, 영속적인 데이터 저장을 위해 디스크에 저장할 수도 있습니다.
- 다양한 데이터 구조: Redis는 다양한 데이터 구조를 지원합니다. 예를 들어, 문자열, 해시, 리스트, 셋, 정렬된 셋 등이 있습니다.
- 높은 성능: Redis는 메모리에 데이터를 저장하고 있기 때문에 빠른 응답 속도를 제공합니다. 또한 Redis는 복제(replication)와 샤딩(sharding)을 지원하여 확장성을 높일 수 있습니다.
- Pub/Sub: Redis는 Pub/Sub 기능을 지원합니다. 이를 이용하여 메시지 브로커(message broker)와 같은 역할을 할 수 있습니다.
- Lua 스크립팅: Redis는 Lua 스크립팅 언어를 지원합니다. 이를 이용하여 복잡한 데이터 처리 작업을 수행할 수 있습니다.
Redis는 다양한 분야에서 사용되고 있습니다. 예를 들어, 캐시로 사용하거나, 세션 저장소로 사용하거나, 실시간으로 변하는 데이터를 처리하는 데 사용될 수 있습니다.
ORM
ORM이란
ORM은 Object-Relational Mapping의 약자로, 객체와 관계형 데이터베이스 간의 매핑을 처리하는 기술이나 프레임워크를 말합니다. ORM을 사용하면 객체 지향적인 프로그래밍 언어로 작성된 코드를 데이터베이스와 상호작용할 수 있는 SQL 쿼리로 자동 변환하여 데이터베이스와 상호작용할 수 있습니다.
객체-관계 간의 불일치
관계형 데이터베이스는 테이블, 로우, 컬럼과 같은 구조를 가지고 있습니다. 반면 객체 지향 프로그래밍은 클래스, 객체, 상속과 같은 구조를 가지고 있습니다. 이 두 구조의 불일치로 인해 객체를 관계형 데이터베이스에 저장하는 것이 어렵습니다. 이를 해결하기 위해 ORM 프레임워크를 사용합니다.
ORM의 장단점
장점
- 객체 지향적인 코드 작성으로 생산성 향상
- 데이터베이스의 구조와 상관 없이 객체 모델링 가능
- 코드의 가독성과 유지보수성 향상
- SQL 쿼리를 직접 작성하지 않아도 되므로 개발자가 데이터베이스와 상호작용하는 데 필요한 노력과 시간을 줄일 수 있음
단점
- SQL 쿼리를 직접 작성하지 않기 때문에 데이터베이스에 대한 세부적인 조작이 어려울 수 있음
- ORM 자체의 성능 문제가 발생할 수 있음
- ORM 프레임워크를 사용하기 위한 추가적인 러닝 커브가 필요할 수 있음
ORM 프레임워크들
대표적인 ORM 프레임워크로는 Hibernate, Django ORM, Sequelize, Entity Framework 등이 있습니다.
데이터베이스 풀
DB와 Client가 Connection을 어떻게 구성하는지 설명해 주세요
일반적으로 DB와 Client 사이의 Connection은 TCP/IP 기반의 소켓 연결로 이루어집니다.
DBMS는 특정 포트 번호를 Listen하며, Client는 해당 포트 번호로 연결하여 요청과 응답을 주고받습니다.
과정
- Listen 단계: 데이터베이스 서버는 특정 포트 번호를 Listen하며, 클라이언트의 연결 요청을 대기합니다.
- Accept 단계: 클라이언트가 연결 요청을 하면, 데이터베이스 서버는 이를 Accept하여 연결을 수립합니다.
- Authentication 단계: 클라이언트가 연결을 수립한 이후, 데이터베이스 서버는 클라이언트의 인증을 검증하고 인증에 성공한 경우 클라이언트에게 데이터베이스 서버와의 세션 ID를 할당합니다.
- Request-Response 단계: 클라이언트는 데이터베이스 서버에게 요청을 보내고, 데이터베이스 서버는 이에 대한 응답을 반환합니다.
- Close 단계: 클라이언트와 데이터베이스 서버의 Connection이 끝나면, 클라이언트나 데이터베이스 서버 중 한쪽이 연결을 Close합니다.
'프로그래밍 > CS' 카테고리의 다른 글
결합도(Coupling)과 응집도(Cohension) (0) | 2023.05.18 |
---|---|
CS스터디 회고 (0) | 2023.05.16 |
CS스터디 8주차 - 데이터베이스(DB) 1/2 (0) | 2023.04.27 |
CS스터디 7주차 - 네트워크2(IP~DNS) (0) | 2023.04.20 |
2023 정처기(정보처리기사) 시험 신청 후기 및 좋은 자료 (1) | 2023.04.19 |
댓글