본문 바로가기

프로젝트

(43)
팩토리 메소드 패턴으로 리팩토링 문제상황 카카오 페이를 통해 결제를 구현했다. 코드는 전적으로 카카오페이에 의존한 상태이다. 문제는 새로운 결제수단이 등록 되었을 때 생긴다. 결제 코드가 카카오 페이에 전적으로 의존하여 기존의 코드를 다 바꿔야 한다는 문제점이 생긴다. 이러한 문제점을 해결하기 위해 팩토리 메소드 패턴을 이용하여 리팩토링 하였다. 이유 여러가지 디자인 패턴 중 팩토리 메서드 패턴을 이용한 가장 큰 이유는 객체 생성을 캡슐화 하기 때문이다. 객체 생성을 캡슐화를 통한 얻을 수 있는 이점은 다음과 같다. 확장성 객체 생성 코드를 수정하지 않고도 새로운 객체를 추가하거나 기존 객체를 변경할 수 있다. 이는 시스템의 확장성을 높이는데 큰 장점이 된다. 코드 중복 최소화 객체 생성 코드를 중복해서 작성하는 일이 없어지고, 코드의..
낙관적 락을 적용하여 동시성 문제 해결하기 문제상황 여러명의 이용자가 동시에 주문을 진행하거나 주문을 취소할 경우 즉 멀티 스레드 환경에서 상품의 재고는 안정적으로 변화하는가에 대한 문제를 직면하게 되었다. 결과는 역시나 실패.. 해결방법 이러한 상황에서 내가 선택한 해결 방법을 소개하고자 한다. 선택지는 다음과 같이 있었다. 1. 비관적 락 2. 낙관적 락 3. 네임드 락 4. Redis의 Lettuce 또는 Redisson 라이브러리 활용 각 방법에 대한 장단점을 비교하는 글이 아니기에 내가 선택한 낙관적 락에 대해서 설명하도록 하겠다. 설명하기에 앞서 낙관적 락을 선택한 이유를 설명하겠다. 우선 mysql dbms를 이용하고 있는 상황이었기 때문에 Redis를 적용시키지 않았다. 또한, 상품중 같은 상품을 여러 사용자가 같은 시간에 주문하거..
@Transactional과 AOP 들어가며 지난 AOP에 관한 글에 이어 내가 겪은 문제와 이를 해결하는 과정을 담아 보겠다. 그 전에 스프링에서 @Transactional을 처리하는 과정을 먼저 짚고 넘어가보자 @Transactional과 AOP 트랜잭션 처리를 위한 @Transactional 어노테이션은 Spring AOP의 대표적인 예이다. @Transactional 또한 Proxy 형태로 동작한다. 동작과정 target에 대한 호출이 들어오면 AOP proxy가 이를 가로채서(intercept) 가져온다. AOP proxy에서 Transaction Advisor가 commit 또는 rollback 등의 트랜잭션 처리를 한다. 트랜잭션 처리 외에 다른 부가 기능이 있을 경우 해당 Custom Advisor에서 그 처리를 한다. 각 ..
mysql 쿼리 실행 계획 #2 이전 글에 이어 인덱스를 이용해 성능 튜닝을 해보자 쿼리에 앞서 show index 쿼리를 실행했을 때 출력되는 요소에 대해 이해해보자 Table: 인덱스가 생성된 테이블의 이름을 나타냅니다. Non_unique: 이 컬럼은 인덱스가 중복 허용 여부를 나타낸다. 만약 값이 0이면, 인덱스에 중복된 값이 없음을 나타낸다. 즉, 유니크 인덱스를 나타낸다. 반면 값이 1이면, 인덱스가 중복된 값을 가질 수 있음을 의미한다. Key_name: 인덱스의 이름을 나타낸다. "PRIMARY"는 기본 키를 의미한다. Seq_in_index: 복합 인덱스의 경우 각 컬럼이 인덱스 내에서 몇 번째 위치인지를 나타내는 순서 번호이다. Column_name: 인덱스에 포함된 컬럼의 이름을 나타낸다. Collation: 이 컬..
mysql 쿼리 실행 계획 #1 들어가며 앞전에 인덱스에 대해서 학습을 하였다. 인덱스를 잘 활용하면 성능이 개선되거나 잘못 활용하면 오히려 성능이 안좋아질 수 있다고 배웠는데, 얼마나 개선되고 얼마나 저하가 되는지 어떡하면 확인할 수 있을까? 쿼리 실행 계획 바로 쿼리 실행 계획을 통해 확인할 수 있는데, 쿼리 실행 계획이란 SQL문을 어떻게 데이터를 불러올 것인지에 관한 계획, 경로를 의미한다. 실습 위와 같은 구조의 스키마가 존재한다. 사원은 총 300024명이 존재한다. 다음의 쿼리문에 대한 실행 계획을 보자 컬럼은 (id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra)으로 구성되어 있다. 각 컬럼들을 해석..
프로젝트에 vault 적용하기 프로젝트를 진행하며 OAuth 2.0을 적용해 소셜 로그인을 적용했다. 이때 API호출에 대한 키와, 비밀번호가 필요한데, 이러한 설정 파일을 깃허브에 올리지 않고 협업하는 사람들과 어떻게 공유할 수 있을까에 대해서 고민하게 되었다. 그러던 중 vault라는것에 대해서 알게 되었고 vault를 이용해 보안상 중요한 데이터들을 관리해보게 되었다. vault를 처음 적용시키다 보니 많은 어려움을 겪었지만 적용시키는데 성공하였고 적용시키는 과정을 정리한 자료가 많지 않아 이를 정리해보고자 한다. Vault란? 우선 적용하는 과정을 설명하기에 앞서 Vault가 무엇인지부터 알아보도록 해보자. 글의 첫부분을 읽으면 예상할 수 있듯이, vault란 문서와 파일을 저장하는 저장소로, ID기반 비밀 및 암호화 관리 시..
프로젝트를 시작하며(docker) 프로젝트를 시작할때 협업을 하는 동료와 같은 db환경을 사용하면 좋겠다라는 생각에 docker를 이용해 각각의 로컬에서 mysql 서버를 띄워서 같은 db환경을 맞췄다. docker를 처음 사용해 봤는데 이번 기회에 docker에 대해서 정리해보고자 한다. 도커란? 컨테이너 기반의 가상화 도구 가상화? 그렇다면 가상화란 무엇이고 가상화의 등장 배경은 어떻게 될까? 예를들어 6천만원짜리 좋은 성능의 서버가 있다고 가정해보자. 이 서버에 쇼핑몰이 있다고 생각하고 고정 사용자는 1000명이 있다고 가정하면 서버의 성능에 비해 실제로 하는일은 부족해 성능이 아까운 셈이 된다. 이러한 점이 아까워 해당 서버에 새로운 프로젝트를 올리려고 한다. 하지만 앞전에서 사용하던 쇼핑몰 프로젝트와 충돌이 일어나는 상황이 발생..
프로젝트를 시작하며(branch 전략) 앞서 merge 전략에 이어 내가 앞으로 할 프로젝트의 branch 전략과 왜 이러한 branch 전략을 선택했는지에 대해 정리를 해보겠다. 우리는 개발을 진행하면서 우리가 구현한 소스코드를 git이라는 버전 관리 시스템을 통해 관리한다. git을 사용함으로써 우리는 시시각각 코드를 전송할 수 있으며, commit 내역을 통해 어떤 작업이 이루어졌는지 확인할 수 있다. 협업을 할때에도 git을 이용해 각각의 환경의 branch에서 작업을 하고 메인 저장소에 merge를 하며 협업을 할 수 있는데 우리는 어떠한 방식으로 branch를 나누고 개발할수 있을까에 대해서 말해보려고 한다. 대표적인 전략인 git flow, git lab flow, github flow에 대해서 설명하고자 한다. git flow ..