Show HN: Skir – Protocol Buffer와 비슷하지만 더 좋음

발행: (2026년 3월 9일 AM 02:17 GMT+9)
4 분 소요

Source: Hacker News

데이터 타입을 위한 단일 진실 소스

Skir는 데이터 타입, 상수, API를 정의하기 위한 선언형 언어입니다. 스키마를 .skir 파일 하나에 작성하면 TypeScript, Python, Java, C++ 등 다양한 언어에 맞는 관용적이고 타입‑안전한 코드를 생성할 수 있습니다.

시작하기GitHub에서 보기

빠른 시작

npx skir init

올바른 코드 생성

  • 하나의 YAML 파일. 하나의 명령.
  • 워치 모드에서 자동으로 재컴파일.
  • 생성된 코드는 각 언어에 자연스럽게 어울리며 사용하기 쉽습니다.
  • 워크플로우가 매우 간단합니다.

지금 직렬화하고 100년 뒤에 역직렬화

오래 지속되거나 분산된 시스템에서 스키마를 수정하는 것은 위험합니다—작은 실수 하나가 클라이언트를 깨뜨리거나 오래된 데이터를 역직렬화할 수 없게 만들 수 있습니다. Skir는 스키마를 안전하게 진화시킬 수 있도록 간단한 가이드라인과 내장 검사를 제공합니다.

엔드‑투‑엔드 타입 안전성을 갖춘 RPC

Skir에서 API 메서드를 정의하고 gRPC처럼 로컬 함수처럼 호출하세요. 프론트엔드와 백엔드, 혹은 마이크로서비스 간에 API 계약 불일치가 더 이상 발생하지 않습니다. 클라이언트와 서버는 항상 동기화됩니다.

추가 기능

JSON 또는 바이너리 직렬화

웹 API와 데이터베이스용 밀집 JSON, 디버깅용 가독성 좋은 JSON, 혹은 원시 성능을 위한 바이너리 중에서 선택하세요.

내장 패키지 매니저

파일을 복사할 필요가 없습니다. GitHub 저장소 어디에서든 타입을 직접 가져올 수 있습니다. 프로젝트 간에 공통 데이터 구조를 공유하세요.

일류 개발자 경험

실시간 검증, 코드 자동 완성, 자동 포맷팅 등을 제공하는 강력한 VS Code 확장이 포함되어 있습니다.

지원 언어

주요 프로그래밍 언어 모두에 대해 프로덕션 수준의 코드를 생성합니다.

시작할 준비가 되었나요?

몇 분 안에 첫 Skir 프로젝트를 설정하고, 단일 YAML 파일로 전체 프로젝트 구성을 관리하세요.

문서 읽기

0 조회
Back to Blog

관련 글

더 보기 »

Archify 소개: 아키텍처 아이디어에서 Spring Boot 코드까지

문제 모든 백엔드 개발자는 이 순간을 경험해 본 적이 있다: 새로운 프로젝트를 시작하면서 이미 아키텍처를 염두에 두고—아마도 간단한 REST 서비스와 몇 개의 엔드포인트만을 생각하고—시작한다. 하지만 프로젝트가 진행될수록 요구사항이 늘어나고, 복잡도가 급격히 증가한다. ### 원인 1. **초기 설계 부족** - 프로젝트 초기에 충분한 도메인 모델링과 데이터 흐름 설계를 하지 않으면, 나중에 구조를 바꾸는 데 큰 비용이 든다. 2. **기능 폭발** - 초기에는 “읽기 전용” API만 필요했지만, 곧 쓰기, 인증, 권한, 실시간 알림 등 다양한 기능이 추가된다. 3. **기술 스택 변화** - 새로운 라이브러리나 프레임워크가 등장하면서 기존 코드를 교체하거나 통합해야 하는 상황이 발생한다. ### 해결책 #### 1. 도메인 중심 설계(Domain‑Driven Design) 적용 - **Bounded Context**를 명확히 정의하고, 각 컨텍스트마다 독립적인 모델과 서비스 계층을 만든다. - **Entity**, **Value Object**, **Aggregate** 등을 활용해 비즈니스 로직을 캡슐화한다. #### 2. 레이어드 아키텍처 도입 - **Presentation Layer** (Controller / Handler) – HTTP 요청을 받아 DTO 로 변환하고, 서비스에 위임한다. - **Application Layer** – 트랜잭션 경계와 워크플로우를 정의한다. - **Domain Layer** – 핵심 비즈니스 로직과 도메인 규칙을 구현한다. - **Infrastructure Layer** – DB, 메시지 브로커, 외부 API 등 기술적 세부 사항을 담당한다. #### 3. 인터페이스와 의존성 역전(Dependency Inversion) - 상위 레이어가 하위 레이어에 의존하지 않도록 **Repository Interface**, **Service Interface** 등을 정의하고, 구현은 인프라 레이어에 둔다. - 스프링에서는 `@Autowired` 대신 **Constructor Injection**을 사용하고, 테스트 시에는 **Mock** 구현체를 주입한다. #### 4. 모듈화와 마이크로서비스 전략 - 시스템이 일정 규모를 넘어가면 **Domain‑Driven Microservices** 혹은 **Modular Monolith** 로 전환한다. - 각 모듈(또는 서비스)은 독립적인 데이터베이스 스키마와 배포 파이프라인을 갖는다. #### 5. 자동화된 테스트와 CI/CD 파이프라인 - **Unit Test**, **Integration Test**, **Contract Test**(예: Spring Cloud Contract) 를 레이어별로 작성한다. - GitHub Actions, GitLab CI 등으로 **빌드 → 테스트 → 배포** 흐름을 자동화한다. #### 6. 문서화와 코드 규칙 - OpenAPI/Swagger 로 API 스펙을 정의하고, **API‑First** 접근법을 채택한다. - 코드 스타일은 **Checkstyle**, **Spotless**, **EditorConfig** 로 일관성을 유지한다. ### 예시 코드 (Spring Boot) ```java // Domain Layer @Entity public class Order { @Id @GeneratedValue private Long id; private LocalDateTime orderDate; @Embedded private Money totalAmount; // 비즈니스 메서드 public void addItem(Product product, int quantity) { … } } // Application Layer @Service @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepo; private final PaymentGateway paymentGateway; @Transactional public OrderDto placeOrder(CreateOrderCommand cmd) { Order order = new Order(); // 도메인 로직 수행 orderRepo.save(order); paymentGateway.charge(order.getTotalAmount()); return OrderMapper.toDto(order); } } // Infrastructure Layer @Repository public interface OrderRepository extends JpaRepository<Order, Long> {} // Presentation Layer @RestController @RequestMapping('/api/orders') @RequiredArgsConstructor public class OrderController { private final OrderService orderService; @PostMapping public ResponseEntity<OrderDto> create(@RequestBody @Valid CreateOrderCommand cmd) { OrderDto result = orderService.placeOrder(cmd); return ResponseEntity.status(HttpStatus.CREATED).body(result); } } ``` ### 마무리 프로젝트 초기에 **아키텍처 설계**와 **도메인 모델링**에 충분한 시간을 투자하면, 이후 기능 추가나 기술 교체가 훨씬 수월해진다. 레이어드 아키텍처와 DDD 원칙을 적용하고, 의존성 역전 및 자동화된 테스트를 기반으로 하면, 복잡도가 증가해도 유지보수 가능한 코드를 유지할 수 있다. **핵심 포인트** - 초기 설계에 투자 → 장기 비용 절감 - 레이어와 인터페이스로 책임 분리 - 테스트와 CI/CD 로 변경 위험 최소화 - 필요 시 마이크로서비스 혹은 모듈형 모노리식으로 확장