본문 바로가기

전체 글132

외래키와 잠금 MySQL 외래 키(Foreign Key)란?MySQL에서 외래 키(Foreign Key, FK)는 한 테이블의 컬럼이 다른 테이블의 기본 키(Primary Key) 또는 고유 키(Unique Key)를 참조하도록 설정하는 제약 조건입니다. 이를 통해 데이터 무결성을 유지하고, 테이블 간의 일관성을 보장할 수 있습니다.다만, MySQL에서는 InnoDB 스토리지 엔진에서만 외래 키를 지원하며, 성능 및 유지보수 이슈로 인해 실무에서는 외래 키를 사용하지 않는 경우도 많습니다. 실무에서 외래 키를 사용하지 않는 이유수동 데이터 적재 및 긴급 조치의 어려움외래 키가 설정된 경우, 부모 테이블과 자식 테이블 간의 참조 무결성이 강제됩니다.하지만 수동으로 데이터를 적재하거나 긴급 조치가 필요한 경우, 복잡한 관.. 2025. 2. 9.
공유 락과 배타 락에 대해서 알아보자 InnoDB는 행 수준 잠금을 지원하며 이는 공유(S) 락과 배타(X)락 이라 불립니다.이번 포스팅에서는 각 락의 특징에 대해서 알아보겠습니다. 공유 락(Shared(S) Lock) 공유 락을 보유한 트랜잭션은 특정 행을 읽을 수 있습니다. 또한, 공유 락에 걸린 데이터는 읽기 연산만 가능하며 쓰기 연산은 불가능합니다. 공유 락에 걸린 데이터는 다른 트랜잭션이 공유 락밖에 휙득하지 못 하며 배타 락은 휙득할 수 없습니다. 공유 락을 사용해 조회하면 트랜잭션 내 조회한 데이터가 변경되지 않음을 보장할 수 있습니다.아래와 같이 SELECT FOR SHARE 를 사용하여 특정 데이터로부터 공유 락을 획득할 수 있습니다.SELECT * FROM table_name WHERE id = 1 FOR SHARE; 배타.. 2025. 2. 9.
CSRF를 diable 하는 이유 최근 Spring Security를 작업하다가 습관적으로 CSRF(Cross-Site Request Forgery)를 비활성화하는 모습을 발견했습니다. 왜 CSRF를 disable해야 하는지, 그리고 CSRF란 무엇인지 자세히 알아보려고 합니다. CSRF란?CSRF는 Cross-Site Request Forgery의 약자로, 교차 사이트 위조 요청을 의미합니다. 이는 사용자 몰래 위조된 요청을 서버에 보내는 공격 기법입니다. 직관적으로 이해하기 어렵지만, 공격의 구체적인 과정을 보면 왜 "Cross-Site"라는 이름이 붙었는지 알 수 있습니다. CSRF 공격의 과정정상적인 사이트(Sonny)에 로그인사용자는 sonny.com에 로그인합니다. 서버는 사용자 인증 후 브라우저에 쿠키를 생성하고 저장합니다... 2025. 1. 29.
READ COMMITED와 REPEATABLE READ 비교 트랜잭션의 격리 수준(isolation level)은 여러 트랜잭션이 동시에 실행될 때, 특정 트랜잭션이 다른 트랜잭션의 변경사항이나 데이터를 조회할 수 있는지를 결정하는 중요한 설정입니다. MySQL은 총 4가지 격리 수준을 제공합니다.READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE이 중에서 READ UNCOMMITTED는 커밋되지 않은 데이터를 읽는 Dirty Read 문제를 일으킬 수 있고, SERIALIZABLE은 동시 처리 성능이 낮아지는 단점 때문에 거의 사용되지 않습니다.따라서 이번 포스팅에서는 가장 자주 사용되는 READ COMMITTED와 REPEATABLE READ를 중심으로, 두 격리 수준의 차이점과 특징을 살펴보겠습니다.READ.. 2025. 1. 6.
InnoDB스토리지 엔진 수준의 락 InnoDB 스토리지 엔진은 레코드 기반의 잠금 기능을 제공합니다. 이 덕분에 MyISAM 보다 뛰어난 동시성 처리를 제공합니다.또한, 잠금 정보가 상당히 작은 공간에서 관리되기 때문에 레코드 락이 페이지 락 또는 테이블 락으로 레벨업되지 않는 특징이 있습니다. InnoDB 스토리지 엔진에서는 레코드 락, 갭락, 넥스트 키락을 제공합니다. 이번 포스팅에서는 레코드 락과 갭 락 그리고 넥스트 키 락에 관해 다뤄보겠습니다. 레코드 락(Record Lock) 일반적으로 레코드 락(record lock)은 테이블의 특정 레코드를 잠그는 기능으로 이해됩니다.그러나 MySQL의 레코드 락은 테이블의 레코드를 직접 잠그는 것이 아니라, 인덱스의 레코드를 잠급니다.이 개념을 이해하기 위해 특정 레코드를 수정하는 상황을.. 2025. 1. 6.
MVCC(Multi Version Concurrency Control) MVCC는 일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능입니다. Multi Version Concurrency Control(MVCC)을 직역하면 '다중 버전 동시성 제어'입니다. 이 표현에서 유추할 수 있는 것은 'MVCC는 여러 버전이 존재하며, 동시성 제어와 관련이 있다'는 점입니다.  하나 이상의 버전이 존재한다?하나의 레코드에 여러개의 버전이 동시에 관리됨을 의미합니다. 여러개의 버전이 왜 필요할까?(READ_COMMITTED 격리 수준을 전제로)한 레코드를 수정 중일 때, 해당 레코드를 조회하는 요청이 들어오면, 아직 수정 내용이 커밋되지 않았으므로 수정 전의 데이터를 조회해야 합니다.또한, 하나의 트랜잭션에서 레코드를 수정한 뒤 다른 작업 중 에러가 발생하면 기존 데이.. 2024. 11. 27.
728x90