묻고 답해요
163만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
테스트코드 junit5 java17
plugins { id 'java' id 'org.springframework.boot' version '3.5.5' id 'io.spring.dependency-management' version '1.1.7' }안녕하세요 테스트 코드 진행중 가짜객체를 선언하기 위해 @mock를 사용하려는데 자바17과의 충돌?로 계속해서 에러가 발생하는 상황입니다..!자바 버전 17에서 21로 변경, mockito 5.xx 최신 버전으로 변경해도 같은 에러에서 벗어나지못했습니다..밑에는 전체 에러입니다.ByteBuddy 버전도 올려서 빌드의존성 추가해봤는데도 안되네요> Task :compileJava UP-TO-DATE> Task :processResources UP-TO-DATE> Task :classes UP-TO-DATE> Task :compileTestJava> Task :processTestResources NO-SOURCE> Task :testClassesjava.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:85)at jdk.proxy3/jdk.proxy3.$Proxy16.isTypeMockable(Unknown Source)at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:78)at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:275)at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:236)at org.mockito.internal.MockitoCore.mock(MockitoCore.java:82)at org.mockito.Mockito.mock(Mockito.java:2198)at org.mockito.internal.configuration.MockAnnotationProcessor.processAnnotationForMock(MockAnnotationProcessor.java:79)at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:28)at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:25)at org.mockito.internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:44)at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:72)at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:62)at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:47)at org.mockito.MockitoAnnotations.openMocks(MockitoAnnotations.java:81)at org.mockito.internal.framework.DefaultMockitoSession.<init>(DefaultMockitoSession.java:43)at org.mockito.internal.session.DefaultMockitoSessionBuilder.startMocking(DefaultMockitoSessionBuilder.java:83)at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:160)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Caused by: java.lang.IllegalStateException: Internal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMakerat org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:105)at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.getDefaultPlugin(DefaultMockitoPlugins.java:79)at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:75)at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:49)at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:29)at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:26)at org.mockito.internal.MockitoCore.<clinit>(MockitoCore.java:71)at org.mockito.Mockito.<clinit>(Mockito.java:1777)at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:156)... 2 moreCaused by: java.lang.reflect.InvocationTargetExceptionat java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:103)... 10 moreCaused by: org.mockito.exceptions.base.MockitoInitializationException:Could not initialize inline Byte Buddy mock maker.It appears as if your JDK does not supply a working agent attachment mechanism.Java : 17JVM vendor name : Oracle CorporationJVM vendor version : 17.0.10+11-LTS-240JVM name : Java HotSpot(TM) 64-Bit Server VMJVM version : 17.0.10+11-LTS-240JVM info : mixed mode, sharingOS name : Windows 10OS version : 10.0at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<init>(InlineDelegateByteBuddyMockMaker.java:275)at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<init>(InlineByteBuddyMockMaker.java:23)... 13 moreCaused by: java.lang.IllegalArgumentExceptionat java.instrument/sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method)at java.instrument/sun.instrument.InstrumentationImpl.appendToBootstrapClassLoaderSearch(InstrumentationImpl.java:220)at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<clinit>(InlineDelegateByteBuddyMockMaker.java:175)... 14 moreInternal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMakerjava.lang.IllegalStateException: Internal problem occurred, please report it. Mockito is unable to load the default implementation of class that is a part of Mockito distribution. Failed to load interface org.mockito.plugins.MockMakerat org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:105)at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.getDefaultPlugin(DefaultMockitoPlugins.java:79)at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:75)at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:49)at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:29)at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:26)at org.mockito.internal.MockitoCore.<clinit>(MockitoCore.java:71)at org.mockito.Mockito.<clinit>(Mockito.java:1777)at org.mockito.junit.jupiter.MockitoExtension.beforeEach(MockitoExtension.java:156)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Caused by: java.lang.reflect.InvocationTargetExceptionat java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:103)... 10 moreCaused by: org.mockito.exceptions.base.MockitoInitializationException:Could not initialize inline Byte Buddy mock maker.It appears as if your JDK does not supply a working agent attachment mechanism.Java : 17JVM vendor name : Oracle CorporationJVM vendor version : 17.0.10+11-LTS-240JVM name : Java HotSpot(TM) 64-Bit Server VMJVM version : 17.0.10+11-LTS-240JVM info : mixed mode, sharingOS name : Windows 10OS version : 10.0at app//org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<init>(InlineDelegateByteBuddyMockMaker.java:275)at app//org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<init>(InlineByteBuddyMockMaker.java:23)... 13 moreCaused by: java.lang.IllegalArgumentExceptionat java.instrument/sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method)at java.instrument/sun.instrument.InstrumentationImpl.appendToBootstrapClassLoaderSearch(InstrumentationImpl.java:220)at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<clinit>(InlineDelegateByteBuddyMockMaker.java:175)... 14 more> Task :testAuthServiceTest > asd() FAILEDjava.lang.IllegalStateException at PluginLoader.java:85Caused by: java.lang.IllegalStateException at DefaultMockitoPlugins.java:105Caused by: java.lang.reflect.InvocationTargetException at Constructor.java:499Caused by: org.mockito.exceptions.base.MockitoInitializationException at InlineDelegateByteBuddyMockMaker.java:275Caused by: java.lang.IllegalArgumentException at InstrumentationImpl.java:-21 test completed, 1 failed> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/%EC%8A%A4%ED%94%84%EB%A7%81/Artrip/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 12s4 actionable tasks: 2 executed, 2 up-to-date
-
미해결그림으로 쉽게 배우는 네트워크
DNS 강의에서 hosts 파일 설정 부분 질문
제가 이전에 진행했던 프로젝트에서 hosts파일을 수정해 실제 운영하고 있는 도메인으로 접속해 아직 개발진행중인 코드를 테스트 했었는데 hosts파일만 수정해서 개발서버,스테이지서버, 운영서버를 왔다갔다 하는것이 정말 신기했었습니다. 그때는 어떤 원리로 동작하는지 모르고 우와 신기하다~ 하며 사용했었는데 이제야 이해가 가네요^^
-
미해결아바타 커뮤니티앱 만들기 (React Native Expo)
SafeAreaView 적용 기준 문의
아바타 만들기 /post 에는 글쓰기, 수정, 상세화면에 대한 정의가 되어 있습니다./post/[id].tsx/post/write.tsx/post/update/[id].tsx 글쓰기와 수정은 SafeAreaView를 적용하지 않았는데 상세보기에서 적용한 이유와 어떤 기준에 의해 적용하였는지 문의 드립니다./post/_layout.tsx 내에 Stack.Screen에서 headerShown : false일때 SafeAreaView를 적용하는걸로 생각했는데 그렇지 않은것 같습니다. 감사합니다.
-
미해결15일간의 빅데이터 파일럿 프로젝트
수강 기간 연장 부탁드립니다ㅠ
안녕하세요! 강의 구매후 실력이 되지않아 엄두를 못내다가 수강기간 만료가 도래했어요ㅠㅠ 새로 맡은 프로젝트에 꼭 필요한 내용이라 공부를 시작해야하는데 며칠 남지를 않아 버렸네요. 강사님 죄송하지만 최대한 연장 부탁드려도 될까요? 열심히 공부하겠습니다!!
-
미해결빅데이터 파이프라인 마스터; 성공을 위한 도구와 기술
강의 pdf는 따로 제공안해주시는 건가요?
아래와 같은 양식으로 질문을 남겨주세요 🙂수업을 들으시면 이해하기 어려운 부분이 있으면 상세히 질문을 남겨주세요.서로 Tone and Manner 를 지키며, 즐거운 수업 시간을 만들어보아요.잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의 pdf가 없는거 같은데 따로 제공해주시지는 않나요? 강의 들을 때 있으면 더 도움될거 같아서 질문드립니다
-
미해결기초 탄탄! 독하게 시작하는 Java - Part 1 : 절차적 프로그래밍
스크립트 논리곱 설명이 틀린것 같네요
코드 설명하실때는 옳게 설명하셨는데 스크립트랑 내용이 다릅니다.
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
query 자동완성이 불가한 상황입니다.
현재 시놀로지 도커환경이구요. SSL까지는 문제가 없었습니다. 스크립트가 다른것 같아서 올려주신 자료로 다시 올리고 따라해봤지만 http request 설정중 query 부분의 공백을 처리할 방법이 없습니다.ai도움을 받아가면서 어찌어찌 따라는 가는데 이넘때문에 5시간째 헤메고 있네요 ㅠㅜ포기는 없다!힌트좀 주세요.
-
미해결모의해킹 실무자가 알려주는, XSS 공격 기법
저는 왜 xss 실행이 안될까요?
버프로 확인하면 위 처럼 출력 됩니다.<script>a/**/lert(1/**/)</script>를 입력하였습니다. 브라우저에서는 위 사진처럼만 출력되고 xss 발동이 안되고 있습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
질문있습니다!
다른방법으로 풀어서 질문드립니다.지우는 노드부터 자식으로 내려가서면서 dfs를 돌리며 visited를 체크 했습니다.너무 비효율적인지? 아니면 이렇게 해도 될지 알려주시면 도움이 될것 같습니다! http://boj.kr/79ae7d2c251d458fa1560fcb789af4ae
-
미해결[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
react-native-screens 버전 호환 문제
버전 호환 문제 현재 강의 흐름대로 react-native 0.79.4 버전을 깔고 이 강의에서 npm install @react-navigation/native과npm install react-native-screens react-native-safe-area-context를 그대로 실행해서 설치하면npx pod-install ios Need to install the following packages: pod-install@1.0.9 Ok to proceed? (y) y 🔍️ Scanning for pods... 1.16.2 > pod install Found 2 modules for target mapzip2 link_native_modules! {:ios_packages=>[{:configurations=>[], :name=>"react-native-safe-area-context", :root=>"/Users/kwakori/projects/react-native/learning/mapzip2/node_modules/react-native-safe-area-context", :path=>"../node_modules/react-native-safe-area-context", :podspec_path=>"/Users/kwakori/projects/react-native/learning/mapzip2/node_modules/react-native-safe-area-context/react-native-safe-area-context.podspec", :script_phases=>[]}, {:configurations=>[], :name=>"react-native-screens", :root=>"/Users/kwakori/projects/react-native/learning/mapzip2/node_modules/react-native-screens", :path=>"../node_modules/react-native-screens", :podspec_path=>"/Users/kwakori/projects/react-native/learning/mapzip2/node_modules/react-native-screens/RNScreens.podspec", :script_phases=>[]}], :ios_project_root_path=>"/Users/kwakori/projects/react-native/learning/mapzip2/ios", :react_native_path=>"../node_modules/react-native"} Auto-linking React Native modules for target mapzip2: RNScreens and react-native-safe-area-context Framework build type is static library Configuring the target with the New Architecture [!] Invalid Podfile file: [!] /opt/homebrew/bin/node ./../node_modules/react-native/scripts/generate-codegen-artifacts.js -p /Users/kwakori/projects/react-native/learning/mapzip2/ios/.. -o /Users/kwakori/projects/react-native/learning/mapzip2/ios -t ios [Codegen] Analyzing /Users/kwakori/projects/react-native/learning/mapzip2/package.json [Codegen] Searching for codegen-enabled libraries in the app. [Codegen] The "codegenConfig" field is not defined in package.json. Assuming there is nothing to generate at the app level. [Codegen] Searching for codegen-enabled libraries in the project dependencies. [Codegen] Found react-native [Codegen] Found react-native-safe-area-context [Codegen] Found react-native-screens [Codegen] Searching for codegen-enabled libraries in react-native.config.js [Codegen] Processing FBReactNativeSpec [Codegen] Searching for podspec in the project dependencies. [Codegen] Processing rncore [Codegen] Searching for podspec in the project dependencies. [Codegen] Processing safeareacontext [Codegen] Searching for podspec in the project dependencies. [Codegen] Supported Apple platforms: ios, macos, tvos, visionos for safeareacontext [Codegen] Processing rnscreens [Codegen] Searching for podspec in the project dependencies. [Codegen] Supported Apple platforms: ios, tvos, visionos for rnscreens [Codegen] Error: Unknown prop type for "environment": "undefined" [Codegen] Done. . # from /Users/kwakori/projects/react-native/learning/mapzip2/ios/Podfile:20 # ------------------------------------------- # > use_react_native!( # :path => config[:reactNativePath], # ------------------------------------------- Couldn't install Pods. Updating the Pods project and trying again...와 같은 에러가 발생합니다.아무래도 버전 호환성 문제인 것 같습니다.https://github.com/software-mansion/react-native-screens/blob/main/README.md#support-for-fabric위 문서를 참고하면 react-native-screens의 최신 버전인 4.19.0+ 는 react-native 0.81.0+ 에서만 호환된다고 하는 것 같습니다. 강의 들으시는 분들은 참고해주세요. 버전을 낮춰서 설치하시거나 하시면 정상적으로 설치되더라구요//아니면 혹시 그냥 react-native를 0.81.0+ 로 설치해서 강의를 들어도 문제없으려나요?
-
미해결Flutter로 웹 서비스 개발하기 (1) - Responsive Web
SEO에 대해
안녕하세요.우선 강의 정말 잘 수강했습니다. https://pub.dev/packages/flutter_seo해당 커뮤니티를 보다가 댓글에서 해당 패키지를 찾게되었고강사님도 해당 seo패키지를 사용해서 seo적용을 하신것같은데,지금 배포된 샐링잇 웹사이트도 해당 seo패키지만을 적용해서 배포를 하신건지 궁금합니다. 그러면 기존 웹사이트 seo만큼은 아니지만, 저 패키지를 적용하면 회사이름(고유명사) 정도는 구글에 치면 나올 정도로는 적용을 할 수 있는건지 궁금합니다.
-
해결됨PCB HW설계 실무 : STM32를 활용한 Mixed-signal 보드 설계 프로젝트
과제 수행과정에 있어서 질문드립니다.
안녕하세요. 강의 잘 듣고 있습니다.강의를 수강하면서 과제 및 개인 프로젝트 진행 방식에 대한 몇 가지 질문이 있어 문의 드립니다. 과제 수행 이전 단계에서, 현재 제공된 강의 영상 내용을 끝까지 모두 수강하며 그대로 따라 하면 PCB 회로도 및 레이아웃 완성본까지 완성되는 구조인지, 아니면 강의 내용을 이해한 뒤 수강자가 추가적인 설계를 수행해야(과제) 최종 PCB가 완성되는 구조인지 궁금합니다. 학습 효율 측면에서 강의 영상을 먼저 전부 수강, 실습한 이후, 그 내용을 바탕으로 개인 과제를 과제 순서에 맞춰 PCB 레이아웃까지 진행하는 방식과 강의 내용을 참고하면서 과제와 유사한 내용으로 병행하여 설계,과제를 진행하는 방식 중 어떤 방식이 더 적절한지 강사님의 권장 방식을 알고 싶습니다. 개인 과제로는 ATMEGA328P-PU 기반의 맞춤혀여 Arduino 호환 보드를 설계하여, 이륜 로봇 제어용으로 사용하고 라즈베리 파이와 통신하는 PCB 제작을 고려하고 있습니다. 이와 관련하여 수업에서 진행되는 설계 흐름과 유사한 방식으로 해당 개인 과제 보드를 설계해나가면 무리가 없는지 여쭤보고싶습니다. 즉 강의에서 제시된 예제를 확장하는 것이 아니라 설계 접근 방식과 절차를 개인 보드에 적용하는 형태의 과제 수행이 가능한지 여쭤보고싶습니다. 긴 질문 읽어주셔서 감사합니다.
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지 (with 커서 AI)
interactive Question 기능 질문
안녕하세요 짐코딩님 덕분에 좋은 기능 배우고 있습니다! 일단 윈도우11서 claude code의 pro 이용을 하고 있습니다. 다름 아니라, 계획 검토 및 수정 요청 부분이 궁금해서 질문드립니다...! 저 같은 경우, 처음부터 interactive Question 기능이 나오는 것을 봤을 때, 이 기능이 default인 거 같더라고요근데 계획을 다 보고, 계획 내용을 수정하고 싶은데, 따로 수정사항을 요청하는 선택지는 없고,esc를 누르면 아예 취소가 되서 미션 중의 3단계를 어떻게 할 수 있을지 궁금해서 질문드립니다!
-
미해결쉽게 설명하는 AWS 기초 강의
개인 블로그에 올려도되나요?
안녕하세요혹시 강의 PDF 일부 캡처본(1~2개정도)를 학습 기록용 블로그에 올려도 되는지 궁금합니다
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
LIS 질문있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Q) LIS 알고리즘이 코딩 테스트에서 자주 사용되는 알고리즘인가요? 실전 코딩 테스트 경험이 적어서 그럴 수 있지만, 이거 LIS로 풀어야겠다 하고 문제 풀이를 들어간 경험이 없어서요. 그냥 알아두면 좋은 알고리즘이라고 생각하고 공부하고 있습니다.
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지 (with 커서 AI)
mcp 서버 설치 질문
claude mcp add --transport http paypal --scope project https://mcp.paypal.com/mcpAdded HTTP MCP server paypal with URL: --scope to local configFile modified: /Users/tkstart/.claude.json [project: /Users/tkstart/Desktop/development/claude-code-mastery]스코프를 프로젝트로 설정하고 명령어를 입력하는데보시는 바와같이 글로번 환경에 .claude.json에 "프로젝트 루트" 키로 우리가 잘아는 mcp 설정 값이 들어갑니다...공식문서에서도 여전히 .mcp.json을 생성한다고 작성되어있는데요, v2.1.2(질문 작성 시점 최신버전)에서는 작동방식이 변경되었나봅니다...이러면 팀원들이랑 공유가 안되는거 아닌가요...?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
더미 클라이언트 수에 따른 OnDisconnect 발생
상황은 다음과 같습니다.100개의 클라이언트 생성했을 때까지는 문제 없는데, 그 보다 더 많은 클라이언트 (ex 200, 500)개로 늘렸을 때 문제입니다.현재 500개까지 실행했을 때도 500개에대한 OnConnected가 호출되었습니다.그러다 시간이 좀 지나면 클라이언트와의 연결이 점차 끊겨서 OnDisconnected가 발생합니다. 디버그 했을 때 ClientSession의 OnDisconnected가 호출되었고 스택을 확인했을 때 ClientSession의 OnReceiveCompleted에서 args.BytesTransferred가 0이어서 Disconnect()가 호출되더라구요.컴퓨터 스펙이 라이젠 7 9800X3D에 렘 96기가여서 컴퓨터 성능 문제는 아닌거같고 뭔가 놓친게 있는거같은데 잘 모르겠네요..
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지 (with 커서 AI)
커서 UI가 강의내용과 다릅니다.
캡쳐사진과 같이 강의내용과 커스 UI가 다릅니다.그리고 저는 ctrl+esc를 눌러도 claude code가 동작하지 않습니다. 클로드코드는 정상적으로 설치하여 이전 미션까지 완료했습니다. 어떻게 해결하면 좋을까요?
-
미해결[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
소스 코드 요청
안녕하세요혹시 소스 코드 따로 제공 받을 수 있을까요?매번 동영상에서 필요한 내용 찾는 게 조금 힘드네요.가능하시면 아래 메일로 보내주셔도 되고, 다른 링크가 있으면 공유 부탁드립니다.mungchi1992@gmail.com
-
해결됨[매일 완독 챌린지] 저자와 함께하는 <FastAPI로 기획에서 출시까지>
patch 요청시 payload가 넘어가지 않습니다.
아래 두 요청 코드에서 patch 요청 시 payload가 엔드포인트 함수에서 None으로 잡혀 model_dump()에서 오류가 발생합니다. 원인을 잘 모르겠습니다.[오류][요청 코드]@pytest.mark.parametrize("payload", [ {"display_name": "푸딩캠프"}, {"email": "hannal@example.com"}, {"display_name": "푸딩캠프", "email": "hannal@example.com"}, ]) async def test_사용자가_변경하는_항목만_변경되고_나머지는_기존_값을_유지한다( client_with_auth: TestClient, # 인증을 받은 클라이언트 payload: dict, # 클라이언트 요청 페이로드 host_user: User, # 클라이언트 사용자 ): # 현재 사용자 정보를 보관한다. before_data = host_user.model_dump() response = client_with_auth.patch("/account/@me", json=payload) # (...)async def test_비밀번호_변경_시_해싱_처리한_비밀번호가_저장되어야_한다( client_with_auth: TestClient, host_user: User, db_session: AsyncSession, ): before_data = host_user.hashed_password payload = { "password": "new_password", "password_again": "new_password", } response = client_with_auth.patch("/account/@me", json=payload) # (...)[엔드포인트]@router.patch("/@me", response_model=UserDetailOut) async def update_user( user: CurrentUserDep, session: DbSessionDep, payload: UpdateUserPayload = Body(...), ) -> User: updated_data = payload.model_dump(exclude_none=True, exclude={"password", "password_again"}) stmt = update(User).where(User.id == user.id).values(**updated_data) await session.execute(stmt) await session.commit() await session.refresh(user) return user [스키마]class UpdateUserPayload(SQLModel): display_name: str | None = Field(default=None, min_length=4, max_length=40) email: EmailStr | None = Field(default=None, max_length=128) password: str | None = Field(default=None, min_length=8, max_length=128) password_again: str | None = Field(default=None, min_length=8, max_length=128) @model_validator(mode="after") def check_all_fields_are_none(self) -> Self: if not self.model_dump(exclude_none=True): raise ValueError("최소 하나의 필드는 반드시 제공되어야 합니다.") return self @model_validator(mode="after") def verify_password(self) -> Self: if self.password is not None or self.password_again is not None: # 둘 중 하나라도 들어오면 둘 다 있어야 함 if not self.password or not self.password_again: raise ValueError("비밀번호 변경 시 password와 password_again을 모두 제공해야 합니다.") if self.password != self.password_again: raise ValueError("비밀번호가 일치하지 않습니다.") @computed_field @property def hashed_password(self) -> str | None: if self.password: return hash_password(self.password) return None[픽스처]@pytest.fixture(autouse=True) async def db_session(): dsn = "sqlite+aiosqlite:///:memory:" engine = create_async_engine(dsn) async with engine.begin() as conn: await conn.run_sync(SQLModel.metadata.drop_all) await conn.run_sync(SQLModel.metadata.create_all) session_factory = create_session(engine) async with session_factory() as session: yield session await conn.run_sync(SQLModel.metadata.drop_all) await engine.dispose() @pytest.fixture() def fastapi_app(db_session: AsyncSession): app = FastAPI() include_routers(app) async def override_use_session(): yield db_session app.dependency_overrides[use_session] = override_use_session return app @pytest.fixture() async def host_user(db_session: AsyncSession): user = account_models.User( username="puddingcamp", hashed_password=hash_password("testtest"), email="puddingcamp@example.com", display_name="푸딩캠프", is_host=True, ) db_session.add(user) await db_session.flush() await db_session.commit() return user @pytest.fixture() def client_with_auth(fastapi_app: FastAPI, host_user: account_models.User): payload = LoginPayload.model_validate({ "username": host_user.username, "password": "testtest", }) with TestClient(fastapi_app) as client: response = client.post("/account/login", json=payload.model_dump()) assert response.status_code == status.HTTP_200_OK auth_token = response.cookies.get("auth_token") assert auth_token is not None client.cookies.set("auth_token", auth_token) yield client