AI의 등장과 LLM의 발전으로 자연어로 대화하듯 코딩할 수 있는 세상이 도래되었다.
개발자들은 이제 보일러플레이트 고드 작성, 단순한 함수 구현, 문서화 작업 등을 LLM에 맡기고, 시스템 아키텍처 설계, 비즈니스 로직 구현, 사용자 경험 개선 등 창의적이고 전략적인 업무에 시간을 투자해야 하는 시대가 되었다.
chatGPT를 주로 사용하다가 코딩경력 40년된 분으로부터 claude code 가 좋다고 해서 claude 를 사용해보기 시작했다.
chatGPT 와 다르게 claude 는 코드를 제대로 구현해주는 느낌을 받았다.
그러나 문제가 좀 있는 것은....
함수가 없어서 새로 구현해야 한다고 의견 제시를 하면 좋은데, 구현되어 있는 함수로 최대한 활용하여 코드를 구현하려는 못된 습성이 있다.
Web 에서 질문했을 때 무조건 새로운 대화창에 다시 문의하는 것이 대안이다. chatGPT에게 문의하면 오히려 문제가 해결될 수도 있다. 여러번 당해봐서 이제는 어떻게 해야 할지 알게 되었다.
claude code 에서는 ESC 키를 눌러서 중단하고, 명확하게 요구사항을 다시 작성해서 요구하는 것이 좋다.
claude 는 Web 상에 코드를 붙여넣고 원하는 걸 구현 요청하다보니 토큰 소모가 claude code 보다 더 많은 거 같다.
장점도 당연히 있다. 구현해준 코드를 확인하면서 다시 수정 요청하기가 편한 경우가 있다.
Back-End 코드를 구현하기 위해서는 먼저 테이블을 설계하고 테이블 구조를 claude에 알려줘야 한다.
테이블 설계는 chatGPT 와 claude 둘 다 활용하면서 진행해 봤다.
테이블 설계를 한 후, 또는 설계된 테이블을 수정하면서 Spring Boot 에 필요한 RestController, Service, Mybatis mapper 등을 claude 가 알아서 구현해 준다.
JPA + QueryDSL 코드인 경우에도 잘 구현된 샘플이 매우 중요하다.
맨땅에서 헤딩하면서 잘 된 코드를 기대해서는 안된다. 잘 구현된 샘플코드가 매우 중요하다.
샘플코드는 Layout 등 템플릿 구조가 잘 설계된 코드를 말한다.
잘 만들어진 템플릿을 구현하거나, 얻어서 테스트하고 내것으로 만드는 것이 중요한 거 같다.
설계를 잘 하기 위해서는 발주처의 요구사항을 분석하고 로직을 잘 그릴 줄 알아야 한다.
claude code는 기존 구조를 스스로 파악해서 요청하는 신규 코드를 잘 구현한다.
Web 처럼 샘플코드를 찾아서 구조 설명하면서 이런 구조로 구현해 달라고 하지 않는 점이 장점이다. 경로만 잘 인식하도록 지정해주면 알아서 그 코드를 분석하고 신규 코드를 구현한다.
그런데 구체적으로 요청하지 않으면 추론으로 쓸데없는 함수 구현을 많이 해주는 경향이 있다.
처음에는 명확하게 CRUD 만 구현할 것을 요청하는 것이 중요한 거 같다.
그런 다음에 Front-End 코드를 구현할 사항을 정의하여 claude code 에 제공하고 구현 요청한다.
당연히 관련된 백엔드 Controller 가 뭔지, 어떤 폴더에 있는지 알려줘야 한다.
Vue3 로 구현 시 잘 구현된 다른 폴더의 샘플을 제시하면 분석해서 순식간에 코드를 생성한다.
하지만, 코드가 완성도 있게 잘 구현되어 있기를 기대해서는 안되더라.
Spring Boot 를 구동시키고, Vue3 를 구동시켜 테스트 하면서 하나씩 기능을 점검하고 추가하는 작업을 해야 원하는 결과를 빠르게 구현할 수 있다.
막연히 알아서 구현해주겠지 하고 기대했다간 큰 코 다칠 수 있다는 걸 명심하자.
claude code 를 사용하고 exit 하기 전에 반드시 "claude.md 에 저장해줘. 그리고 다음에 이어서 할 수 있게 정리해줘" 라고 하고 나서 exit 하자.
"Vue3, Spring Boot, Android git commit 해줘" 라고 하자. 그러면 잘못 개발 진행되면 되돌릴 수 있다.
Front-End 로 React 를 사용하면 React git commit 해줘 라고 하면 된다.
코드를 대폭 수정해야 할 사항으로 진행하려고 한다면 반드시 git commit 을 먼저하고 나서 진행하는 것이 필수다.
그렇지 않으면 중도에 되돌리는데 애로사항이 있을 수 있다.
DB 연결 정보를 mcp mariadb 라고 claude code 에서 요청하면 해당 DB 접속정보를 만들어 낸다.
그걸 반드시 테스트 해서 처리해야 한다. DB 테이블 저장 데이터, 테스트하는 user_id 등을 알려주고 테이블명 확인 요청 등을 하면서 데이터 잘못 저장하는지 확인 등 하면 좋다.
그런데 신규 프로젝트를 생성하고 기존에 사용하던 .mcp.json 파일을 복사해서 DB 내용을 수정하고 claude Code 를 실행하면 접속이 자동으로 될 것으로 기대를 했으나 그렇지 않다.
몇번의 시행착오를 거치면서 알아낸 사실은 MCP 서버 자체의 env 파일은 다른 DB로 설정되어 있을 수 있으니 반드시 claude 에게 확인해서 정확한 접속이 되도록 설정을 하는 것이 중요하다.
| 항목 |
값 |
| .env 파일 |
c:\DEV\mcp-servers\mariadb-mcp\nindv.env |
| DB_NAME |
nindv |
| .mcp.json 위치 |
c:\AndroidStudioProjects\Logis\nindv\vue3\nindv-ui\.mcp.json |
| MCP 서버 이름 |
mariadb-nindv |
| Claude Code 시작 위치 |
c:\AndroidStudioProjects\Logis\nindv\vue3\nindv-ui |
| 테스트 쿼리 |
SELECT * FROM hr_members WHERE user_id = 'admin01'; |
Web 브라우저 콘솔 창에서 발생하는 로그를 일일히 붙여하면서 요청하는 것이 너무 귀찮아서 찾아보니 playwright mcp 를 설정해서 사용하면 편하다고 되어 있다.
"playwright를 사용해서 https://www.naver.com 에 접속하고 스크린샷을 찍어줘"
"playwright로 구글에서 'MCP'를 검색하고 결과를 가져와줘"
"playwright를 이용해서 로그인 폼을 테스트하는 스크립트 만들어줘"
mcp playwright 로 스스로 Web 브라우저를 띄우고 알려준 user_id, pw 정보를 토대로 로그인 처리까지 하고 직접 콘솔 에러로그를 확인하면서 잘못된 것을 수정하고, 백엔드코드를 수정하는 걸 경험했다. 신세계를 경험하는 느낌이었다.
일일이 설명하기 정말 귀찮은데 알아서 분석하는 것을 보니까 놀랍더라.
개발서버에서 개발한 코드를 CI/CD 로 자동으로 서버에 업로드하고 배포하는 걸 스크립트화 했더니 그 파일을 가지고 스스로 서버에 배포하면서 확인까지 하더라.
장점
1. Vue3 프로젝트 폴더에서 백엔드 폴더 경로 알려주면 백엔드 파일도 같이 수정한다.
한번에 Front-End 와 백엔드 코드를 개발하면서 진행하기 때문에 매우 편리하다.
2. 남들이 개발한 코드 분석하라고 하면 엄청 잘 한다. 세부적으로 잘하는 지 여부는 모르겠으나 전체 관점 로직 분석 짱.
3. Github 등 공개된 오픈 소스 분석해서 내가 구현하고 싶은 걸 요청하는 거 정말 잘한다.
4. 언어 상관없이 소스 분석 잘 한다. 그러니 내가 아는 Open 소스를 구하려고 하지 않아도 된다.
5. 템플릿이 잘 구성된 코드 기반으로 살을 붙여가는 방식으로 코드 구현은 매우 좋은 거 같다.
6. 이미지 분석을 정말 잘한다. 설명하기 모호하면 캡쳐해서 이미지 경로 알려주고 설명 적어주는게 빠르다.
이해를 잘못하고 엉뚱 한 걸 수정하면 이미지 캡쳐해서 저장하고 경로 알려주면 바로 이해하더라.
7. "Android 코틀린 앱의 채팅과 동일한 구조로 Vue3 채팅 메뉴를 구현해줘" 라고 하면 Android kotlin 코드를 분석해서 Vue3 채팅 기능을 구현해준다.
단점
1. 분석을 100% 했을 거라고 기대하지만 막상 구현된 코드를 테스트하면 대략적인 흐름만 구현한다.
즉 디테일한 요구사항까지 분석해서 코드를 구현하지 않더라.
2. 하나의 프로젝트를 거의 완벽하게 구현한 코드를 95% 활용하고 싶어서 분석을 요청하면 대충 분석을 한다.
기존 코드와 약간 다른 점, DB가 달라지는 점 등을 제대로 설명하기 위한 방법을 찾으려고 한다.
mWeb 기능 @c:\DEV\Vue3\pchat-ui\ 프로젝트 참조해서 구현해줘. 라고 했더니 엉뚱하게 처리하더라.
제대로 분석 안했다고 하니까 그때서야 다시 분석하고 100% 그대로 복사하려는 경향을 보인다.
결국 어떻게 알려줘야 제대로 할 것인가의 문제인 거 같다.
3. Spring Boot 는 백엔드 제어권을 내가 가지고 에러 메시지를 확인하면서 피드백해야 빠르다.
제어권 넘기고 알아서 로그 분석하면서 할 것으로 기대하면 안된다.
4. 중간에 변수명 변경한 것이 있으면 꼭 알려줘야 한다. 그리고 그와 관련된 모든 코드를 점검하라고 해야 한다.
알아서 변경했겠거니 했다가 완전 맨붕상태 빠질 수 있다.
chatGPT는 마지막 파일을 Web 에 붙여넣으면 그 코드 기준으로 변수명을 업데이트하는데
claude 는 초기 읽어들인 변수명을 고집하는 경향이 있다. 그러므로 변수명 변경사항은 꼭 알려줘야 한다.
5. 전체 공통으로 영향을 주는 코드 파일이 있다. 하지만 무슨 문제가 생기면 이 파일도 수정해버리는 경향이 있다.
반드시 이 파일은 수정 불가라고 알려줘야 한다.
6. 문제가 발생해서 에러 로그를 제공하면 문제 분석을 특정 부분으로 유추하지 못하고 엉뚱한 것부터 수정하려는 경향이 있다. 그러므로 이상한 분석을 하는 거 같으면 ESC 키를 눌러서 바로 중단하고 요청사항을 다시 적어 요청 수정해야 한다.
7. claude code 에서 이미지 경로를 알려주면 해당 이미지를 분석하고 그대로 구현하라고 하는 줄 알고 무조건 변경하는 경향이 있다. 이미지 경로를 알려주고, 여기서 원하는 것이 무엇인지 확인한 다음에 원하는 것이 정확하면 그때 수정하도록 하는 것이 중요하더라. Front-End 한 화면을 구현하기 위해서 이미지를 캡쳐하여 이미지 경로를 알려줄 때도 필요한 구체적인 요청을 먼저 확인한 다음에 개발 요청해야 한다.
아직 claude code 사용 초보라서 모르는 사항이 많아 잘못 알고 있을 수도 있다.
claude code 를 사용하면서 chatGPT 에게 문의하는 비율은 10%도 안되는 거 같다.
claude code 발전 속도가 너무 대단한 거 같다.
바이브 코딩에 대한 유투브 소개 자료를 찾아보니, 설계를 잘하는 기술사는 바이브코딩 수혜자라고 한다.
점점 단순한 코딩만 하는 Junior 개발자의 역할은 AI 가 대신하고 기획하고, 설계할 줄 아는 인력에게 호재라고 할 수 있는 셈인가 보다.
설계를 잘 한다는 것은 VOC 가 발생하지 않도록 신경써서 기획을 해야 하고, 지속 검토하면서 기획서를 완성시켜 가야 한다고 말할 수 있다. 이렇게 하면 무슨 문제가 발생할까, 저렇게 하면 무슨 문제가 발생할까 계속 검토하고 고민하면서 테스트하다보면 문제점 ZERO에 가까운 설계/기획서가 작성될 것이다. 출시후에도 민원처리부서의 요청사항, 고객의 소리 등을 분석하고 문제점을 찾아서 신속하게 대응하는 것 또한 매우 중요하다.
코딩을 할 때에도 마찬가지이다. 디테일한 로직을 그리고 User의 관점에서 보는 눈을 길러야 한다.
바이브코딩으로 해결하기 쉽지 않는 것이 보안 코딩이다. 질문자가 초보수준이면 답변도 초보 답변을 받을 수 밖에 없다.
그럼 초보탈출은 어떻게 할 것인가? 인프런 강의 등을 듣고 직접 코딩 연습을 하듯이 타이핑을 했다면, 이제는 인프런 강의를 듣고 전체 로직을 이해하고 코딩은 AI에게 요청해서 제대로 구현했는지 확인하는 것이다.
중요한 정보라고 판단되는 것은 notion 에 기록하던, 블로그에 기록하든 정리를 해두는 것이 매우 중요하다.
사람은 망각의 동물이라 배운 것을 금방 잊어버리게 된다. 기록해서 자주 반복하여 보거나, 코드를 직접 구현하면서 부딪쳐가면서 배우는 것이 기억에 오래도록 남는다.
전문가가 되려면 몸으로 부딪쳐 가면서 배우는 수밖에 없는 거 같다. 아직 많이 부족하여 틈틈히 인프런 강의, fastcampus 강의를 수강하고 실습하고 있다.
배움에는 끝이 없다. 나이는 중요하지 않다. 노력하는 자만이 성장한다.