728x90

2024/11 20

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결. MySql lock

MySql 에서는 레코드에 락을 걸 수 있다. 이것을 X락, Exclusize Lock, 쓰기락 이라고 한다. 트랜잭션이 끝날 때 까지 읽기, 또는 쓰기를 실행 할 수 없다. X락은 중첩해서 걸 수 없다. 앞 트랜잭션이 끝날 때 까지 대기해야한다.트랜잭션이 커밋 되는 순간 락이 해제된다.  public interface CouponJpaRepository extends JpaRepository { @Lock(LockModeType.PESSIMISTIC_READ) @Query("SELECT c FROM Coupon c WHERE c.id = :id") Optional findCouponWithLock(Long id);} JpaRepository 에 락을 적용시켜준다.public class..

JAVA/프로젝트 2024.11.30

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결 redis lock, 분산락

지난 시간https://wonder-why.tistory.com/207synchronized 를 통해 동시성 문제를 해결, 쿠폰 발급 수량이 정확히 맞춰졌지만, 이 synchonized 는 자바 애플리케이션에 종속되기 때문에, 여러 서버로 확장이 된다면 락을 제대로 관리 할 수 없어진다.  이를 해결하기 위해 분산락 구현이 필요하다.  1. 설정 build.gradle에 추가한다.implementation("org.redisson:redisson-spring-boot-starter:3.16.4") RedisConfiguration 을 정의한다.package com.example.couponcore.configuration;import org.redisson.Redisson;import org.rediss..

카테고리 없음 2024.11.30

쿠폰 선착순 발급 이벤트 - 동시성 이슈 해결 synchronized

문제점: 쿠폰 발급 수량이 정확히 제어되지 않았음. 의도한 것보다 많은 수량이 발급됨원인: 동시성 문제해결 방법: 쿠폰 발급 과정에 Lock을 걸어 해결. 어떤 락을 사용할 것인가? 1.synchronized ()궁극적인 해결 방법은 되지 못한다.하지만 단일 애플리케이션을 사용하고 있기 때문에.하지만 동기화를 걸어줬을때, 쿠폰 발급이 잘 제어되는지 확인 목적차 사용.   public class CouponIssueService { private final CouponJpaRepository couponJpaRepository; private final CouponIssueJpaRepository couponIssueJpaRepository; private final CouponIssueR..

JAVA/프로젝트 2024.11.30

쿠폰 선착순 발급 이벤트 - locust 설정, docker-compose.yml 작성

최상단 프로젝트에 load-test 패키지를 만든다. 여기서 테스트 스크립트를 관리할 것.docker.compose 파일 또한 작성해준다.version: '3.7'services: master: image: locustio/locust #locust image 사용 ports: - "8089:8089" volumes: - ./:/mnt/locust command: -f /mnt/locust/locustfile-hello.py --master -H http://host.docker.internal:8080 # 테스트 할 .py 파일 지정. local8080 (= coupon-api) 에서 실행. worker: image: locustio/locust v..

JAVA/프로젝트 2024.11.28

쿠폰 선착순 발급 이벤트 - 기획, ERD,프로젝트 세팅

ERD 개요한정 수량의 쿠폰을 먼저 신청한 사용자에게 제공하는 이벤트Mysql 기반 쿠폰 발급 기능을 개발한다.Redis 기반 구판 발급 기능을 개발한다.AWS에 서버를 배포하고 Locust 를 통해 부하테스트를 진행 한다. 요구사항이벤트 기간내에 발급유저당 1번의 쿠폰 발급선착순 쿠폰의 최대 쿠폰 발급 수량 설정 기능쿠폰 발급 기능쿠폰 발급 기간 검증쿠폰 발급 수량 검증쿠폰 전체 발급 수량중복 발급 요청 검증쿠폰 발급쿠폰 발급 수량 증가쿠폰 발급 기록 저장쿠폰 ID유저 ID목표정확한 발급 수량 제어 (동시성 이슈 처리)높은 처리량멀티 모듈 사용gradle - kotlin 경험. 깃 컨벤션 build: 빌드, 의존성 추가feat: 새로운 기능 추가fix: 에러 수정docs: 문서 수정style: 코드 포..

JAVA/프로젝트 2024.11.27

대규모 트래픽을 고려한 프로젝트 Board Server 회고

1. 프로젝트 개요프로젝트명: 대규모 트래픽을 고려한 프로젝트 Board Server기간: 2024.11.17 ~ 2024.11.27목표대규모 트래픽을 고려해 부하를 줄이는 방향으로 개발한다.MyBatis 활용 능력을 향상 시킨다.팀원: 본인 기술 스택IntelliJJava 17Spring Boot 3MyBatosMySqlRedisAWSJenkins Locust2. 프로젝트 진행 과정주요 기능 개발:회원회원가입비밀번호 암호화로그인로그아웃게시판CRUD검색댓글, 대댓글CRUD태그 CRUD검색알림 기능AWS SNS/ publish, subscribe에러시 슬랙 알림 기능기술적 도전:주로 사용하던 JPA 대신 MyBatis 를 사용해 프로젝트를 진행했다.CICD 를 처음 해보았다.Jenkins, Putty, A..

회고록 2024.11.27

배포 자동화 - jenkins를 통해 만든 .jar 파일 운영 환경 서버에 배포하기

SSH?Secure Shell네트워크 상 다른 pc에 로그인하거나 원격 시스템에 명령어를 실행해서 다른 시스템으로 파일을 복사할 수 있도록 하는 응용프로그램 또는 프로토콜을 말한다. 데이터를 암호화해 전송 중간에 패킷을 가로채더라도 내용을 읽을 수 없다.포트 포워딩(일종의 터널)을 제공해 네트워크상에서 안전한 데이터 전송이 가능하다.서버와 클라이언트간 통신을 안전하게 하기 위해  로컬 포트와 원격 포트를 매핑한다. 기밀성과 무결성을 보장한다. 클라이언트/서버 형태로 클라이언트에 접속, 원격 명령어를 통해 파일을 전송할 수 있다.  CI 후 자동적으로  SSH 프로토콜을 통해 Ec2원격  저장소에 jar파일을 올려 실행 시키는 CD 과정 AWS - EC2 - 인스턴스 시작 이름 설정 -  applicati..

JAVA/프로젝트 2024.11.26

배포 자동화 - jenkins, ngrok, Webhooks

Jenkins build CI 자동화 https://www.jenkins.io/download/ Download and deployJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their softwarewww.jenkins.io젠킨스 설치. 디폴트로 설정 후 next. 포트 번호는 마음대로 정해면 된다. 나는 7070다른 글 보면 Unlock Jenkins 라는 창이 뜨는데 나는 안떠서 직접 localhost:7070 접속해주었다. install suggested plugins - > create Frist Admin User 생성 후l..

JAVA/프로젝트 2024.11.26

배포 자동화 - 이론. CICD, Gradle, Jenkins

배포란개발된 어플리케이션을 실제 서버나 클라우드 환경과 같은 운영 환경에 설치하고 실행하는 과정이다.빌드환경 설정데이터베이스 마이그레이션서버 실행로깅 및 모니터링 설정보안 강화성능 최적화모니터링 및 로깅스케일 아웃백업 및 복구 계획CICD 파이프라인 설정 CICD: 지속적 통합 Continuous Intergration, 지속적 배포Continuous Deployment 소프트웨어 개발 및 배포 프로세스를 자동화하고 지속적으로 품질을 유지하며 빠르게 새로운 기능을 배포하는 방법을 나타낸다.  CI 프로세스코드 작성자동 빌드자동 테스트자동화된 통합CD 프로세스CI를 통한 자동화자동 배포 준비수동 승인환경 구성 관리롤백 기능자동 배포CICD 의 이점빠른 피드백자동화된 빌드 및 테스트안정적인 배포품질 향상높은..

JAVA/프로젝트 2024.11.25
728x90
반응형