#code-generation
글
-
Gradle 소스 파헤치기 4: 서비스 레지스트리 — Gradle 안의 DI 컨테이너
태스크 생성자에 @Inject를 붙이면 FileSystemOperations가 들어오는 것은 누구 덕분일까요. 스코프마다 하나씩 만들어 부모를 따라 서비스를 찾는 DefaultServiceRegistry, @Provides 메서드로 서비스를 선언하는 규칙과 장식(decorator), 처음 찾을 때 만드는 게으른 싱글턴, 서비스가 제 스코프에 있는지 보는 ServiceScopeValidator, 모듈 57개가 스코프마다 서비스를 보태는 GradleModuleServices, 그리고 abstract 게터를 채운 _Decorated 클래스까지, 레지스트리를 빌드 밖에서 직접 써 보고 태스크 생성 스택을 찍어 소스와 함께 확인합니다.
-
Gradle 소스 파헤치기 6: 프로젝트와 빌드 스크립트 — build.gradle.kts가 실행되기까지
build.gradle.kts 한 파일은 소스에서 무엇이 될까요. settings가 적어 둔 설명서로 DefaultProject를 만드는 곳, 프로젝트 잠금 안에서 도는 평가기 사슬과 beforeEvaluate·afterEvaluate 상태, 파일 이름 끝으로 Groovy와 Kotlin을 고르는 선택기, plugins {}를 먼저 떼어 두 번 컴파일하는 두 DSL, tasks.compileJava를 가능하게 하는 생성된 접근자, settings에서 하위 프로젝트로 이어지는 클래스로더 스코프까지, 같은 스크립트를 두 DSL로 돌리고 스택을 찍어 소스와 함께 확인합니다.
-
Kafka 소스 파헤치기 3: 와이어 프로토콜 — JSON 스키마에서 만들어지는 요청과 응답
프로듀서와 브로커가 TCP 위에서 주고받는 바이트는 [4바이트 길이][요청 헤더][본문] 한 가지 모양입니다. 그 모양을 정하는 JSON 스키마 203개가 빌드 때 자바 클래스 391개가 되는 과정, 판(version)을 고르는 ApiVersions 협상, 옛 판과 새 판이 함께 사는 유연한 판과 태그 필드를 소스로 따라가고, 생성된 클래스만으로 맨 소켓에 요청을 보내는 예제로 바이트를 직접 확인합니다.
-
MariaDB 소스 파헤치기 6: 파서 — SQL 문장이 LEX와 Item 나무가 되기까지
문자열로 들어온 SQL 한 문장이 렉서(Lex_input_stream)에서 토큰이 되고, Bison이 만든 파서(MYSQLparse·ORAparse)의 규칙 액션에서 LEX·SELECT_LEX·TABLE_LIST·Item 나무가 되는 과정을 소스로 따라갑니다. 문법 파일 하나에서 파서 두 개가 생기는 빌드 규칙, 키워드 표와 state_map, "near '...' at line N" 오류가 만들어지는 곳을 보고, Bison 추적과 gdb로 파서가 남긴 나무를 직접 찍어 봅니다.
-
Tomcat 소스 파헤치기 13: Jasper — JSP가 서블릿이 되기까지
hello.jsp를 처음 요청하면 Tomcat 안에서 무슨 일이 일어날까요? JspServlet이 요청을 받아 JSP 파일을 노드 트리로 읽고, 자바 소스로 옮겨 쓰고, ecj로 컴파일해 work 폴더에 .class를 남긴 뒤 그 클래스를 서블릿처럼 부르는 과정을 Jasper 소스로 따라갑니다. 생성된 .java 파일을 직접 열어 보고, JSP를 고쳤을 때 언제 다시 컴파일되는지(development, modificationTestInterval, checkInterval)도 예제로 확인합니다.