Quarkus BCE 백엔드 워크플로우
범위 및 디렉터리 경계
- 엄격한 경계:
backend/내부에서만 작동합니다. 절대frontend/파일을 건드리지 마세요. - 아키텍처: 엄격한 Adam Bien BCE 패턴 (
com.app.<domain>.{boundary, control, entity}). - 기술 스택: Quarkus, Jakarta EE (
jakarta.*만 사용—절대javax.*나org.springframework.*를 사용하지 마세요).
2단계 실행 게이트
1단계: 계약 및 스켈레톤 (인간 검토를 위해 중지)
entity: 불변 Javarecord페이로드(@NotNull,@NotBlank,@Schema포함)와 JPA/Panache 엔티티를..<domain>.entity내부에 생성/업데이트합니다.control또는boundary에 대한 의존성은 없습니다.boundary: JAX-RS@Path리소스 시그니처(@Transactional,@RolesAllowed,@Operation)를..<domain>.boundary내부에 생성/업데이트합니다.- 테스트:
backend/src/test/java/..<domain>/boundary/에 실패하는 JUnit@QuarkusTest또는 단위 테스트 스텁을 생성/업데이트합니다. - 일시 중지:
entity,boundary및 테스트의 diff를 사용자에게 보여줍니다.control구현을 작성하기 전에 승인을 기다립니다.
2단계: 구현 및 스키마 내보내기
control:..<domain>.control내부에 비즈니스 로직을 구현합니다(@ApplicationScoped). 다른 도메인의control을 직접 호출하지 말고 항상 해당boundary를 통해 호출하세요.- 계약 확인 및 내보내기:
backend/내에서 다음을 실행합니다../mvnw test
Java 25 LTS 언어 및 JVM 규칙 (필수)
Java 25 LTS만 대상으로 합니다(<maven.compiler.release>25</maven.compiler.release>). 레거시 Java 8/11/17 상용구를 작성하지 마세요:
- 완전한 Switch 및 Record 분해 (
control및entity):- 도메인 결과 및 상태 머신을
entity에서sealed interface+record구현을 사용하여 모델링합니다. control에서는 완전한switch표현식에 record 패턴 분해 및 가드when절을 사용하여 처리합니다(예:case PaidOrder(var id, var total) when total > 1000 -> ...).sealed interfaceswitch에default분기를 절대 포함하지 마세요. Java 25 컴파일러가 새 상태가 추가될 때 완전성을 강제합니다.
- 도메인 결과 및 상태 머신을
- 유연한 생성자 본문 (JEP 513):
- 비대해진 정적 헬퍼 메서드를 만드는 대신
super(...)또는this(...)를 호출하기 전에 생성자 내부에서 직접 빠른 실패 검증 및 데이터 정규화를 수행합니다.
- 비대해진 정적 헬퍼 메서드를 만드는 대신
- 무명 변수 (
_):- 사용되지 않는 람다 매개변수, 무시된 예외 변수 또는 사용되지 않는 분해된 record 구성 요소에는 항상
_를 사용합니다(예:case Order(var id, _, _)).
- 사용되지 않는 람다 매개변수, 무시된 예외 변수 또는 사용되지 않는 분해된 record 구성 요소에는 항상
- 가상 스레드 및 범위 값 (JEP 506):
- Quarkus
boundary의 블로킹 I/O 엔드포인트의 경우 스트리밍이 필요하지 않으면 반응형Uni<T>체인보다@RunOnVirtualThread를 선호합니다. ThreadLocal을 절대 사용하지 말고, 스레드 범위 내에서 컨텍스트 상태를 전달해야 하는 경우 항상 Java 25ScopedValue<T>를 사용하세요.
- Quarkus
- 현대적인 컬렉션 및 스트림 수집기 (JEP 485):
- 인덱스 수학
list.get(list.size() - 1)대신SequencedCollection메서드(.getFirst(),.getLast(),.reversed())를 사용하세요. - 수동 청킹 루프 대신
Stream.gather(Gatherers.windowFixed(...))를 사용하세요.
- 인덱스 수학
- 요청되지 않은 경우 미리보기 플래그 사용 금지:
- 확정된 Java 25 LTS 기능만 사용하세요(명시적으로 요청하지 않는 한 JEP 507 기본형 패턴 또는 JEP 505 구조적 동시성을 위해
--enable-preview를 활성화하지 마세요).
- 확정된 Java 25 LTS 기능만 사용하세요(명시적으로 요청하지 않는 한 JEP 507 기본형 패턴 또는 JEP 505 구조적 동시성을 위해