[Claude Code] Error: No suitable shell found. Claude CLI requires a Posix shell environment. Please ensure you have a valid shell installed and the SHELL environment variable set.
·
카테고리 없음
Claude code가 윈도우에서 기존엔 wsl2 환경에서만 사용이 가능했는데, 어제부터 git bash 환경에서도 사용이 가능하다해서 설치를 해보았다. Error: No suitable shell found. Claude CLI requires a Posix shell environment. Please ensure you have a valid shell installed and the SHELL environment variable set.다만 위와 같은 에러가 발생하였다. 먼저 경로 상 문제가 되는 line에 직접 찾아가본다. 아래와 같은 line에서 에러가 발생한다고 나와있다.C:/Users/유저명/AppData/Roaming/nvm/v22.15.0/node_modules/@anthropic-a..
Spring Boot 멀티모듈
·
카테고리 없음
서론현대의 소프트웨어 개발에서 애플리케이션의 복잡성은 지속적으로 증가하고 있다. 단일 모듈로 구성된 전통적인 모놀리식 아키텍처는 초기 개발 속도는 빠르지만, 프로젝트 규모가 커질수록 여러 한계점들이 드러나게 된다. 이러한 문제를 해결하기 위한 접근법 중 하나가 바로 멀티모듈 아키텍처이다.본 글에서는 Spring Boot 기반의 서버 개발 과정에서 적용한 멀티모듈 아키텍처의 설계 원칙과 실제 구현 사례를 통해, 멀티모듈 아키텍처의 장단점과 적용 방법을 상세히 분석해보고자 한다.멀티모듈 아키텍처란 무엇인가정의와 개념멀티모듈 아키텍처는 하나의 큰 애플리케이션을 기능적으로 독립적인 여러 모듈로 분리하여 구성하는 아키텍처 패턴이다. 각 모듈은 명확한 책임과 역할을 가지며, 모듈 간의 의존성은 명시적으로 정의된다...
vscode (cursor) Open Folder시 새 윈도우에서 열기
·
카테고리 없음
vscode에서 File -> Open Folder시 기존 윈도우에서 열리는 문제가 있어서 불편함이 있었다. vscode 설정에서 openFoldersInNewWindow를 검색한 후 on으로 바꿔주자!
Cursor에 playwright MCP 서버 연동
·
카테고리 없음
사전 준비 - 크로미윰 브라우저- Node.js Cursor IDE 실행F1을 눌러 Open MCP Settings 탭을 열어준다."Add new MCP server"를 클릭한다. .cursor/mcp.json를 아래와 같이 구성해준다.{ "mcpServers": { "playwright-mcp": { "command": "npx", "args": [ "-y", "playwright-mcp" ] } }} 잘 작동하는 모습을 볼 수 있다.
Claude desktop에 playwright MCP 서버 연결
·
카테고리 없음
아래와 같은 명령어로 playwright-mcp를 전역 설치해준다.npm install -g playwright-mcp 윈도우의 경우%APPDATA%\Claude\claude_desktop_config.jsonMac일 경우~/Library/Application Support/Claude/claude_desktop_config.json 잘 실행되는 모습을 볼 수 있다.
Cloudflare Email Routing과 Spring Boot 이메일 발송 구현하기
·
카테고리 없음
커스텀 도메인으로 이메일을 받고 보내는 시스템을 구축하는 방법에 대해 알아보겠습니다. 이 글에서는 Cloudflare Email Routing을 사용하여 커스텀 도메인의 이메일을 Gmail로 포워딩하고, Gmail과 Spring Boot를 설정하여 커스텀 도메인 이메일 주소로 이메일을 발송하는 방법을 단계별로 설명합니다.목차요구사항Cloudflare Email Routing 설정Gmail에서 커스텀 도메인 설정Spring Boot 이메일 발송 구현문제 해결결론 요구사항이 시스템의 주요 요구사항은 다음과 같습니다커스텀 도메인 이메일 주소(contact@yourdomain.com)로 보내진 이메일이 Gmail 계정으로 전달되어야 함Spring Boot 애플리케이션에서 보내는 이메일의 발신자 주소가 커스텀 ..
[jest-rest-docs] NodeJS 환경에서 통합 테스트 기반 문서화 (Swagger)
·
카테고리 없음
테스트 코드로 생성하는 API 문서화: jest-rest-docs 라이브러리 개발기배경개발 현장에서 API 문서화는 필수지만, 종종 우선순위에서 밀리거나 불완전하게 작성되는 경우가 많습니다. 저희 회사에서도 Swagger를 도입해 프론트엔드 개발자들이 API를 참고할 수 있도록 했지만, 실제로는 다음과 같은 문제점들이 있었습니다API 응답의 다양한 케이스에 대한 설명 부족파라미터의 자세한 설명이나 제약사항 누락개발이 진행됨에 따라 문서와 실제 API 간 불일치 발생무엇보다 문서 작성과 유지보수는 비용이 많이 드는 작업spring rest docs...?백엔드 개발자로서 API 개발 시 통합 테스트 코드를 꼼꼼히 작성하는 저에게 문득 떠오른 생각이 있었습니다. Spring 프레임워크에서는 이미 spring..
A param property was accessed directly with `params.id`. `params` is now a Promise and should be unwrapped with `React.use()` before accessing properties of the underlying params object. In this version of Next.js direct access to param properties is stil
·
트러블슈팅
NextJS 15버전을 사용 시 아래와 같은 에러가 발생 하였다. A param property was accessed directly with `params.id`. `params` is now a Promise and should be unwrapped with `React.use()` before accessing properties of the underlying params object. In this version of Next.js direct access to param properties is still supported to facilitate migration but in a future version you will be required to unwrap `params` with `..
NoSuchFieldError: Class org.opensearch.client.Requests does not have member field 'org.opensearch.core.xcontent.MediaType INDEX_CONTENT_TYPE'
·
트러블슈팅
AWS Opensearch를 사용해서 스프링부트 프로젝트에서 인덱싱을 하고자 하였으나 아래와 같은 에러가 발생하였다. NoSuchFieldError: Class org.opensearch.client.Requests does not have member field 'org.opensearch.core.xcontent.MediaType INDEX_CONTENT_TYPE' implementation("org.opensearch.client:opensearch-rest-high-level-client:2.9.0")implementation("org.opensearch.client:opensearch-java:2.11.1") 위와 같이 버전 불일치때문에 발생한 문제였어서 아래와 같이 버전을 통일시켜주니 문제가 ..
[JPA] 트랜잭션 save() 반영 안 되는 문제
·
트러블슈팅
문제 현상간단한 POST API 호출 이후 (회원가입) entity -> dto 변환 시 id가 반영되지 않는 문제가 발생하였다. @PostMapping() fun createMember(@Valid @RequestBody dto: SignupRequest): ApiResponse { val createdMember = memberService.createMember(dto) return ApiResponse.success(MemberResponse.from(createdMember)) } @Transactional fun createMember(dto: SignupRequest): Member { val member = Member( ..