본문으로 건너뛰기

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