외부활동 33

스프링 부트 CI/CD 배포 서버 인프라 구축[EC2, RDS, Route 53, S3, ELB(https)]

개발이 들어가기 앞서 배포 인프라를 구축할 것이다.이후에도 비슷한 인프라 세팅할 일이 많을 것으로 예상되어 집대성해서 한번에 정리하려고 한다.   FCM, 지도 api들을 사용할 예정이기에 https까지 붙인 환경을 한번에 구성할 예정이다.이전의  AWS의 프리티어 계정을 활용하며 학습용도의 인프라 구성이 아닌 실사용자를 가진 서버 인프라를 구성하므로 약간의 스펙업으로 인해 과금이 발생할것으로 예상된다. 또한 현재 구축하는 인프라는 정말 서비스 초기의 인프라이므로 이후 사용자가 증가함에 따라 인프라 구조를 변경할 예정이다.   1. 스프링 부트 프로젝트 생성2. EC2 에 배포하기3. Route 53으로 도메인 연결하기 4. ELB로 https 설정하기5. RDS 연결하기6. 파일 업로드를 위한 S3 세..

주문 재고 요청시 동시성 제어 [REDIS 분산락(Distribution Lock)]

https://softmoca.tistory.com/345 주문 재고 요청시 동시성 제어테스트 [트랜잭션/격리수준/LOCK/REDIS]https://softmoca.tistory.com/346현재 포스팅은 위 포스팅으로 이어 진다. 동시성 제어가 필요한 이유현재 kwangsang에서는 마감 시간이 가까워 졌을 때 떨이로 상품을 내놓는 점주 분들과 마감 할인 상품softmoca.tistory.com해당 포스팅은 위 포스팅과 이어 진다. 최종 동시성 제어 성능 비교 정리 [100명 동시 요청 기준]동시성 제어시 고려해야할 사항 4가지 중요 우선 순위  - 우선 순위중 하나라도 만족을 못하면 이후 순위들은 무의미해진다.(EX : 아무리 시간이 준수하고, 사용자 요청 순서가 보장되어도 데이터 무결성이 지켜 지지..

주문 재고 요청시 동시성 제어테스트 [트랜잭션/격리수준/LOCK/REDIS]

https://softmoca.tistory.com/346현재 포스팅은 위 포스팅으로 이어 진다.동시성 제어가 필요한 이유현재 kwangsang에서는 마감 시간이 가까워 졌을 때 떨이로 상품을 내놓는 점주 분들과 마감 할인 상품에 대한 정보를 필요로 하는 고객들을 위한 유통 서비스 플랫폼을 제작 중이다. 그리고 당시에는 @@대학교와 협약을 맺어 해당 서비스 플랫폼을 운영하기로  했었고 나는  1000명 이상의 동시 사용자들의 주문 요청에 대한 동시성을 제어하는 API를 개발 하는 역할을 되었다. 해당 서비스에서 동시성 제어를 필요로 하는 부분에 대해 간단히 알아보자.처음 푸쉬 알림을 통해 고객들에게 마감 할인 상품에 대한 정보가 주어지면 특정 시간에 많은 사용자의 트래픽이 몰리게 된다.그리고 해당 화면과..

JMeter 부하 테스트

부하테스트에는 여러가지 툴들이 있다.그중 유명한 JMeter와 nGrinder가 있지만 비교적 자료 소스가 많고 설치 법과 사용법이 간단해서 JMeter를 고르게 되었다.맥 OS인 나는 늘 그렇듯 brew로 설치를 하였다.윈도우를 사용하다가 맥 OS로 갈아타니 자질구레한 설정까지 신경을 안써도 되서 너무 좋을 것 같다. brew짱우선 대부분의 부하테스트 툴을 사용하기 위해서는 JAVA를 먼저 설치를 해야한다.하지만 brew를 사용하여 설치하면 이미 내부에서 java를 먼저 설치하고 이후 jmeter를 설치한다   JMeter란 ?Apache에서 만든 자바로 만들어진 웹 어플리케이션 성능 테스트 오픈 소스이다. - 웹 - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)- SO..

포트원 결제 연동 플로우 정리 [노마드코더]

포트원(통합 결제 솔류션)을 통해서  전체 결제 흐름이 어떻게 이루어 지는지 살펴 보자. 1. 사전 준비 우선 계정을 만들고 관리자 패널에 로그인을 해보자결제 연동 클릭 결제대행사로 카카오페이 선택   나주에 사용할 API키 및 API 비밀번호를 확인할 수 있다.복사해서 따로 저장해두자.   2. 프론트 엔드우선 위와 같은 포트원 SDK를 추가한다.포트원 SKD를 설치하면 IMP라는 전역 변수가 생성된다. 이 변수를 통해 포트원과 상호 작용 할 수 있다.  이전에 발급 받은 가맹점 식별코드를 사용해서 초기화 한다.  그 후 버튼에 이벤트 리스너를 추가한다.   onClickPay 내부에는 IMP 변수 안에 있는  request_pay 함수를 호출한다.이 함수는 결제 요청에 대한 모든 옵션이 포함된 구성 ..

AWS와 Slack 간단 연동하고 에러로그 알람 받기 [Cloudwatch, chatbot,Simple Notification Service ]

AWS와 Slack을 연동하여 AWS에서 Slack으로 알람을 보내보자 ! 현재 배포된 서버에 대한 로그가 AWS의 cloudwatch에 쌓이고 있다. 이때 해당 서버에 에러가 발생한경우 Slack으로 알람을 보내어 팀원 전부에게 알려보고자 한다 ! 간단 순서 요약 1.Cloudwatch 로그 그룹의 로그 스트림 중 특정 문자열 포함시 '지표 필터 생성' 2. Slack 채널 생성 3. 경보 알림 'SNS(Simple Notification Service)' 주제 생성 4.해당 지표 필터를 트리거로 '경보(알람)' 생성 5. 'AWS Chatbot'에서 'Slack'으로 클라이언트 생성 해당 과정을 간단히 말하자면 AWS의 Cloudwatch에 생성되는 로그 중 (설정자가 원하는)특정 문자열, 예를 들면..

Redis와 분산 락(Distributed Lock)

레디스(Remote Dictionary Server) 메모리에 저장하는 key-value기반의 NoSQL DBMS - 캐싱 뿐 아니라 임시작업큐, 실시간 채팅,메시지 브로커 - 메모리에 저장되어 빠른 속도로 접근가능, get/post 경우 10만 TPS이상 가능 - 싱글 스레드로 한번에 하나의 명령만 처리, race condition(두개 이상의 프로세스가 동시에 하나의 리소스에 대해 접근할 때 서로 경쟁)이 거의 발생하지 않는다 - 다양한 자료구조 제공, 개발의 편의성 증가 - 메모리에 저장된 데이터를 디스크에 영속화Persistence( RDB,AOF 두가지 옵션 존재) → 서버에 치명적인 문제가 발생하더라도 복구 가능 RDB: 특정한 간격으로 현재 레디스의 메모리에 존재하는 데이터의 스냅샷을 남기는..

캐시란 ?

캐시의 사용 이유 캐시 : 데이터나 값을 미리 복사해 놓는 임시 장소 보통 기본적으로 3Tier 아키텍처 구조를 많이 사용한다. 작은 서비스라면 문제가 없지만 사용자가 많아지고 서비스가 커진다면 클라이언트가 많아지고 요청이 많아저서 DB에 대한 부하도 증가 하게 된다. 그러한 DB의 부하를 줄이기 위해 캐시를 도입한다. 약 80%의 결과가 20%의 원인으로 부터 온다는 법칙 이런 법칙을 캐시에도 적용을 시켜 이해해 보면 직관적으로 빠른 이해를 할 수 있다. 캐시에 자주 사용되는 약 20%의 데이터를 미리 캐싱해 둔다면 효과적인 성능 향상을 기대할 수 있다. 공간적 지역성과 시간적 지역성 공간적 지역성 :참조된 주소와 인접한 주소의 내용이 다시 참조되는 특성 시간적 지역성 : 사용 되었던 데이터가 빠른 시..

4회차 회원가입, 로그인 기능 추가

학습 목표 JWT에 대한 이해 JWT를 활용한 인증, 인가 구현 로그인, 회원가입 로직 이해 1. 회원가입 기능 회원가입 시 이메일, 패스워드를 받아서, DB에 이메일, 패스워드, 회원 가입 시간을 저장해야 한다. 유저에 대한 정보가 저장될 때, id(PK, primary key)도 같이 Auto-increment 형식으로 저장돼야 한다. 이메일에 반드시 @가 1개만 포함되어 있어야 한다. 이메일에 공백이 포함될 수 없다. 중복된 이메일이 존재할 수 없다. 패스워드에 공백이 포함될 수 없다. 패스워드는 8자 이상 15자 이하여야 한다. (비밀번호는 암호화하지 않고 그대로 저장한다. 암호화하는 건 뒤에서 구현하게 된다.) 2. 로그인 기능 로그인 시 이메일, 패스워드 값을 받는다. 로그인에 성공했을 때, ..

3회차 API 서버 배포[ CORS세팅,에러처리]

학습 목표 환경 변수 분리 CORS 셋팅 예상치 못한 에러에 대한 처리 AWS의 Elastic Beanstalk를 활용한 서비스 배포 ✅ 요구 사항 환경 변수를 분리해라. 로컬 환경, 배포 환경 2가지로 환경 변수를 분리해라. Node.js에서는 .env를 활용해라. Spring Boot에서는 application.yml(또는 application.properties)를 활용해라. CORS를 설정해라. 예상치 못한 에러에 대해, 상태 코드 500과 에러 메시지로 응답하는 전역 예외 처리 설정을 해줘라. Express.js : https://expressjs.com/ko/guide/error-handling.html Nest.js : https://docs.nestjs.com/exception-filter..