프로젝트명스프링 부트를 활용한 마이크로서비스 개발 개발 환경Java 11, Java 17, Spring Boot 2, Spring Boot 3, JPA, JPQLMySQL, H2유레카, 리본, 주울, 하이스트릭스, 큐컴버Gradle, Docker 이번 프로젝트에서 다루는 내용스프링 부트를 이용한 뼈대 만들기잘 알려진 3계층 구조 패턴*에 따라 애플리케이션을 설계하고 구현하는 방법 알아보기 * 3계층 구조 패턴사용자 인터페이스를 다루는 프레젠테이션 계층, 비즈니스 로직을 다루는 애플리케이션 계층, 데이터를 다루는 데이터 계층으로 나눠진 구조로 각 역할별로 계층을 분리함으로써 각 계층의 영향을 최소화하고 웹 디자이너, 개발자, DB 관리자가 분업하기에 유리하다. 테스트 주도 개발사전 요구사항을 구현하기 위..
API 개발설명HTTP 메서드와 URL쿠폰 발급하기POST /api/v1/issue" data-og-description="선착순 쿠폰 발급 시스템 . Contribute to happyprogfrog/coupon-sample development by creating an account on GitHub." data-og-host="github.com" data-og-source-url="https://github.com/happyprogfrog/coupon-sample/commits/feature/api" data-og-url="https://github.com/happyprogfrog/coupon-sample" data-og-image="https://scrap.kakaocdn.net/dn/cjyA..
비관적 락(Pessimistic Lock)비관적 락은 동시에 여러 트랜잭션이 같은 데이터를 수정할 때 발생할 수 있는 충돌을 방지하기 위해서 사용된다. 동시성 제어가 중요한 시나리오에서 데이터 무결성을 유지하는데 유용하다. 비관적 락은 두 가지 유형이 있다.PESSIMISTIC_READ: 다른 트랜잭션이 데이터를 읽을 수는 있지만, 수정할 수는 없다.PESSIMISTIC_WRITE: 다른 트랜잭션이 데이터를 읽거나 수정할 수 없다. @Lock(LockModeType.PESSIMISTIC_WRITE)비관적 쓰기 락을 사용하면 트랜잭션이 특정 엔티티를 수정하기 전에 해당 엔티티를 잠근다. 이를 통해 다른 트랜잭션이 해당 엔티티를 읽거나 수정하지 못하도록 한다. @Lock(LockModeType.PESSIMI..
DB 테이블 설계coupons 테이블Column NameData TypeConstraintsCommentsidBIGINT(20)PK, NOT NULL, AUTO_INCREMENT titleVARCHAR(255)NOT NULL쿠폰명coupon_typeVARCHAR(255)NOT NULL쿠폰 타입 (선착순 쿠폰, ..)total_quantityINTNULL쿠폰 발급 최대 수량issued_quantityINTNOT NULL발급된 쿠폰 수량discount_amountINTNOT NULL할인 금액min_available_amountINTNOT NULL최소 사용 금액date_issue_startdatetime(6)NOT NULL발급 시작 일시date_issue_enddatetime(6)NOT NULL발급 종료 일시..
QueryDSL자바를 위한 동적 쿼리 작성을 위한 오픈 소스 라이브러리QueryDSL은 정적 타입 검사 및 코드 자동 완성을 제공하여, 쿼리 작성 시 발생할 수 있는 오류를 사전에 방지하고, 쿼리 작성을 더 편리하게 만들어준다. 의존성 추가implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")annotationProcessor("jakarta.annotation:jakarta.annotation-api")annotationProcessor("jakarta.persistence:jakarta.persistence-api")implementation(..
프로젝트 구성 멀티 모듈 설정1. 루트 프로젝트 src 폴더 삭제2. 3개 모듈 생성coupon-api coupon-consumercoupon-core 루트 프로젝트 setting.gradle.ktsrootProject.name = "coupon-sample"include("coupon-api")include("coupon-consumer")include("coupon-core")CouponCoreConfiguration더보기package me.progfrog.couponcore;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.ComponentSc..
locust사용하기 편하고, 스크립트로 작성이 가능하고, 확장 가능한 성능 테스트 툴테스트 시나리오를 파이션 스크립트로 작성가능분산 환경에서 확장 가능부하 테스트란 요청을 만들어서 계속해서 보내면서 부하를 줘보는 것!단일 서버에서 요청을 만들어서 보내는 건 어느 정도 한계가 있다(결국 요청을 보내는 것도 리소스가 드는 작업이므로 굉장히 많은 양의 부하를 만들 수는 없음).따라서, 부하를 발생시키는 서버를 여러 대로 늘린 다음에 각 서버에서 부하를 발생시켜 테스트를 진행할 수 있다.즉, 더 많은 부하에 대해 테스트를 진행할 수 있다.web-based UI테스트 결과와 진행 상황을 차트나 표와 같은 보기 편한 형태로 볼 수 있다,. 사용예제https://docs.locust.io/en/stable/quick..
스프링 부트는 기본적으로 application.properties나 application.yml 파일을 기본 구성 파일로 설정한다. 하지만 멀티 모듈을 셋팅하다보면 구성 파일의 이름이 다양해질 때가 있는데, 이때는 다음과 같이 코드를 추가하면 된다.import me.progfrog.couponcore.CouponCoreConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Import;@Import(CouponCoreConfiguration.cl..
테스트 코드를 작성할 때, given/when/then 주석을 많이 사용한다. 매번 작성하는 일이 귀찮아져서, 다들 많이 사용한다는 LiveTemplate 기능을 사용해 보기로 했다! 생각보다 설정이 어렵지 않았다 :) 1. IntelliJ IDEA의 Settings에 진입 2. Live 라고 검색하면 하단에 Live Templates가 나온다! + 를 눌러 추가해 보자. 3. Template text를 작성해 준다. test 메서드 전체랑 give/when/then 주석만 있는 두 가지 템플릿을 작성해 보았다. 4. 하단의 Define를 눌러, Java를 선택해 준다. 5. 동작 확인! 잘 되는구먼~~~ 6. 킹왕짱 편하다!