ElastiCORE Port DSL Overview
Overview
ElastiCORE Port는 Domain-Driven Design(DDD)의 Port and Adapter 패턴을 기반으로 설계된 외부 시스템 통신 아키텍처입니다. 개발자는 YAML 기반 DSL만 작성하면 HTTP 통신, DBMS 질의 등 다양한 외부 통신 로직을 선언적으로 정의할 수 있으며, ElastiCORE 프레임워크가 런타임에 구현체를 동적으로 생성하고 주입합니다.
Port DSL은 별도의 구현 클래스 없이 인터페이스만으로 외부 시스템과의 통신을 처리할 수 있는 강력한 기능을 제공합니다.
Port Types
1. HTTP Port
- 외부 HTTP API 서버와의 RESTful 통신
- JSON, Multipart 데이터 처리
- 인증 토큰 및 헤더 관리
- 👉 HTTP Port 상세
2. DBMS Port
- 복잡한 SQL 질의 처리를 위한 데이터베이스 연동
- Native SQL, JPQL 지원
- 동적 쿼리, 페이징, 정렬 기능
- 👉 DBMS Port 상세
3. gRPC Port (Proto)
- Protocol Buffer 기반 gRPC 서비스 통신
- 서버/클라이언트 양방향 지원
- 👉 gRPC Port 상세
Environment Configuration
build.gradle 설정
dependencies {
implementation 'io.elasticore:elasticore-base:1.6.11'
implementation 'io.elasticore.springboot3:elasticore-springboot3:1.6.11'
// HTTP 통신용
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// 데이터베이스 연동용
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java' // 또는 해당 DB 드라이버
}
Application 클래스
import io.elasticore.springboot3.EnableElastiCore;
@EnableElastiCore
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
env.yml 설정
env:
config:
domainName: demo
framework: springboot
mode: jpa
j2ee: jakarta
namespace:
entity: com.example.domain.entity
dto: com.example.domain.dto
repository: com.example.domain.repository
service: com.example.domain.service
control: com.example.domain.control
port: com.example.domain.port # Port 네임스페이스 필수
Code Generation
# ElastiCORE 코드 생성
./gradlew elcore
Dependency Injection and Usage in Spring
@Service
public class UserService {
@Autowired
private UserApiAdapter userApiAdapter;
@Autowired
private UserDbPortService userDbPortService;
@Autowired
private CarInfoPortService carInfoPortService;
public void processUser() {
// HTTP API 호출
UserRequest request = new UserRequest();
request.setName("홍길동");
request.setEmail("hong@example.com");
UserResponse response = userApiAdapter.createUser(request);
// DBMS 조회
UserSearchInput searchInput = new UserSearchInput();
searchInput.setName("홍길동");
searchInput.setMinAge(20);
List<UserDTO> users = userDbPortService.findUsersByName(searchInput);
// gRPC 호출
CarInfo2Input carInput = new CarInfo2Input();
carInput.setBrand("현대");
CarInfo2Output carInfo = carInfoPortService.findByBrand(carInput);
}
}
Naming Conventions
- HTTP Port:
ServiceNameAdapter또는ServiceNameApiPort - DBMS Port:
DomainDbPortService또는DomainDataPort - gRPC Port:
ServiceNameGrpcPort또는ServiceNameProtoPort - 메서드명: 동사 + 명사 조합
- 조회:
findByName,getUser,searchOrders - 생성:
createUser,addProduct - 수정:
updateUser,modifyOrder - 삭제:
deleteUser,removeProduct
- 조회: