✅ 오늘은 “웹 화면에서 입력 → API 호출 → DB 저장 → 조회로 검증” 흐름을 완성했다.(로컬에서 진짜로 돌아가는 MVP를 만드는 날)
1) 오늘 목표
✅ Spring Boot API 서버 로컬 기동 (8080)
✅ PostgreSQL 로컬 연결(5432)
✅ Claim API 최소 구현
- POST /claims 저장
- GET /claims?limit=N 조회✅ Web /submit에서 실제 저장까지 검증
- ✅ CORS 설정 (web 3000 → api 8080 허용)
2) Day2에서 완성한 전체 흐름
Web (localhost:3000) → API (localhost:8080) → DB(PostgreSQL) 저장 → GET 조회로 검증
작업하면서 중요한 건 “기능을 예쁘게 만드는 것”이 아니라
한 번이라도 end-to-end로 데이터가 들어가고 나오는 흐름을 만드는 것이었다.
3) Java 21 / Gradle 이슈 해결
처음에는 Gradle 테스트에서 Java toolchain 관련 오류가 났다.
결론적으로 Java 21을 인식시키는 설정을 잡고 해결했다.
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
export PATH="$JAVA_HOME/bin:$PATH"
java -version
4) PostgreSQL 연결 문제 해결 (Connection refused)
Spring Boot를 띄우는 과정에서 아래 오류가 발생했다.
- Connection to localhost:5432 refused
이건 대부분 “DB가 안 떠있음 / DB 설정이 없음”으로 발생한다.
PostgreSQL이 정상 기동되고, DB가 준비되면 Spring 로그에서 다음을 확인할 수 있다.
- HikariPool Start completed
- Database JDBC URL: jdbc:postgresql://localhost:5432/ttokbaro
5) Claim API 최소 구현 (POST + GET)
오늘 만든 API는 “저장하고 조회할 수 있는 최소 기능”으로 구성했다.
(1) POST /claims — 저장
curl -X POST http://localhost:8080/claims \
-H "Content-Type: application/json" \
-d '{"sourceUrl":"https://example.com","text":"test"}'
(2) GET /claims?limit=N — 최신순 조회
curl -s "http://localhost:8080/claims?limit=5"
6) CORS 설정 + Preflight(OPTIONS)로 검증
웹(3000)에서 API(8080)로 요청하려면 CORS 허용이 필요하다.
그래서 local 개발 환경 기준으로 CORS를 열고, OPTIONS 요청으로 검증했다.
curl -i -X OPTIONS http://localhost:8080/claims \
-H "Origin: http://localhost:3000" \
-H "Access-Control-Request-Method: POST"
정상이라면 다음 헤더가 보인다.
- Access-Control-Allow-Origin: http://localhost:3000
- Access-Control-Allow-Credentials: true
- Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS

7) Web /submit 연동 → DB 저장 검증까지 완료
이제 웹 화면에서 제출을 하면, API가 호출되고 DB에 저장되어야 한다.
제출 후에는 “API 조회로 실제 저장됐는지” 바로 확인했다.
curl -s "http://localhost:8080/claims?limit=5"
이번에 웹에서 제출한 데이터가 실제로 들어온 것을 확인했다.
예시(실제 결과):
[
{
"id": 3,
"sourceUrl": "https://example.com/abc",
"text": "웹에서 첫 제출 테스트",
"createdAt": "2026-01-25T11:23:31.106135Z"
}
]

8) 오늘의 결론 (핵심 요약)
✅ Day2의 핵심은 ‘기능 추가’가 아니라 ‘연결’이었다.
Web → API → DB가 한 번 붙고 나니까, 이제부터는 기능을 훨씬 빠르게 확장할 수 있다.
9) Day3 할 일 (다음 단계)
- /claims 피드 페이지(web) 만들기 — 저장된 Claim을 화면에서 바로 확인
- Claim에 status 추가(PENDING/PROCESSED/FAILED) — 다음 AI 처리 파이프라인 준비
- (가능하면) 크롬 확장 → submit 자동 채우기 UX
'개발' 카테고리의 다른 글
| Codex Mac 앱 출시! 기존 Codex CLI랑 뭐가 달라졌을까? (그리고 뭐가 좋은지) (0) | 2026.02.07 |
|---|---|
| 2화 | Evidence(근거) 기능 확장: 추가/조회/삭제까지 (0) | 2026.02.07 |
| 0화 | 똑바로해라 시작하기 – 바이브코딩 + Codex CLI + Warp로 올인 개발 (0) | 2025.09.27 |
| [SQL] SubQuery, 서브쿼리 (0) | 2024.06.01 |
| [Java] Thread-Safe, 스레드 안전 (0) | 2024.06.01 |