저는 8월 12일 부로 협업툴 B2B 서비스를 운영하는 회사에 근무하게 되었습니다.근황에 대해 짧게 이야기 하자면, 2주간의 온보딩을 마치고 과제를 받아 진행중입니다.✔️ Overview저는 개발을 학습해 오면서 널리쓰이는 DBMS인 MySQL을 주로 사용/학습을 진행 해 왔습니다.제 회사에서는 단일 DB로 PostgreSQL을 사용하는데, 이때 까지 학습한 RDBMS인 MySQL과의 차이점에 대해 기술해 보고자 합니다! :) [차이점 1️⃣] INDEX🐬 MySQLMySQL은 primary index를 테이블 당 반드시 하나 존재합니다. (지정 하지 않으면 MySQL InnoDB 스토리지 엔진이 자동 생성합니다)primary key를 기준으로 primary index가 생성되며, 이는 clusered..
👀 Overview Shared Lock과 Exclusive Lock은 S-Lock, X-Lock이라고도 하며, (읽기 락, 쓰기 락), (공유 락, 배타 락)이라고 불리기도 한다. 하지만 이 lock에 대한 내용을 학습하면서 여러 블로그들을 찾아봤는데, 잘못된 내용들이 정말 많았다! 그래서 그 내용들을 실제 내가 MySQL 쿼리를 통해 비교하면서 바로잡고, 파헤쳐 보기 위해서 글을 써야겠다는 결심을 했다. 🔐Shared Lock과 Exclusive Lock 먼저 앞 글에서도 언급했지만, InnoDB 스토리지 엔진 레벨에서의 Lock을 설명하면서 Shared Lock, Exclusive Lock의 개념이 나왔다. 특정 row에 lock을 걸면 레코드락, 여러 row에 range로 lock을 걸면 넥스크 ..
👀 Overview스페이스 클럽 프로젝트를 진행하면서, 아래와 같이 클럽에서 행사를 개최할때, 공연 카테고리의 행사를 신청하면 선착순 기능을 제공해야 했다.그래서 아래와 같이 행사 개최자가 최대 정원(아래는 100명)을 설정해 놓으면, 예매 장수를 선택해 신청을 해야 했다.그리고 정원이 없는 행사인 경우 최대 999명까지 받을 수 있도록 정책을 설정했었다.이때 발생할 수 있는 문제점이 동시성 문제가 발생할 수 있었다.따라서 행사를 신청하고 취소할때 동시성문제가 발생하지 않도록, 비관적 락(Pessimistic lock)을 사용해 동시성 문제를 해결하였다.그리고 api 호출 시 신청이 불가한 경우 발생한 스프링 예외를 변환해서 프론트에게 전달해 주었다. 프로젝트를 진행할 때는, 일단 lock의 여러 방법..
지난 1편에서 성능튜닝을 왜 해야하는지와 실행계획을 분석하는 방법에 대해서 살펴보았다. 실행계획의 정보를 보면서 어떤 것을 통해 성능을 개선할 수 있는지 약간은 감이 왔을 것이다. 그럼 이 분석한 실행계획을 바탕으로 정말 성능 개선을 해보자! ❓ 그럼 어떻게 실행되고 있는 SQL이 좋고 나쁜지 구분할 수 있을 까? 명확히 실행 계획 보고 성능 개선이 필요한지 선 그어 구분하긴 어렵다. 하지만 각자 상황에 맞게 검토 대상 추출이 필요하다. 자세한 내용은 노션을 참고하자. 위 실행계획의 특정 값에 대해서 설명하자면, 다음과 같다. 1. DEPENDENT SUBQUERY, DEPENDENT UNION (select_type) union, union all을 사용하는 서브쿼리가 메인 테이블의 영향을 받는 경우로..
나는 이번 Space Club 프로젝트를 진행하면서, SQL문을 작성하는 방식에 대해서 고민했었다. SQL 쿼리를 통해 같은 데이터 다루더라도 작성하는 방법은 여러 방법이 있는데, 내부적으로 DBMS 안에서 어떻게 작동되는지, 어떻게 SQL을 작성하는 것이 효율적인 방법인지 궁금했다. 일단 효율을 논하기 전에, 내가 프로젝트에서 썼던 MySQL 구조와 작동 방식부터 학습하는게 필수였다. 구조와 작동 방식보다도, 일단 왜 MySQL을 사용했는지에 대한 이해가 필요했다. 🤷 MySQL을 왜 프로젝트에서 사용했는가? 데이터베이스를 다루는 DBMS로는 여러 종류가 존재한다. 그 중, 관계형 DB는 1. 일반적으로 가장 많이 사용하는 데이터베이스이고, 2. 테이블 분리를 통해 중복값에 따른 성능 저하 방지 및 ..
문제 상황 Entity에서 key 생성 전략을 IDENTITY로 설정하면 auto_increment로 id가 null로 설정되어 DB에 INSERT이후, DBMS를 통해서 id 값을 받아 온다. 그런데, 이 auto_increment에 의존해 테스트를 위와 같이 작성할 경우, 각 테스트 마다 1부터 다시 id값을 생성하는게 아닌, 연속해서 id를 발행하기 때문에, auto_increment로 생성된 id에 의존해 테스트하는것에 문제가 생겼다. 아래 코드에서 보면, Template에는 id와 해당 template html을 저장한다. (아래는 template에 임의로 template 1,2를 넣어둔 것이다) 그래서 각 MailHistory는 어떤 template으로 보낼지 template이름을 가지고 있는..
1. DDL (Data Definition Language) - 데이터 정의어 : 데이터를 수정 / 삭제 등 데이터 전체 골격을 결정하는 역할의 언어를 말한다. - Conceptual Schema - CREATE, ALTER, DROP, TRUNCATE 2. DML (Data Manipulation Langage) - 데이터 조작어 : Table의 행과 열을 조작하는 언어. - SELECT, INSERT, UPDATE, DELETE 3. DCL (Data Control Language) - 데이터 제어어 : 데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 언어 - GRANT, REVOKE, COMMIT, ROLLBACK
스프링에서 데이터베이스를 학습하던 도중, WAS나 DB 접근 툴 같은 클라이언트를 사용해 DB서버에 접근 할 수 있다는 것을 학습했다. 이때, 클라이언트는 DB 서버에 연결을 네트워크 요청을 하여 TCP/IP 커넥션을 맺는다. 이때, DB 서버는 내부에 session이라는 것을 만드는데, 그리고 앞으로 커넥션을 통한 모든 요청은 이 session을 통해서 실행하게 된다고 하는데, session이 뭔지, 그리고 DB 내부에서도 요청을 thread per request로 처리하는지 궁금했다. 사실 MySQL의 SQL을 학습할 때에, 변수에 있어서 global variable, session variable이 있는것을 알았는데, session이 정확하게 뭔지 몰랐다. 1. MySQL에서의 Thread MySQ..
- Total
- Today
- Yesterday