👀 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의 여러 방법..
👀 Overview 나는 포민(포장의 민족) 프로젝트에서 사장님 서버에서 가게 도메인과 메뉴 도메인을 맡았다. 포장의 민족 프로젝트에서의 특이점이라고 한다면, 고객팀과 사장팀이 각각 서버를 나누고, 서버를 나눴으니 DB 또한 각각 나눠 진행을 했다. 그랬기 때문에, 해당 사장 서버의 DB와 고객 서버의 DB의 정합성을 맞추는 것이 핵심이였고 항상 사장 서버에서 자원이 생성되거나 변경될 때 마다 고객팀 서버로 정보를 전송해 주어야 했다. 따라서 아래와 같이 InfoSender 빈을 통해서 RestTemplate을 통해 정보를 고객팀 서버로 전달했다. @Component @RequiredArgsConstructor public class InfoSender { private final RestTemplate..
🚪 들어가기에 앞서... 먼저, 이 포스트에서는 내가 얼마나 디자인 패턴에 대해서 열심히 공부했는지, 얼마나 많은 디자인 패턴을 아는지 보다 디자인 패턴으로 어떤 문제를 해결 했는지에 포커스를 맞춰 보고 싶다. 왜냐하면 디자인 패턴을 잘 알고 학습하는 것도 중요하지만, 디자인 패턴으로 어떤 문제를 해결 했는지가 더 중요하다고 생각하기 때문이다 디자인 패턴 각각에 대한 자세한 설명은 노션에 상세히 기록을 해 놓았다..! 😊 디자인 패턴에 대해서 학습하고 정리한 노션 링크 23가지 디자인 패턴에 대해서 | Notion 디자인 패턴이란 kaput-trombone-343.notion.site 1. 디자인 패턴 이란 디자인 패턴이란 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 해결책을을 말한다. SOL..
지난 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이름을 가지고 있는..
Space club 프로젝트를 진행하는데 있어서 코드리뷰를 활성화 했다. 팀원들과의 코드리뷰는 직설적이고 간결하게 진행하는 것을 원칙으로 했다. 코드에 있어서 당연한 것은 없었다. 기능적으로 올바르게 동작하는 것은 필수적이였지만 어떻게 구현하는지, 어떠한 방식이 더 효율적인지 고민하는 것도 필수적이라고 생각했다. 위 팀원과 마주친 상황 다음과 같다. null 체크 할때 optional의 메서드를사용하는게 맞는가? 아니면 그냥 value == null 비교를 통해 검증하는게 맞는가? ❓먼저 나는 왜 Optional을 사용했는가 나는 null을 직접 다루는 것이 NPE에 있어서 위험하기때문에 null을 직접적으로 다루기보다 Optional 클래스를 통해 한번 wrapping해 사용하는 것이 낫다는 생각하에 ..
- Total
- Today
- Yesterday