배포와 공유
프로젝트 하나에서는 규칙 모듈을 elasticore project(':ps-rules') 로 연결했습니다. 팀의 여러 프로젝트가 같은 규칙을 쓰려면
규칙 모듈을 jar 로 배포하고 좌표로 받습니다. elasticore 는 평범한 Gradle 구성이라 프로젝트 의존과 같은 방식입니다.
1. 규칙 모듈을 배포하기
plugins {
id 'java-library'
id 'maven-publish'
}
group = 'com.example'
version = '1.0.0'
// ... dependencies 는 그대로 (compileOnly elasticore-base)
publishing {
publications {
rules(MavenPublication) {
from components.java
}
}
// 회사 저장소 (Nexus, Artifactory, GitHub Packages ...)
repositories {
maven {
url = 'https://nexus.example.com/repository/maven-releases/'
credentials {
username = findProperty('nexusUser') // ~/.gradle/gradle.properties - 저장소에 두지 않음
password = findProperty('nexusPassword')
}
}
}
}
./gradlew :ps-rules:publish # 회사 저장소로
./gradlew :ps-rules:publishToMavenLocal # 내 PC 의 ~/.m2 로 (시험용)
스켈레톤(src/main/resources/elasticore-template/…)은 jar 안에 함께 들어갑니다.
2. 다른 프로젝트에서 쓰기
repositories {
maven { url = 'https://nexus.example.com/repository/maven-public/' } // 룰셋이 있는 저장소
mavenCentral()
}
elasticore {
architecture = 'hexagonal'
language = 'java'
rules = ['com.example.rules.PetstoreRules']
}
dependencies {
elasticore 'com.example:ps-rules:1.0.0' // 생성기 클래스패스 - 애플리케이션에는 안 들어감
implementation 'org.jmolecules:jmolecules-ddd:1.10.0'
}
elasticore 구성은 프로젝트의 repositories 에서 찾습니다. 펫스토어 사본에서 publishToMavenLocal 한 jar 를 이렇게
받았을 때 -PlistRules 와 생성 결과가 모듈로 연결했을 때와 같았습니다(PetstoreEventTopics 생성 포함).
mavenLocal() 을 저장소에 적지 않으면 이렇게 실패합니다:
> Could not resolve all files for configuration ':elasticore'.
> Could not find com.example:ps-rules:1.0.0.
mavenLocal() 은 시험할 때만, 그리고 그 그룹만 보게 하세요:
repositories {
mavenLocal { content { includeGroup 'com.example' } }
mavenCentral()
}
버전 맞추기
| 무엇 | 규칙 |
|---|---|
규칙 모듈의 elasticore-base (compileOnly) | 쓰는 프로젝트들의 플러그인 버전과 같게 |
| 룰셋 jar 버전 | 규칙을 바꿀 때마다 올리기. 같은 버전을 다시 배포하면 프로젝트들이 캐시를 계속 씀 (--refresh-dependencies) |
| ElastiCORE 를 올릴 때 | 룰셋을 새 버전으로 다시 빌드·테스트하고 새 버전으로 배포 - 규칙 테스트가 이때 값을 합니다 |
규칙 모듈을 ElastiCORE 의 이전 버전으로 컴파일하고 새 생성기에서 돌리면, 바뀐 API 에서 생성 중 NoSuchMethodError 가 날 수
있습니다. ElastiCORE 를 올리는 PR 에 룰셋 버전도 함께 올리세요.
일부 도메인에만
빌드의 rules = [...] 는 모든 도메인에 적용됩니다. 한 도메인에만 쓰려면 그 도메인의 env.yml 에 적습니다 - 이때는
번들을 대체하므로 번들 이름도 적습니다:
elasticore:
config:
publisher:
rules: [hexagonal-springboot, ossie-export, com.example.rules.PetstoreRules]
펫스토어 사본에서 빌드의 rules 를 지우고 이렇게 적었을 때 -PlistRules 첫 줄은
[rules] petstore: hexagonal-springboot + ossie-export + com.example.rules.PetstoreRules 였고 생성 결과도 같았습니다.
elasticore '…' 의존(룰셋 jar)은 여전히 빌드에 있어야 합니다 - 생성기가 클래스를 찾는 곳이기 때문입니다.
팀에 공유할 것
- 룰셋 README: 규칙 id 목록, 각 규칙이 읽는 DSL 단어,
env.yml설정 키, 애플리케이션에 필요한 의존(jmolecules-ddd등) - 규칙을 더하거나 바꿨을 때 이미 있는 개발자 파일(나뉜 루트의 클래스, 컨트롤러)에 직접 해야 하는 일 - 생성기가 알려 주는 것은 나뉜 루트 클래스의 클래스 어노테이션뿐입니다
-PlistRules출력 - 리뷰어가 "어느 파일에 무엇이 붙나" 를 한 번에 봅니다