
@Override
public void start() {
System.out.println("8기 오픈미션");
}
프리코스를 통해 성장한 '나'
중간 회고에서 TeDDIe의 기본 구조를 잡고 각각의 시스템을 구축했습니다. 이제는 그 시스템을 실제로 작동시키고, 엣지 케이스를 처리하고, 최종적으로 실행 가능한 프로젝트를 자동 생성하는 시스템을 완성한 내용을 작성해보도록 하겠습니다.
HTTP/2 vs HTTP/1.1 충돌 문제를 겪었을 때, 테스트 코드가 모두 통과했다는 사실이 중요한 힌트가 됐습니다.
// MockWebServer 테스트: ✅ 통과
// 실제 LM Studio 연결: ❌ Connection Refused
"테스트는 통과하는데 실제로는 안 된다 = 코드 로직이 아니라 환경/프로토콜 문제"라는 걸 빠르게 파악할 수 있었습니다.
해결:
HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1) // 이 한 줄로 해결
.build();
LLM 응답이 매번 달라지는 문제를 겪으며 "AI를 통제하려 하지 말고, 어떤 형태가 와도 처리할 수 있게" 만드는 방향으로 전환했습니다.
방어적 파싱 전략:
private String cleanTestValue(String value) {
value = value.replaceAll("```[a-z]*\\n?", ""); // 마크다운 제거
value = value.replaceAll("\\([^)]+\\)", ""); // 괄호/설명문 제거
String[] lines = value.split("\n");
return lines[0].trim(); // 첫 줄만 추출
}
성공률 30% → 95%로 향상.
다른 도구들은 README.md만 생성하지만, TeDDie는 즉시 실행 가능한 Gradle 프로젝트 전체를 생성합니다.
java-lotto/
├── build.gradle ✅
├── src/main/java/lotto/Application.java ✅
└── src/test/java/lotto/ApplicationTest.java ✅ (바로 테스트 가능!)
처음에는 모든 LLM 응답 형태를 정규식으로 커버하려 했습니다. 결과는 끝없는 예외 처리를 했어야 했습니다.
이 과정을 통해 배운 교훈은
80%만 커버해도 충분하다고 생각이 들었습니다.
나머지 20%는 프롬프트 개선으로 해결됬습니다.
프롬프트 + 파싱 조합이 가장 효과적이라고 생각했습니다.
HTTP/2와 HTTP/1.1의 차이를 몰라서 1~2시간을 헤맸습니다.
추가적으로 학습을 해야할 것은:
네트워크 프로토콜 기초 학습
"왜 안 되지?"보다 "어떤 계층에서 문제가 발생했을까?" 먼저 생각할 수 있도록 해야할 것 같습니다.
회고를 작성하며
내가 아는 것과 모르는 것을 명확히 구분할 수 있었습니다.
새로운 기술을 만나도 학습 방법을 알기에 두렵지 않게 되었습니다.
나를 다시 돌아볼 수 있는 것이 좋았습니다.
TeDDie는 의도적으로 모든 테스트를 생성하지 않습니다.
사용자가 "어떤 테스트가 더 필요할까?" 고민하도록 유도
완벽한 테스트 제공 시 → 단순 통과만 목표
최소 테스트 제공 시 → 능동적 사고 유발
// TeDDie가 생성하는 테스트 (최소)
@Test void 기능_테스트() { /* ... */ }
@Test void 예외_테스트() { /* ... */ }
// ⬇️ 여기부터는 사용자가 직접 추가
// @Test void 로또_번호_중복_검증() { ??? }
// @Test void 음수_금액_예외() { ??? }
Connection Refused 에러 → 프로토콜 학습
정규식 파싱 실패 → 방어적 프로그래밍 학습
LLM 응답 불일치 → AI 시스템 설계 원칙 학습
4주간의 프리코스는 저에게 계속 도전할 수 있는 기회와 성장할 수 있는 기회를 주었습니다.
새로운 기술과 방법들을 배우고 공부하며 내가 어떤 개발자로 성장해야하는지 확실히 알게 될 수 있었던 계기였습니다.
프리코스는 끝났지만, 제 도전의 여정은 계속됩니다.