프로젝트 구성

멀티 모듈 설정
1. 루트 프로젝트 src 폴더 삭제
2. 3개 모듈 생성
- coupon-api
- coupon-consumer
- coupon-core
루트 프로젝트 setting.gradle.kts
rootProject.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.ComponentScan;
@ComponentScan
@EnableAutoConfiguration
public class CouponCoreConfiguration {
}
- @ComponentScan
- 이 애노테이션은 스프링 프레임워크에 의해 컴포넌트 클래스를 검색하는 데 사용
- 지정된 패키지와 하위 패키지에서 스프링 빈으로 등록할 클래스들을 찾는다.
- 만약 패키지를 지정하지 않으면, 이 클래스가 속한 패키지와 하위 패키지를 검색한다.
- @EnableAutoConfiguration
- 스프링 부트 애플리케이션의 자동 구성을 활성화
CouponApiApplication
더보기
CouponApiApplication이라는 클래스는 스프링 부트 애플리케이션의 진입점(entry point)
package me.progfrog.couponapi;
import me.progfrog.couponcore.CouponCoreConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
@Import(CouponCoreConfiguration.class)
@SpringBootApplication
public class CouponApiApplication {
public static void main(String[] args) {
System.setProperty("spring.config.name", "application-core, application-api");
SpringApplication.run(CouponApiApplication.class, args);
}
}
- @Import(CouponCoreConfiguration.class)
- CouponCoreConfiguration을 현재 스프링 애플리케이션의 설정에 추가
- 이를 통해 CouponCoreConfiguration에서 정의한 빈들이 현재 애플리케이션 컨텍스트에 포함됨
- @SpringBootApplication
- 스프링 부트 애플리케이션임을 나타내는 애노테이션
- @EableAutoConfiguration, @ComponentScan을 포함하는 복합 애노테이션
- System.setProperty("spring.config.name", "application-core, application-api");
- 스프링 부트가 애플리케이션 구성 파일을 읽어들이는 데 사용할 이름을 설정
- 기본적으로 스프링 부트는 application.properties나 application.yml 파일을 읽지만, 이 설정을 통해 application-core와 application-consumer 이름을 가진 구성 파일을 추가로 읽어들이게 된다.
- SpringApplication.run(CouponApiApplication.class, args);
- 스프링 부트 애플리케이션을 실행
- 이 메서드는 내부적으로 애플리케이션 컨텍스트를 생성하고 초기화한다.
CouponConsumerApplication
더보기
package me.progfrog.counponconsumer;
import me.progfrog.couponcore.CouponCoreConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
@Import(CouponCoreConfiguration.class)
@SpringBootApplication
public class CouponConsumerApplication {
public static void main(String[] args) {
System.setProperty("spring.config.name", "application-core, application-consumer");
SpringApplication.run(CouponConsumerApplication.class, args);
}
}
3. build.gradle.kts & application.yml
루트 프로젝트
더보기
val bootJar: org.springframework.boot.gradle.tasks.bundling.BootJar by tasks
bootJar.enabled = false
plugins {
java
id("org.springframework.boot") version "3.1.5"
id("io.spring.dependency-management") version "1.1.3"
}
group = "me.progfrog"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
repositories {
mavenCentral()
}
subprojects {
apply(plugin = "java")
apply(plugin = "io.spring.dependency-management")
apply(plugin = "org.springframework.boot")
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-redis")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
runtimeOnly("com.h2database:h2")
runtimeOnly("com.mysql:mysql-connector-j")
implementation("org.springframework.boot:spring-boot-starter")
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus")
annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
coupon-api 모듈
더보기
build.gradle.kts
dependencies {
implementation(project(":coupon-core"))
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<Test> {
useJUnitPlatform()
}
application-api.yml
spring:
application:
name: coupon-api
server:
port: 8080
coupon-consumer 모듈
더보기
build.gradle.kts
dependencies {
implementation(project(":coupon-core"))
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<Test> {
useJUnitPlatform()
}
application-consumer.yml
spring:
application:
name: coupon-consumer
server:
port: 8081
coupon-core 모듈
더보기
build.gradle.kts
val bootJar: org.springframework.boot.gradle.tasks.bundling.BootJar by tasks
bootJar.enabled = false
repositories {
mavenCentral()
}
dependencies {
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
implementation("com.fasterxml.jackson.core:jackson-databind")
implementation("org.redisson:redisson-spring-boot-starter:3.16.4")
implementation("org.springframework.boot:spring-boot-starter")
implementation("com.github.ben-manes.caffeine:caffeine")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<Test> {
useJUnitPlatform()
}
application-core.yml
spring:
config:
activate:
on-profile: local
datasource:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/coupon?useUnicode=yes&characterEncoding=UTF-8&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
maximum-pool-size: 10
max-lifetime: 30000
connection-timeout: 3000
username: coupon
password: 1234
jpa:
hibernate:
ddl-auto: none
show-sql: true
properties:
hibernate:
format_sql: true
data:
redis:
host: localhost
port: 6380
MySQL, Redis 설정
docker-compose.yml
더보기
version: '3.7'
services:
redis:
container_name: coupon-redis
image: redis:7.2-alpine
command: redis-server --port 6380
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6380:6380
mysql:
container_name: coupon-mysql
image: ubuntu/mysql:edge
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --explicit_defaults_for_timestamp=1
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=coupon
- MYSQL_USER=coupon
- MYSQL_PASSWORD=1234
- MYSQL_ROOT_PASSWORD=1234
- TZ=UTC
volumes:
- ./mysql/init:/docker-entrypoint-initdb.d
docker-compose up -d

부하 테스트툴 설정
[스프링] 부하 테스트 툴 locust 사용해보기
locust사용하기 편하고, 스크립트로 작성이 가능하고, 확장 가능한 성능 테스트 툴테스트 시나리오를 파이션 스크립트로 작성가능분산 환경에서 확장 가능부하 테스트란 요청을 만들어서 계속해
progfrog.tistory.com
반응형