전체 글
-
외래키와 잠금스터디/MySQL 2025. 2. 9. 22:25
MySQL 외래 키(Foreign Key)란?MySQL에서 외래 키(Foreign Key, FK)는 한 테이블의 컬럼이 다른 테이블의 기본 키(Primary Key) 또는 고유 키(Unique Key)를 참조하도록 설정하는 제약 조건입니다. 이를 통해 데이터 무결성을 유지하고, 테이블 간의 일관성을 보장할 수 있습니다.다만, MySQL에서는 InnoDB 스토리지 엔진에서만 외래 키를 지원하며, 성능 및 유지보수 이슈로 인해 실무에서는 외래 키를 사용하지 않는 경우도 많습니다. 실무에서 외래 키를 사용하지 않는 이유수동 데이터 적재 및 긴급 조치의 어려움외래 키가 설정된 경우, 부모 테이블과 자식 테이블 간의 참조 무결성이 강제됩니다.하지만 수동으로 데이터를 적재하거나 긴급 조치가 필요한 경우, 복잡한 관..
-
공유 락과 배타 락에 대해서 알아보자스터디/MySQL 2025. 2. 9. 21:14
InnoDB에서는 행 수준 잠금을 지원하며 이를 공유(S) 락과 배타(X)락 이라고 부릅니다. 이번 포스팅에서는 각 락의 특징에 대해서 알아보겠습니다. 공유 락(Shared(S) Lock) 공유 락을 보유한 트랜잭션은 특정 행을 읽을 수 있습니다. 또한, 공유 락에 걸린 데이터는 읽기 연산만 가능하며 쓰기 연산은 불가능합니다. 공유 락에 걸린 데이터는 다른 트랜잭션이 공유 락밖에 휙득하지 못 하며 배타 락은 휙득할 수 없습니다. 공유 락을 사용해 조회하면 트랜잭션 내 조회한 데이터가 변경되지 않음을 보장할 수 있습니다. 아래와 같이 SELECT FOR SHARE 를 사용하여 특정 데이터로부터 공유 락을 획득할 수 있습니다.SELECT * FROM table_name WHERE id = 1 FOR SHAR..
-
CSRF를 diable 하는 이유스터디/Web 2025. 1. 29. 00:25
최근 Spring Security를 작업하다가 습관적으로 CSRF(Cross-Site Request Forgery)를 비활성화하는 모습을 발견했습니다. 왜 CSRF를 disable해야 하는지, 그리고 CSRF란 무엇인지 자세히 알아보려고 합니다. CSRF란?CSRF는 Cross-Site Request Forgery의 약자로, 교차 사이트 위조 요청을 의미합니다. 이는 사용자 몰래 위조된 요청을 서버에 보내는 공격 기법입니다. 직관적으로 이해하기 어렵지만, 공격의 구체적인 과정을 보면 왜 "Cross-Site"라는 이름이 붙었는지 알 수 있습니다. CSRF 공격의 과정정상적인 사이트(Sonny)에 로그인사용자는 sonny.com에 로그인합니다. 서버는 사용자 인증 후 브라우저에 쿠키를 생성하고 저장합니다...
-
READ COMMITED와 REPEATABLE READ 비교스터디/MySQL 2025. 1. 6. 16:57
트랜잭션의 격리 수준(isolation level)은 여러 트랜잭션이 동시에 실행될 때, 특정 트랜잭션이 다른 트랜잭션의 변경사항이나 데이터를 조회할 수 있는지를 결정하는 중요한 설정입니다. MySQL은 총 4가지 격리 수준을 제공합니다.READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE이 중에서 READ UNCOMMITTED는 커밋되지 않은 데이터를 읽는 Dirty Read 문제를 일으킬 수 있고, SERIALIZABLE은 동시 처리 성능이 낮아지는 단점 때문에 거의 사용되지 않습니다.따라서 이번 포스팅에서는 가장 자주 사용되는 READ COMMITTED와 REPEATABLE READ를 중심으로, 두 격리 수준의 차이점과 특징을 살펴보겠습니다.READ..
-
InnoDB스토리지 엔진 수준의 락스터디/MySQL 2025. 1. 6. 16:53
InnoDB 스토리지 엔진은 레코드 기반의 잠금 기능을 제공합니다. 이 덕분에 MyISAM 보다 뛰어난 동시성 처리를 제공합니다.또한, 잠금 정보가 상당히 작은 공간에서 관리되기 때문에 레코드 락이 페이지 락 또는 테이블 락으로 레벨업되지 않는 특징이 있습니다. InnoDB 스토리지 엔진에서는 레코드 락, 갭락, 넥스트 키락을 제공합니다. 이번 포스팅에서는 레코드 락과 갭 락 그리고 넥스트 키 락에 관해 다뤄보겠습니다. 레코드 락(Record Lock) 일반적으로 레코드 락(record lock)은 테이블의 특정 레코드를 잠그는 기능으로 이해됩니다.그러나 MySQL의 레코드 락은 테이블의 레코드를 직접 잠그는 것이 아니라, 인덱스의 레코드를 잠급니다.이 개념을 이해하기 위해 특정 레코드를 수정하는 상황을..
-
MVCC(Multi Version Concurrency Control)스터디/MySQL 2024. 11. 27. 22:45
MVCC는 일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능입니다. Multi Version Concurrency Control(MVCC)을 직역하면 '다중 버전 동시성 제어'입니다. 이 표현에서 유추할 수 있는 것은 'MVCC는 여러 버전이 존재하며, 동시성 제어와 관련이 있다'는 점입니다. 하나 이상의 버전이 존재한다?하나의 레코드에 여러개의 버전이 동시에 관리됨을 의미합니다. 여러개의 버전이 왜 필요할까?(READ_COMMITTED 격리 수준을 전제로)한 레코드를 수정 중일 때, 해당 레코드를 조회하는 요청이 들어오면, 아직 수정 내용이 커밋되지 않았으므로 수정 전의 데이터를 조회해야 합니다.또한, 하나의 트랜잭션에서 레코드를 수정한 뒤 다른 작업 중 에러가 발생하면 기존 데이..
-
NAT Gateway를 NAT Instance로 대체하자스터디/인프라 2024. 11. 25. 17:20
출시를 목표로 프로젝트를 진행 중인 학생으로서, 그동안 대학 사업단의 지원을 받아 AWS 관련 비용을 충당해 왔습니다. 하지만 이제 팀원 대부분이 졸업을 앞두고 있어, AWS 비용이 큰 부담으로 다가오고 있습니다. 이에 따라 AWS 인프라를 재구성하기로 결정했으며, 목표는 비용을 최소화하는 것입니다. 이를 위해 첫 번째로 시도한 방법은 NAT Gateway를 NAT Instance로 대체하는 것이었습니다. NAT Gateway AWS에서는 Private Subent 내의 인스턴스가 VPC 외부의 서비스(인터넷)에 연결할 수 있도록 하게 해주는 NAT Gateway 서비스를 제공해주고 있습니다. https://aws.amazon.com/ko/vpc/pricing/ 논리적으로 격리된 가상 네트워크 - Am..
-
왜 Private Subnet이 필요한가? (feat : 보안 그룹)스터디/인프라 2024. 11. 18. 17:05
프로젝트를 진행하며 팀원들에게 이런 질문을 받은 적이 있습니다."Private Subnet을 사용하는 이유가 뭐야? 보안은 보안 그룹으로 설정하면 되지 않나?"이 질문에 명확히 답변하지 못했던 경험이 있어, 이번 기회에 Private Subnet과 보안 그룹의 차이와 필요성을 정리해보려 합니다.Private Subnet과 보안 그룹이란? Private Subnet은 인터넷 게이트웨이와 연결되지 않아 외부에서 접근이 불가능한 서브넷입니다. Private Subnet에 속한 리소스는 인터넷에 직접 노출되지 않고, 내부 네트워크에서만 접근 가능합니다. 반면, 보안 그룹은 AWS 리소스(예: EC2, RDS 등)의 인바운드와 아웃바운드 트래픽을 제어하는 가상 방화벽입니다. 특정 IP, 포트, 프로토콜 규칙을 기..