요즘 React.js와 Next.js를 공부하고 있다.
이번에 무한 스크롤에 대해 배우게 되었는데, 간단한 demo 프로젝트를 만들어서 복습해보려 했다.
이때 목록을 조회하는 api가 필요했는데, 내가 실무에서 주로 사용하는 기술인 SpringBoot로 빠르게 만들 수 있었다.
근데 이번에는 인공지능을 사용해 api를 만들어보고 싶어
IntelliJ에 Claude를 붙여 프롬프팅으로만 api 서버를 구현해보았다.
Java/SpringBoot/Jpa/PostgreSQL 환경에서
Claude에 IntelliJ를 연결해 api 서버를 구현한 과정을 정리해보려 한다.
학습을 위한 간단한 토이프로젝트이기 때문에 로컬에서 도커로 PostgreSQL 컨테이너를 실행시켜 DB 서버를 구축하였다.
Dockerfile은 다음과 같다.
FROM postgres:13-alpine
# 계정정보 설정
ENV POSTGRES_USER=yoojin \
POSTGRES_PASSWORD=password \
POSTGRES_DB=infinite-scroll \
TZ=Asia/Seoul
EXPOSE 5432
CMD ["postgres"]
그리고 아래 명령어로 컨테이너를 실행하였다.
cd 도커파일이 있는 위치
# 이미지 빌드
docker build -t infinite-scroll-db .
# 컨테이너 실행
docker run -d -p 5432:5432 --name infinite-scroll-db infinite-scroll-db
IntelliJ에서 아래와같이 Spring Boot 프로젝트를 생성하였다.
추가한 디펜던시는 Lombok, SpringWeb, Spring Data JPA, PostgreSQL Driver 총 4개이다.
그리고 아래와같이 application.properties를 작성하여 DB 연결과 JPA 설정에 진행하였다.
# 데이터베이스 연결 설정
spring.datasource.url=jdbc:postgresql://localhost:5432/infinite-scroll
spring.datasource.username=yoojin
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver
# JPA 설정
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
우선 Claude에 IntelliJ를 연결해야한다.
연결하는 방법은 아래 포스팅을 참고해주길 바란다.
IntelliJ에 Claude MCP를 붙여 더 intelligent하게 만들어보쟛!
최근에 커서AI와 같은 인공지능이 탑재된 IDE에 대해 관심이 생겼다. 그래서 관련 책도 사고, 커서AI 체험기간동안 체험도 해보구... 그랬는데, WOW 이게 되네? 감탄을 금치 못했다. 마음같아선 일어
yooputer-devlog.tistory.com
연결을 한 후 인텔리제이와 연결되어있는지 물어본다.
작업관리자에서 Claude 프로세스를 완전히 종료한 후 다시 실행시켜보니 정상적으로 연결되었다.
자 이제 API를 만들어달라고 하자!!
나는 아래와 같은 프롬프트를 입력했다.
식당 목록을 조회하는 간단한 api를 구현하려고 해.
jpa를 사용할거고, postgresql에 연결되어 있어.
1. 식당 entity를 구현해줘.
2. 한 100개정도 더미 데이터를 넣어줘
3. 식당 목록을 조회하는 api를 구현해줘. 이 api는 무한스크롤용 api야.
4. 이 api에 대한 테스트코드를 작성해줘.
프롬프트를 입력하면 프로젝트 구조와 build.gradle을 파악한 후 본격적으로 구현을 시작한다.
구현을 완료한 후, 테스트코드의 오타를 수정하다가 메시지 최대 길이에 도달해버렸다...
나는 무료 플랜이라 더이상 추가적인 요청이 불가능해 내가 직접 오타를 수정하였다...^^...
프로젝트를 실행하니 더미데이터를 넣는 DataLoader도 정상적으로 동작하고 api도 제대로 동작한다...!
근데 소스를 좀 봐보니 맘에 안드는 부분을 발견했다.
쿼리메서드를 이용하는게 아니라 JPQL로 작성해놨다.
그래서 지피티한테 코드를 수정해달라고 부탁했다..
그리고 서비스단의 get메서드에 Transactional을 붙여놔서 제거하고
마음에 안드는 변수명과 데이터타입을 수정했다.
lastId가 존재할때와 null일때 모두 정상적으로 작동하는 것을 확인했다.
GET http://localhost:8080/api/restaurants
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 25 Jun 2025 04:29:49 GMT
{
"restaurants": [
{
"id": 100,
"name": "버거 앤 프라이즈 2호점",
"address": "서울시 용산구 이태원동 345-67",
"phone": "02-3866-2802",
"category": "멕시칸",
"description": "신선한 재료만을 사용하여 건강한 요리를 만듭니다.",
"imageUrl": "https://picsum.photos/400/300?random=99",
"isOpen": false,
"openingHours": "11:00 - 21:00",
"deliveryAvailable": false,
"createdAt": "2025-06-25"
},
...
{
"id": 91,
"name": "카페 라떼 2호점",
"address": "서울시 영등포구 여의도동 123-90",
"phone": "02-4224-2501",
"category": "양식",
"description": "오랜 전통을 자랑하는 노포 맛집입니다.",
"imageUrl": "https://picsum.photos/400/300?random=90",
"isOpen": true,
"openingHours": "10:00 - 21:00",
"deliveryAvailable": false,
"createdAt": "2025-06-25"
}
],
"hasNext": true,
"lastId": 91,
"totalElements": 100
}
Response file saved.
> 2025-06-25T132949.200.json
Response code: 200; Time: 16ms (16 ms); Content length: 2997 bytes (3 kB)
GET http://localhost:8080/api/restaurants?lastId=91
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 25 Jun 2025 04:31:46 GMT
{
"restaurants": [
{
"id": 90,
"name": "회 전문점 2호점",
"address": "서울시 영등포구 여의도동 123-90",
"phone": "02-2094-1870",
"category": "카페",
"description": "현지 셰프가 직접 만드는 authentic한 맛을 경험해보세요.",
"imageUrl": "https://picsum.photos/400/300?random=89",
"isOpen": true,
"openingHours": "10:00 - 22:00",
"deliveryAvailable": true,
"createdAt": "2025-06-25"
},
...
{
"id": 81,
"name": "삼계탕 전문점 2호점",
"address": "서울시 송파구 잠실동 234-56",
"phone": "02-3079-2679",
"category": "브라질음식",
"description": "현지 셰프가 직접 만드는 authentic한 맛을 경험해보세요.",
"imageUrl": "https://picsum.photos/400/300?random=80",
"isOpen": false,
"openingHours": "09:00 - 20:00",
"deliveryAvailable": false,
"createdAt": "2025-06-25"
}
],
"hasNext": true,
"lastId": 81,
"totalElements": 90
}
Response file saved.
> 2025-06-25T133146.200.json
Response code: 200; Time: 32ms (32 ms); Content length: 3031 bytes (3.03 kB)
인공지능을 사용하여 api 서버를 개발해보니
내가 개발하는 스타일과 유사한데, 직접 코딩하는 것보다 빨라서
나의 생산력을 극대화시켜줄 수 있을 것 같다는 생각이 들었다.
하지만 요구사항을 디테일하게 작성하고,
인공지능이 생성한 코드를 이해하며,
그 속에서 오류를 발견할 수 있는가는
온전히 나의 역량이니 그 부분을 유의하며 사용해야 할 것 같다.
모든 소스코드는 아래 링크에서 확인할 수 있다.
https://claude.ai/share/5c028629-6af1-4573-b39f-730bb8154772
IntelliJ에 Claude MCP를 붙여 더 intelligent하게 만들어보쟛! (0) | 2025.05.16 |
---|---|
[GPT 활용기] 파이썬 코드 리팩토링 (0) | 2025.04.15 |