안녕하세요. 레거시 프로젝트에 Claude Code를 세팅하여 진행하려고 합니다. 문서 구성 방식에 대해 몇 가지 여쭤보고 싶습니다. PRD 의 범위 PRD에는 프로젝트 전체 분석 내용이 포함되어야 하는 건가요? 기능 수정 시 문서 관리 기존 프로젝트에서 기능 수정이 발생할 경우, 해당 기능에 대한 PRD와 ROADMAP 등의 문서를 신규로 작성해야 하는 건가요? 예를 들어, 게시판 메뉴를 새로 추가한다고 가정하면: PRD → 게시판 메뉴 생성 관련 요구사항 정의 ROADMAP → PRD 기반으로 기능 구현 순서 정의 이런 방식으로 작업이 생길 때마다 PRD를 매번 새로 만들어서 관리하는게 맞는 방법인지 궁금합니다. 답변 부탁드립니다. 감사합니다.
안녕하세요 강사님! SSG를 설정하지 않은 페이지 접속 시에 5초 가량의 시간이 소요되는데, 강사님 강의에서는 그래도 5초보단 빠르게 렌더링이 되는 것 같은데 원인이 무엇인지 알 수 있을까요? 한번 SSG로 설정이 되고 부터는 굉장히 빠르게 렌더링은 됩니다. 이건 와이파이의 문제일까요? 공용 와이파이더라도, 그다지 느리다고 체감되지 않는 환경인데 이미지 때문인건지 자꾸만 렌더링 시 오래 걸려서 원인이 무엇일지 궁금합니다..! 이를 확인해보려면 어디를 확인해보면 되는지 알려주시면 감사하겠습니다! 추가로 강사님 강의 sns 프로젝트에서도(배포본) 동일하게 나타났었습니다! 제 추측으로는 이미지 때문이라고 생각하고는 있는데,,, 강사님 배포본에서는 이런 현상이 없어서 궁금했습니다!
안녕하세요, 김영한 선생님. 강의 정말 잘 듣고 있습니다. 항상 좋은 강의 감사합니다. QueryDSL 관련해서 한 가지 궁금한 점이 있어 질문드립니다. QueryDSL이 특정 재단이나 기업이 아닌 오픈소스 프로젝트로 알고 있는데, 실무 엔터프라이즈 환경에서도 안정적으로 사용되는지 궁금합니다. 또 최근에 릴리스나 유지보수 활동이 예전보다 활발하지 않은 것처럼 보이는데, 신규 프로젝트에서 QueryDSL을 선택하는 것이 여전히 좋은 선택인지도 궁금합니다. 실무에서는 보통 QueryDSL을 어떤 방식으로 활용하는지도 함께 여쭤보고 싶습니다. 감사합니다!
안녕하세요 강사님 궁금한점이 있어서 질문드립니다 task-master 유튜브 영상을 보면서 프로젝트를 만들고 PRD를 넣어서 작업계획을 생성하고 서브로 나누고 진행하는 단계까지 왔습니다 여기서 궁금한 부분은 claude code를 활용할 수 있는지 여부가 궁금합니다 클로드 코드를 실행하고 , 여기서 taskmaster가 작성한 계획대로 개발을 진행하도록 지시할 수 잇는건가요???
안녕하세요 강사님 강의를 들으면서 배운 내용들을 토대로 스프링부트 프로젝트를 진행해 보고 있습니다. MCP 플러그인과 스킬 에이전트 그리고 플랜 기획을 통한 순차 구현까지 강의에서 강조하신 모든 기법을 최대한 활용하여 실무급 규모의 프로젝트를 구축해 보았습니다. 하지만 프로젝트가 진행될수록 결과물의 완성도가 기대에 미치지 못해 고민이 깊어지고 있습니다. 현재 제가 겪고 있는 가장 큰 문제는 클로드 코드가 프로젝트의 전반적인 구조를 일관되게 유지하지 못한다는 점입니다. 분명 이닛 과정에서 클로드md 파일을 통해 아키텍처와 구조를 명확히 정의했음에도 불구하고 실제 구현 단계에서는 구조를 불필요하게 복잡하게 만들거나 계층 간의 역할이 뒤섞이는 현상이 자주 발생합니다. 또한 사용하지도 않는 함수를 임의로 생성하거나 데이터베이스 쿼리를 비효율적으로 작성하고 때로는 잘못된 쿼리를 생성하는 등 코드의 세부적인 퀄리티에서도 많은 부족함을 느끼고 있습니다. 특히 프로젝트의 규모가 어느 정도 커지니 특정 부분의 로직은 잘 짜여 있어도 정작 핵심적인 구현이 대거 누락되는 경우가 잦아지고 있습니다. 누락된 부분을 수정하도록 지시하면 그 과정에서 잘 돌아가던 다른 기능이 망가지는 연쇄적인 오류가 발생하며 이를 해결하기 위해 검증 에이전트를 병행해서 돌려보아도 알맹이가 없는 빈 껍데기 코드들이 걸러지지 않은 채 그대로 남는 문제도 겪고 있습니다. 이러한 현상들이 오푸스와 소넷 모델 모두에서 공통적으로 나타나고 있어 이것이 현재 클로드 코드가 가진 지능적 혹은 컨텍스트 유지의 한계인 것인지 아니면 제가 에이전트를 가이드하고 제어하는 능력이 부족해서 발생하는 문제인지 판단이 서질 않습니다. 강사님께서는 대규모 프로젝트를 진행하실 때 이런 AI의 구조적 일탈과 구현 누락을 어떻게 제어하시는지 그리고 제가 어떤 부분을 더 보완해야 완성도 높은 결과물을 얻을 수 있을지 조언을 구하고 싶습니다.
// A await fetch(' https://api.example.com/user/1 ', { cache: 'force-cache', }) // B await fetch(' https://api.example.com/user/1 ', { cache: 'no-store', }) app router에선 컴포넌트마다 api요청을 보내서 중복 요청이 발생하게 됩니다. 이때 캐싱옵션을 사용할 경우 전부 통일을 해줘야 작동하게 되나요? gpt 답변 이런 상황에서 메모이제이션이 되지 않고 두개를 별개의 api요청 으로 봅니다. 위 상황에서는 “캐시”도 하나로 합쳐서 동작하지 않고, 각 fetch 가 자기 옵션대로 따로 동작 합니다. 같은 의문을 품으시는 분이 있을까 해서 남겨봤습니다
제가 개발은 한번도 안해본 완전 초보인데;;; /output-style이 더이상 클로드에 사용 안되는데 강의에는 output-style 로 강의를 하시다보니 /config로 이제 사용해야 한다고 글로 설명은 해두셨지만 도통 이해가 안갑니다;;; 새로 영상 찍어줄 순 없나요?? 미션6 진행하면서 당최 output-style과 config를 어떻게 다르게 응용 해야하는지 감이 오질 않아 제대로 하고 있는지도 모르겠네요 잘 하고 있는건지 확인 바랍니다. 미션지에는 output-style 의 방식으로 explanatory를 기재해 두셨는데, 해당 내용은 현재 클로드에서 먹히지 않고 그럼 config explanatory라고 써야 하는건지;;; 제대로 진행 되고 있는건 아닌것 같은데 이미 클로드에선 작동 되지 않는 output-style을 강의와 미션에 언급 되어있다보니 생 초보 입장에선 어떻게 해라는건지;;; 모르겠네요
학습 관련 질문을 남겨주세요. 구체적으로 적을수록 좋아요! 마크다운과 단축키를 활용하면 글을 더 편하게 작성할 수 있어요. 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해보세요. 편하게 질문주세요:) 직접 답변 드리도록 하겠습니다~ 안녕하세요 강사님 유익한 강의 잘 듣고 있습니다! 구글폼을 통한 노션 링크를 24시간 후에도 못 받았는데 따로 이메일을 통해 직접 전달주시는건가요?
import java.lang.reflect.Field; class MyString { private byte[] sdata = null; MyString(MyString s) { this.sdata = s.sdata; } // 생성자 1: 문자열을 받을 때 MyString(String param) { this.setString(param); } // 생성자 2: 정수를 받을 때 MyString(int param) { setString(String.format("%d", param)); } // 데이터를 문자열로 반환 (null 체크 포함) public String getString() { if (sdata == null || sdata.length <= 0) { return "(null)"; } return new String(sdata); } // 데이터를 안전하게 복사해서 저장 (Deep Copy) public void setString(String param) { sdata = param.getBytes(); } } public class Main { public static void main(String[] args) throws Exception { MyString src = new MyString("Hello"); MyString dst = new MyString(src); Field field = MyString.class.getDeclaredField("sdata"); field.setAccessible(true); byte[] srcSdata = (byte[]) field.get(src); byte[] dstSdata = (byte[]) field.get(dst); System.out.println("src.sdata 주소: " + System.identityHashCode(srcSdata)); System.out.println("dst.sdata 주소: " + System.identityHashCode(dstSdata)); // 둘이 같은 숫자 → 같은 배열 가리킴 (얕은 복사 증명!) src.setString("world"); byte[] srcSdata2 = (byte[]) field.get(src); byte[] dstSdata2 = (byte[]) field.get(dst); System.out.println("--- setString 후 ---"); System.out.println("src.sdata 주소: " + System.identityHashCode(srcSdata2)); System.out.println("dst.sdata 주소: " + System.identityHashCode(dstSdata2)); // src는 새 주소, dst는 그대로 → 분리됨 확인! } } 원래 의도가 얕은 복사를 먼저 해봄으로서 사이드 이팩트 문제를 일으킨 다음, 깊은 복사를 시도해볼려고 했는데 위 코드를 실행해보시면 깊은 복사가 되는 것 처럼보이더군요. 그런데 알고보니, 의도대로 dst.sdata 배열의 주소값이 src.sdata 배열의 주소값으로 얕은 복사가 이뤄졌으며, getBytes() 함수 자체가 원래 String 객체의 데이터를 byte 배열로 새로 만들어서 해당 배열에 대한 주소값을 반환하는 함수다 보니, src.sdata 변수의 대상 인스턴스 주소 값이 새로운 바이트 배열에대한 주소값으로 바뀌어 버렸고, 기존 배열은 원래 gc에 의해 사라져야하는게 맞는데, dst.sdata에 src.sdata 배열의 주소값이 얕은 복사가 이뤄졌다보니, 기존 참조된 배열은 계속 참조되어 메모리 상에 남아있더라구요. 그렇다보니, src.sdata가 참조한 실질 배열 데이터는 dst.sdata에 얕은 복사해버리고, src.sdata 배열 본인은 새로운 배열 데이터로 갈아타다보니, 실질적으로는 src 객체의 문자열을 바뀌었다기 보단, 참조한 대상 자체가 바뀌다 보닌까 실질적으로는 처음 의도한 얕은 복사로 인한 사이트 이팩트 문제는 애초부터 발생하지 않는다 라는게 결론입니다. 따라서 주어진 실습 예제가 적절한지에 대해 한 번 고민해보았습니다. 혹시라도 제가 부족하거나 다르게 이해한 부분이 있을 시 지적해주시면 감사하겠습니다.