revalidatePath("/about", "page") 로 설정을 하고 테스트를 하다 보면 /about 페이지에서 재검증 버튼을 누르면 AboutLayout의 데이터 패칭 결과와 AboutPage의 데이터 패칭 결과가 함께 바뀌는 것과, /about/detail 페이지에서 재검증 버튼을 누르면 아무런 변화도 없는 이유가 revalidatePath의 첫 번째 인자로 설정된 "/about" 이 아닌 /about/detail 페이지에 접속해 있기 때문이라는 것까지는 이해했습니다. 하지만 detail 페이지에서 재검증을 누르고 about 페이지로 이동하면 즉시 AboutPage의 결과는 변하는데 AboutLayout의 결과는 변하지 않는데 이유가 뭔가요?
안녕하세요 너무 쉽게 설명해주셔서 프론트 왕초보인 저도 아주 잘 따라가면서 강의를 듣고있습니다 ! 이번 파트에서 한가지 의문인점은 저는 예전에 백엔드 서버를 구축할때 소셜로그인이 성공하면 백엔드 내에서 access 와 refresh 토큰을 만들어내서 refresh 를 쿠키형식으로 넘긴 후 소셜로그인 성공 리다이렉트를 바로 access token을 발급받을수있는곳으로 리다이렉팅시켜서 access를 추가적으로 받게끔 구축했었는데, 이번 파트에서 의문인점은 보통 실무에서는 백엔드가 자체적으로 만드는 access refresh 토큰이 아니라 소셜서버자체에서 제공하는 access 와 refresh를 주로 활용하는걸까요 ?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Delivery에 있는 @OneToOne(mappedBy = "delivery", fetch = LAZY) private Order order; 에서 인텔리제이가 fetch = LAZY에 노란줄이 떠서 확인해보니 Specifying FetchType.LAZY for the non-owning side of the @OneToOne association will not affect the loading. The related entity will still be loaded as if the FetchType.EAGER is defined. 이런 메세지가 뜹니다. 찾아보니 Lazy를해도 Eager로 동작한다는 거 같은데.. 실제로 테스트를 해보니 Eager로 동작 하고 있어서 여기에 OneToOne인데 lazy로 동작해도 상관없는걸까요?? 아니면 제가 어떤걸 놓친건지 궁금합니다
현재 agent를 사용하게 되면 프로젝트 내에 다음과 같은 MEMORY.md가 생깁니다. 혹시 깃으로 관리를 할 때 이 MEMORY.md는 gitignore에 추가해야할까요?? 생성된 메모리 문서 경로. D:\Repository\apiProject\.claude\agent-memory\prd-prompt-engineer\ MEMORY.md 그리고 추가 내용 너무 좋습니다!! 감사합니다!!!
설치 후 /init 을 하고 싶어도 치면 ⏺ There's an issue with the selected model (claude-haiku-4-5-20251001). It may not exist or you may not have access to it. Run /model to pick a different model. 이렇게 나옵니다. 그래서 /model 로 들어가서 설정하고 나와도 계속 동일하고 /status 로 확인하면 Session ID: 927e74e0-a560-4124-893b-d65a898a3c23 cwd: /Users/happycho/Desktop/myproject/LLM/claude-code-example Login method: Claude Pro Account Organization: windlikephoto@gmail.com 's Organization Email: windlikephoto@gmail.com Anthropic base URL: http://localhost:11434 Model: haiku (claude-haiku-4-5-20251001) IDE: ✘ Error installing Cursor extension: 1: Command failed with ERR_STREAM_PREMATURE_CLOSE: cursor --force --install-extension anthropic.claude-code Premature close Please restart your IDE and try again. Memory: Setting sources: User settings 이런식으로 나오고 있습니다. 익스텐션도 설치를 다 했는데 왜이러는지 모르겠습니다ㅠㅠ...
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/ [질문 내용] 강사님께서 주문 내역에 대한 데이터면 이제 주문(orders) 테이블을 기준으로 하는것이 좋겠다 정도는 이제 느낌이 올거에요 라고 하셨는데 전혀 느낌이 오지않아서 흑흑... 제가 생각하기엔 ~에 대한 [고객 데이터]이니까 users가 주인공이여서 그걸 기준으로 잡는다고 생각했는데요 ~ 에 대한일때 ~물결표시있는 부분을 기준으로 잡아야하나요?
[질문 내용] 여기에 질문 내용을 남겨주세요. { private final Random random = new Random(); private int[] lottoNum; private int count; public int[] generate() { lottoNum = new int[6]; count = 0; while (count < 6) { //1-45 숫자 생성 int num = random.nextInt(45) + 1; //중복 제거 필요 if (isUnique(num, count)) { lottoNum[count] = num; count++; } } return lottoNum; } public boolean isUnique(int num, int count) { if(lottoNum[count]==num){ return false; } else {return true;} } } isUnique 메서드를 이렇게 작성하면 중복제거가 안 되는 이유가 뭘까요
안녕하세요. Task 관리 질문 드립니다. 강의에서 알려주신 shrimp-task-manager 굉장히 잘 쓰고 있습니다! 결국 context의 한계에 의해 AI가 멍청해지는 것을 회피하는 방향으로 Task를 분리하고, 각 Task 간 작업 내용의 요약본을 참조하는 방향으로 진행해야 굉장히 정확한 결과물을 얻을 수 있다는 것을 깨닫고 있는데요, 1) 강의를 완료한 이후에 더 좋은 Task Manager를 보신 적이 있다면 추천해주시면 감사하겠습니다. 2) shrimp-task-manager 소개 강의 이후에 Skill이 도입되었는데, Task 관리를 위한 Skill이 있다면 공유해주시면 감사하겠습니다. (키워드만 알려주셔도 좋습니다.) 특정 도메인 개발에 한정된 것이 아닌 굉장히 범용적인 목적으로 사용할 수 있었으면 좋겠습니다. 감사합니다!
여기( https://github.com/microsoft/playwright-mcp) 에서 claude code 를 선택후 명령어로 설치 하였습니다. playwright mcp 설치하여 아래와 같이 json 파일이 생성되었습니다. 그리고 claude 를 재실행 하였더니, 강의와 같이 mcp선택에 대한 것은 없고 /doctor 를 실행해 보라는 경고 문구만 있습니다. 아래 이미지와 같이요. scope 를 없이설치도 해보고, project 로도 해보고, 강의에서 나온 인자로 다 해봤는데요. 아무리 claude 재실행 해도 안됩니다. 뭐가 잘못 된 걸까요? window, vscode(terminal) 로 작업중입니다. 답변 부탁 드립니다.
MISSION 5 까지 어찌어찌 마무리 했는데 다끝나고 보니깐 폴더에 INDEX.html 하나 결과물로 나오긴했는데요. 그 전 강의에서는 /init 명령어를 통해 Claude.md 파일도 생성하고 Memory.md 파일도 생성되고 했던거 같은데 이런 파일들이 하는 역할은 대략적으로 알 것 같긴 한데 언제 생성해야 되는지 감이 잘안잡혀요 ㅜㅜ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 접근제어자 - 쇼핑카트 문제에서 장바구니 상품출력 메서드인 displayItems()와 전체 가격 합을 구하는 calculateTotalPrice() 이거로 나누셨는데, 나누는 이유는 유지보수(나중에 소스 수정) 하기에 좋아서 나누셨겠죠? 근데 만약 안나눈다고 가정한다면.. 이런식으로 한 메서드 안에 넣어도 되는 것인지 궁금합니다. 실행 결과는 똑같이 나옵니다. 감사합니다.
안녕하세요. 좋은 강의 잘듣고 많이 배우고 있습니다. 좋은 강의 만들어주셔서 감사합니다. 다름이 아니라, 어댑터에서 엔티티에 의존성을 가지는 것이 크게 문제되지 않는다고 말씀주신 내용에 의문이 있어 질문드립니다! 어댑터에서 도메인에 직접 의존하는 것을 막기 위해서 변환 역할을 하는 매퍼 클래스나 DTO에서 엔티티를 자기 자신으로 변환하는 로직을 가지는 것은 어떨까요? 타이트하게 룰을 잡는 케이스를 가정한다면, application layer 내부에 port가 존재할 것이고 이 port에서 return 하는 dto도 application layer일 것이고, 이 dto 안에서 Entity를 받아서 자기 자신으로 변환하는 로직을 가진다면 entity가 application 밖으로 나가지 않을 수 있지 않을까요? (controller, repository 등 마찬가지입니다) 그리고 dto를 application에서 변환하는 것이 로직의 침투라고 표현하시기도 했는데, 그렇다면 provided port 역시 어댑터의 요구가 침투하는 구조라고 볼 수도 있을 것 같기도 합니다.. (생각해보니 이상적으로는 계층별로 DTO를 생성하는게 맞다고 생각은 들지만, "엔티티를 반환하는 트레이드오프가 굉장히 효율적이고 정당하다"라고 말씀하신 것 같다고도 생각이 듭니다) 강의에서 항상 기술이 등장한 배경과 사상을 이해하고, 이를 바탕으로 정당하게 규칙을 스스로 정하는 것을 강조하시는 것 같습니다. 그래서 강의에서 말씀하신 내용이 비슷한 맥락으로, "절대 노출되면 안된다"라는 것에 대한 반박이라고 받아들여지긴 합니다만.. 그래도 바깥쪽으로 노출하지 않는 것이 의존성 관리 차원에서 더 좋지 않을까하는 생각에 질문드립니다!
안녕하세요 영한님!! 항상 좋은 강의 만들어주셔서 감사합니다! 함수 기반 인덱스 생성에서 질문이 있어서 글을 남깁니다! 강의를 들으면서 함수 기반 인덱스를 생성하면 가상 컬럼이 없고, 인덱스만 만들어진다고 이해했습니다. 그래서 product_json 테이블에 만들어진 가상 컬럼과 idx_v_storage 인덱스를 drop한 다음 각각 두가지 방식으로 테스트를 해보았는데요 CREATE INDEX idx_func_storage ON product_json (( CAST(attributes->'$.storage' AS UNSIGNED))); EXPLAIN SELECT * FROM product_json WHERE attributes->'$.storage' = 256; 이렇게 할 경우엔idx_func_storage 인덱스를 잘 타는 걸로 나왔지만, CREATE INDEX idx_func_storage ON product_json ((JSON_VALUE(attributes, '$.storage' RETURNING UNSIGNED))); EXPLAIN SELECT * FROM product_json WHERE attributes->'$.storage' = 256; 이 경우에는 FULL TABLE SCAN 이 되고, 인덱스도 NULL로 나왔습니다. 두 방식 모두 각각 idx_func_storage 인덱스는 잘 생성이 되었는데도 JSON_VALUE() 방식에서는 인덱스를 사용하지않았습니다 그래서 AI에게 물어보니 MySQL functional index는 WHERE절의 표현식이 인덱스 정의와 문자 수준으로 동일해야 한다. 이유는 가상 컬럼 방식에서는 MySQL이 내부적으로 expression rewrite 과 virtual column substitution를 더 적극 수행하지만 functional index는 표현식 exact match 요구가 훨씬 엄격하기 때문이다. CREATE INDEX idx_func_storage ON product_json ((CAST(attributes->'$.storage' AS UNSIGNED))); 이렇게 인덱스를 생성했다면 EXPLAIN SELECT *FROM product_json WHERE CAST(attributes->'$.storage' AS UNSIGNED) = 256; 이렇게 WHERE 절을 작성해야 하고 CREATE INDEX idx_func_storage ON product_json ((JSON_VALUE(attributes, '$.storage' RETURNING UNSIGNED))); 이렇게 인덱스를 생성했다면 EXPLAIN SELECT * FROM product_json WHERE JSON_VALUE(attributes, '$.storage' RETURNING UNSIGNED) = 256 이렇게 WHERE 절을 작성해야 한다고 답변해주었는데요! 이렇게 각각 테스트 해보면, 인덱스를 잘 타는 것으로 나옵니다..! 또한 CAST()로 인덱스를 생성한 경우 WHERE절에 JSON_VALUE()를 사용한 쿼리는 Index를 사용하지않고, FULL TABLE SCAN을 했으며, JSON_VALUE()로 인덱스를 생성한 경우 WHERE절에 JSON_VALUE()를 사용했을 경우에만 Index를 사용했습니다. 제 테스트에서는 CAST() 기반 인덱스는 WHERE절 축약 표현식에서도 인덱스를 사용하였고, WHERE절 JSON_VALUE()는 인덱스를 사용하지 않았습니다. JSON_VALUE() 기반 인덱스에서는 WHERE절에 동일한 JSON_VALUE() 표현식을 사용했을 경우에만 인덱스를 사용하는 것으로 보였습니다 이게 맞는 걸까요? 아니면 제가 잘못 확인한 걸까요?, 또한 functional index 매칭 규칙 실제 범위가 어디까지 인지? AI가 답변해준 동작 방식이 맞는 건지도 여쭤보고 싶습니다! (제 MySQL버전이 8.0.41이네요,,) 영상을 다시 잘 보니, 2:18 분에 idx_func_storage 인덱스를 CAST() 구문으로 생성하시고, 2:25분에 확인하실 때, EXPLAIN의 결과에서 idx_v_storage인덱스가 나오긴 합니다!