본문 바로가기

프로젝트/고민

(39)
전략패턴을 이용한 리팩토링 문제점 현재 팩토리 메소드 패턴을 이용해 결제 시스템의 확장을 생각하며 구현하였다. 기존의 코드를 살펴보면 다음과 같다. 결제 종류를 인자로 받아 알맞은 결제 url로 리다이렉트 시켜주는 방법이다. 다음은 결제 종류가 담겨있는 팩토리 클래스이다. 현재 카카오페이만 구현한 상태이므로 종류에는 kakao 만 있다. 해당 클래스는 결제 종류를 인자로 받아 알맞은 구현체를 반환한다. 인터페이스 코드 구현체 코드 컨트롤러의 코드를 보면 알 수 있듯이, 팩토리에서 구현체를 반환했지만 구현체를 이용하지 않고 경로만 redirect 시켜주는 일만 한다. 따라서 생성 패턴이 아닌 행동 패턴을 적용하는게 적당해 보인다. 이에 사용자의 입력에 따라 결제의 행위를 적용시킬 수 있도록 전략패턴을 통해 구현했다. 리팩토링 개선된..
Nginx를 이용해 무중단 배포하기 들어가며 저번 시간에 Jenkins를 이용해 CI/CD 파이프라인을 구축하였다. 따라서 빌드와 배포의 자동화를 이루었다. 하지만 배포의 과정속에서 어플리케이션이 종료된다는 문제가 남아있다. 이를 해결하기 위해 무중단 배포 서비스를 적용시켰다. 무중단 배포 방식에는 docker를 이용하거나, AWS의 블루 그린 무중단 배포를 이용하는 등 Nginx 외의 수단을 사용하더라도 배포 할 수 있지만 가장 저렴한 방법으로 서비스를 제공할 수 있기에 Nginx를 이용했다. Nginx Nginx란 리버스 프록시, 로드 밸런서, http 캐시로 쓰일 수 있는 웹서버 이다. 요청에 응답하기 위해 이벤트 기반 구조를 채택했고, 덕분에 현재 웹서버 분야에서 1등을 차지하고 있다. 이 중 리버스 프록시를 이용해 무중단 배포를 ..
jenkins을 이용해 CI/CD 파이프라인 구축하기 들어가며 프로젝트의 기능을 구현한 후 aws-ec2를 이용해 인스턴스를 생성하여 배포를 진행하였다. 하지만 매번 변경 사항이 생길 때 마다 인스턴스에 접속해서 빌드하고 배포하는 과정을 수행한다는 일이 번거롭다는 생각이 들어 CI/CD에 대해서 학습했다. 도구 CI/CD를 구현하는 도구는 Jenkins를 사용했다. 해당 툴을 사용한 이유는 다음과 같다. 무료로 사용 가능하다 Jenkins는 전 세계적으로 많은 사용자와 개발자들이 사용하고 있기에 자료가 많다. 이러한 이유로 Travis가 아닌 Jenkins를 이용했다. 이 밖에도 Jenkins의 장점은 많이 있으므로 공식 문서를 읽어보거나 사용해 보기를 권장한다. 구현 1. 먼저 aws-ec2에 생성한 인스턴스에 접속하여 다음의 과정을 통해 Jenkins를..
프로젝트에 테스트 컨테이너 적용하기 계기 Spring Batch 테스트나 동시성 테스트를 할 때 Mock 객체가 아닌 db연동을 하여 테스트를 해야하는 상황이 발생했다. 할 수 있는 선택은 다음과 같았다. 1. 실제 DB와 연동 후 데이터 삭제 2. 인메모리 DB 사용 3. 테스트용 DB 사용 4. 테스트 컨테이너 사용 1번을 선택할 경우 운영 중인 데이터베이스의 데이터를 삭제하게 되면, 중요한 데이터가 사라지거나 시스템의 오작동을 초래할 수 있다. 2번을 선택할 경우 인메모리 DB를 사용하면 용량 한계가 있고, 테스트 과정에서 발생한 문제점을 실제 DB에서는 발견하지 못할 가능성이 있다. 이러한 단점들을 고려하여 3번의 선택지를 고려하던 중 테스트 컨테이너에 대해서 알게 되었다. 테스트 컨테이너에서 제공하는 api들로 테스트 시작시 적은..
인덱스 튜닝으로 성능 개선하기 인덱스 튜닝을 하게된 계기 상품 조회는 현재 시스템의 핵심 기능중 하나이다. 그렇기 때문에 빠른 성능을 제공하는 것은 필수적이라고 생각이 들어 인덱스 튜닝을 계획했다. 적용할 필드 정하기 인덱스를 적용하기에 앞서 어떤 컬럼에 적용할지 결정해보자. 컬럼은 다음과 같다 검색시 주로 상품 이름 + 내용의 like문을 사용하며 where절에 가격을 조건으로 하는 요청이 많이 들어올 것이라 생각이 들었고 다른 로우의 값과 많이 겹치지 않기 때문에 위의 필드 중에서 나는 price에 인덱스를 걸었다. 이제 인덱스 튜닝을 진행해 보자 인덱스 튜닝 전 실행계획 다음은 인덱스 튜닝을 하기 전 실행계획이다. 간단히 살펴보면 "items" 테이블을 사용하여 처리되었고, "ALL" 접근 방식을 사용하였으며, 인덱스를 사용하지..
낙관적 락을 이용한 성능 개선 with JMeter 문제상황 성능 테스트를 진행하던 도중 재고의 증가 감소 로직이 비관적 락으로 구현해도 되는지 고민을 하게 되었다. 동시에 여러 사용자가 같은 상품을 주문하거나 취소할 가능성은 굉장히 적다고 생각이 들어 이를 낙관적 락으로 교체하는게 낫다는 판단이 들었다. 성능은 개발에 있어서 정말 중요한 부분이다. 고메즈(Gomez)에 따르면, 사용자의 40%가 3초 동안 기다리게 되면 사이트를 이탈하는 것으로 나타났다. 월마트(Walmart)는 페이지 속도를 100ms까지 개선하면 수익이 1% 증가한다는 사실을 발견했다. Walmart pagespeed-slide Walmart proves the obvious, devknob wonders why people don't understand why page speed ..
스프링 배치 적용해보기 문제상황 프로젝트에서 멤버십 기능을 구현하는 중이었는데, 정기 결제를 어떻게 구현해야 할지 고민하게 되었다. 팀원들과 회의를 통해 매달 28일에 결제가 이루어지도록 하기로 결정하고, 첫 결제 시점에서 28일과의 차이만큼 결제를 진행하여 어뷰징을 방지하기로 했다. 또한 구독 취소도 매달 28일까지 진행할 수 있도록 설정했다. 이에 따라 모든 구독자에 대한 28일 결제 및 구독 정보 생성 작업이 필요했는데, 이를 배치 작업으로 처리하도록 구현하였다. Spring batch Spring Batch는 Spring 프레임워크 기반에서 대용량 데이터 처리를 위한 오픈 소스 배치 처리 프레임워크이다. Spring Batch를 사용하면 대용량 데이터 처리를 안정적으로 처리할 수 있다. 대용량 데이터 처리를 위해서는 다..
RestTemplate -> WebClient 로 리팩토링 문제상황 RestTemplate을 이용하여 카카오 페이 API와 통신하여 결제를 구현하였다. 하지만 RestTemplate이 곧 deprecated 된다는 소식과 WebClient 비동기 및 리액티브 방식을 제공해 성능적으로 뛰어나다는 사실을 알고 이를 사용하게 되었다. 간단하게 각각의 특징을 살펴보자 RestTemplate 특징 통신을 단순화하고 RESTful 원칙을 지킨다 멀티쓰레드 방식을 사용 Blocking 방식을 사용 WebClient 특징 싱글 스레드 방식을 사용 Non-Blocking 방식을 사용 JSON, XML을 쉽게 응답받는다. 리액티브 프로그래밍 유연한 API 다음은 내가 적용했던 restTemplate을 사용하는 예시이다. public HttpEntity requestKaKaoToS..