묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨Practical Testing: 실용적인 테스트 가이드
Mock & Stub 에 대한 이해
두 가지 궁금증이 생겨 질문드립니다!!Mock과 Stub에서 혼란을 느끼는지?Mock & Stub 에 대한 이해를 하였는지? // OrderTest.java import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class OrderTest { @Test void 주문_총_금액을_계산한다() { Product apple = new Product("사과", 1000); Product banana = new Product("바나나", 2000); Order order = new Order(); order.addProduct(apple); order.addProduct(banana); assertEquals(3000, order.totalPrice()); } }// OrderTest.java import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; public class OrderTest { @Test void 주문_총_금액을_계산한다_Product_Mock_사용() { Product apple = mock(Product.class); Product banana = mock(Product.class); when(apple.getPrice()).thenReturn(1000); when(banana.getPrice()).thenReturn(2000); Order order = new Order(); order.addProduct(apple); order.addProduct(banana); assertEquals(3000, order.totalPrice()); } } 두 테스트에서 생각을 정리하다 보니 저는 마틴 파울러의 test double의 stub 과 mock 에 대한 개념보다TTD or BDD 스타일의 테스트 코드를 작성하다가 테스트의 편의성을 위해 Mokito을 통한 Mock 테스트를 먼저 접하게 된 후 마틴 파울러의 test double의 개념을 접하게 되었습니다. 마틴 파울러의 Mock 과 Stub 테스트에서 혼란스러운 이유테스트 코드를 작성하다보면 자연스럽게 then에 해당하는 부분은 대부분 상태(값)을 검증하는 테스트를 위주로 테스트 코드를 작성하게 되는거 같습니다.주문_총_금액을_계산한다() -> 단위 테스트로 상태(값)을 검증주문_총_금액을_계산한다_Product_Mock_사용() -> 나는 Mockito의 mock 테스트로 상태(값)을 검증 test doublestub -> 상태(값) 검증mock -> 행동 검증위 와 같이 상태(값)을 검증하는 테스트를 하다보니 stub 테스트와 Mockito 의 mock을 사용한 테스트을 동일시 보게 된거같습니다.Mockito의 mock 테스트의 개념과 test double의 mock 테스트가 동일한 개념이 아니다. Mokito의 mock을 사용하여 상태(값)을 검증하는 테스트를 하다보니 test double의 stub 테스트를 Mock 테스트 하였다라고 생각한게 아닌가? 테스트 케이스 stub 과 mock 테스트 구별하기주문_총_금액을_계산한다()해당 테스트는 실제 객체를 이용하여 상태(값)에 대한 검증을 한다. -> Stub 테스트주문_총_금액을_계산한다_Product_Mock_사용()해당 테스트는 Product 를 Mock 하여, order의 totalPrice 을 검증 한다. -> Mock?, Stub? 주문_총_금액을_계산한다_Product_Mock_사용()를 어떻게 바라 볼 것인가?test double의 mock 테스트를 준비 하였지만 검증 부분을 잘못하였다. test double의 stub 테스트를 실제 객체가아닌 가짜객체로 테스트 하였다.@Test void 주문_총_금액을_계산한다_Product_Mock_사용() { // given Product apple = mock(Product.class); Product banana = mock(Product.class); when(apple.getPrice()).thenReturn(1000); when(banana.getPrice()).thenReturn(2000); Order order = new Order(); order.addProduct(apple); order.addProduct(banana); // when int total = order.totalPrice(); // then verify(apple).getPrice(); // apple.getPrice()가 호출되었는지 검증 verify(banana).getPrice(); // banana.getPrice()가 호출되었는지 검증 }주문_총_금액을_계산한다_Product_Mock_사용()를 위와 같이 수정한다면 test double에서 이야기하는 mock 테스트이지 않을까 생각이 듭니다. 물론 모든 테스트를 test double의 Mock, Stub 테스트라는 틀에 맞춰 작성해한다는 아니라고 생각이 듭니다.주문_총_금액을_계산한다_Product_Mock_사용()가 마틴 파울러가 이야기하는 test double의 개념에서 어떻게 생각해 볼 것인가? 에대한 궁금증 우빈님의 생각이 궁금하기도 합니다. 제가 잘 이해를 하였는지 확인이 필요하여 질문드립니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
안녕하세요 이것이 내부호출 예제가 맞는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]// 인증 번호 확인@Transactionalpublic void confirmAuthenticationInfo(AuthenticationRequest.Confirm request){MemberCertificationHistory history = findById... // 엔티티 조회...validateExpiration(history);...}// 만료 일시 검증@Transactionalprivate void validateExpiration(MemberCertificationHistory history){if(history.isExpired()){processExpiration(history); // 만료 처리 . 트랜잭션 분리throw new ServerException("만료됨"...);}}// 인증 정보 만료 처리@Transactional(propagation = Propagation.REQUIRES_NEW)private void processExpiration(MemberCertificationHistory history){history.getMemberCertificationInfo().processExpiration();memberCertHisRepository.save(history); // 엔티티 저장}안녕하세요 위 코드에서 궁금한점이 있는데 내부호출에 관한 내용인지 질문드립니다.간단하게 confirmAuthentication() , validateExpiration() , processExpiration() 3가지 메서드가 있는상황이구, 차례로 호출하며 validateExpiration()에서 throw를 던지는 상황입니다. 문제는validateExpiration()를 내부에서 트랜잭션이 분리 처리(REQUIRES_NEW)되어 있는 processExpiration()를 타게되고, processExpiration()는 분리된 트랜잭션이니 .save()를 통해 저장이되고, 다시 validateExpiration()으로 돌아와 throw를 처리하게 되어 processExpiration()에서 저장된것은 롤백되지 않을것으로 예상하였습니다. 그런데 로그를보니 insert쿼리도 나가지 않고, 따로 롤백에 관한 내용도 찍히지 않았습니다.따라서 내부호출이 된건가 생각을해보니 제가 아는 내부호출이라는 문제는동일한 클래스에서 트랜잭션이 적용되지 않은 메서드에서 트랜잭션이 적용된 메서드 호출시 내부 호출이 발생하는걸로 알고있는데 위 예제에선 이미 최상위 메서드에서 트랜잭션이 적용되어 있는상태인데 따로 생성된 트랜잭션이 실행되지 않아서 혹시 이건 내부호출 문제가 맞는것인지, 아니면 다른 제가 간과한것이 있는지 궁금하여 질문드립니다 .
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
FutureTask 객체의 사용후 GC 유무
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 Future 관련 공부를 하다가 궁금증이 생겨 질문 남겼습니다. ThreadPoolExecutor 객체 안에 FutureTask 객체를 만들고 그 안에 task(Callable 구현 객체)를 보관한다고 알고 있습니다. 그러면 스레드풀에 있는 스레드가 해당 Future 작업을 완료한 후에 main 스레드에서 future.get()으로 값을 반환 받고 난 후에 해당 future 객체는 GC가 알아서 처리해주는건가요?
-
미해결타입스크립트 시작하기
lodash 가 안될때
npm install lodashnpm install @types/lodash위 명령어로 타입정의파일까지 설치했는데요근데 강사님처럼 자동 import 도 뜨지 않고 타입정보도 뜨지 않습니다.혹시 뭘 잘 못한걸까요?
-
해결됨[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스
tailwindcss 오류관련 문의 드립니다 ㅠㅠ
버젼이 달라서인지.. CNA 했을 때tailwind.config.js 파일이 없었습니다.강의에서는 원래부터 존재하던데..그래서 어떻게어떻게 추가를 했는데.Error: It looks like you're trying to use tailwindcss directly as a PostCSS plugin. The PostCSS plugin has moved to a separate package, so to continue using Tailwind CSS with PostCSS you'll need to install @tailwindcss/postcss and update your PostCSS configuration.라는 에러가 끝나지를 않네요 ㅠGPT한테 열심히 물어봤는데 도저히 해결이 안돼서 문의드립니다.밑은 제가 설정해둔 코드입니다.tailwind.config.js/** @type {import('tailwindcss').Config} */ module.exports = { content: [ "./src/**/*.{js,ts,jsx,tsx,html,css}", // 필요한 파일들 포함 "./app/**/*.{js,ts,jsx,tsx}", // Next.js의 `app` 폴더 추가 "./components/**/*.{js,ts,jsx,tsx}", // 컴포넌트 폴더 추가 ], theme: { extend: { colors: { 철수가좋아하는색깔: "#3498db", // 나만의 부트스트랩 만들기 영희가좋아하는색깔: "green", }, }, }, plugins: [], }; postcss.config.jsmodule.exports = { plugins: { tailwindcss: {}, autoprefixer: {}, }, }; globals.css/* @import "tailwindcss"; */ @tailwind base; @tailwind components; @tailwind utilities; 로 해도 안되고,@import "tailwindcss"; 도 안됩니다...
-
해결됨개발자를 위한 쉬운 리눅스
windows .bashrc 파일 없음
vi ~/.bashrc 명령어를 입력하면빈 화면이 나와요. ~/.bashrc 파일이 없으면 따로 생성해서 작성해야하나요 ?
-
해결됨한 입 크기로 잘라먹는 타입스크립트(TypeScript)
npm 오류
nodejs 를 설치하면 npm 도 같이 설치되는걸로 알고 있었는데 아닌가요?node -v 명령어로 설치 버전을 확인했구요,npm -v 로 확인하니까 아래처럼 메시지가 떠서요....그래서 npm init 같은 명령어를 실행해도 아래처럼 똑같은 에러메시만 뜹니다. ㅡㅡ노드도 다시 설치해보고 검색해서 환경변수 어쩌고 하는것도 다 해봐도 해결이 안되어서요 ㅡㅡ
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
블로그 작성
안녕하세요. 한 입 크기로 잘라먹는 Next.js(v15)를 수강하고 있는 학생입니다.학습한 내용을 블로그에 정리하고 싶은데, 인프런 내 강의 캡처 기능을 사용하여 시각 자료도 캡처해서 블로그 정리할 때 사용해도 괜찮을까요?좋은 강의 만들어주셔서 감사합니다! :)
-
해결됨웹 개발자와 정보보안 입문자가 꼭 알아야 할 웹 해킹 & 시큐어 코딩
취약환경 구축 not found 에러?
mysql 로그인도 했고 query.txt 복사해서 붙여넣기도 잘 했는데 '127.0.0.1/insercure_website' 접속시 저런 오류가 납니다. 어디 문제일까요? 질문 내역 중 저랑 같은오류가 생긴 분이 질문하신거 답변 확인해봤는데도 잘 해결이 안됩니다.!
-
해결됨실무 환경 그대로 주문게시판 만들기 웹개발 기초 마스터
p5 구글드라이브 url 404 에러 발생
p5 구글드라이브 url 404 에러로 인해서 접속이 되지 않습니다 해결방법이 있을까요...?
-
미해결RAG 마스터: 기초부터 고급기법까지 (feat. LangChain)
re-rank score 관련 아래 질문입니다.
학습 관련 질문이 있으시면, 상세하게 남겨주세요.문제가 발생한 부분의 코드를 함께 올려주세요.수업 영상 몇 분/초 구간인지 알려주세요.
-
미해결RAG 마스터: 기초부터 고급기법까지 (feat. LangChain)
ㄱ
from langchain.retrievers.document_compressors import DocumentCompressorPipeline from langchain_community.document_transformers import EmbeddingsRedundantFilter # 중복 문서 제거 redundant_filter = EmbeddingsRedundantFilter(embeddings=embeddings_model) # 쿼리와 관련성이 높은 문서만 필터링 relevant_filter = EmbeddingsFilter(embeddings=embeddings_model, similarity_threshold=0.5) # Re-ranking re_ranker = LLMListwiseRerank.from_llm(llm, top_n=2) pipeline_compressor = DocumentCompressorPipeline( transformers=[redundant_filter, relevant_filter, re_ranker] ) pipeline_compression_retriever = ContextualCompressionRetriever( base_compressor=pipeline_compressor, base_retriever=chroma_db.as_retriever() ) question = "테슬라 회장은 누구인가요?" compressed_docs = pipeline_compression_retriever.invoke(question) print(f"쿼리: {question}") print("검색 결과:") for doc in compressed_docs: print(f"- {doc.page_content} [출처: {doc.metadata['source']}]") print("-"*100) print()`(4) DocumentCompressorPipeline` - 여러 압축기를 순차적으로 결합하는 방식 - BaseDocumentTransformers를 추가하여, 문서를 더 작은 조각으로 나누거나 중복 문서를 제거하는 등의 작업도 가능여기에서 result = chain.invoke() 로 받아서 result의 데이터를 보면, context = result['context'][i] query_similarity_score = context.state['query_similarity_score']이렇게 similarity_score 처럼 rerank score같은거 보고싶은데,# 크로스 인코더를 사용하여 유사성 점수를 계산합니다. sentence_pairs = [[query, prediction]] similarity_scores = cross_encoder_model.predict(sentence_pairs)이런식으로 계산을 해야하나요? 추출하고 싶은데 방법을 잘 모르겠습니다.
-
미해결김영한의 실전 자바 - 중급 2편
LinkedList의 for-each 동작 방식이 궁금합니다.
본 강의 약 10분 쯤에 나오는 코드private static boolean contains(LinkedList<Integer>[] buckets, int searchValue) { int hashIndex = hashIndex(searchValue); LinkedList<Integer> bucket = buckets[hashIndex]; for (Integer integer : bucket) { if (integer == searchValue) { return true; } } return false; }이 부분에서 배열은 각 인덱스의 요소를 하나씩 꺼내는데 LinkedList는 어떤식으로 for-each문을 사용하는지 궁금합니다.
-
미해결
ozu님의 프리미어 프로 수업 영상자료 지원 안되나요?
결제 전 수업 안내에[각 실습챕터에 제공되는 영상이 있습니다. (.mp4, .mov)]라고 명시해 두셨는데 영상자료가 보이지 않습니다.답변 부탁드립니다.
-
해결됨
PMP 파일 다운관련 문의
PMP 강의를 수강중입니다.자료다운을 하려고 하는데 암호가 걸려져있어서 PDF 파일을 볼수가 없네요..확인부탁드립니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
갑자기 정적페이지 크롤링
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 갑자기 선수강의에 없었던 정적페이지크롤링 파일이 나오는데 이건 어떻게 해야 하나요. 어디서 참고해야 하나요
-
미해결FastAPI 찍어먹기 (FastAPI + React.js + AWS LightSail)
schema 클래스의 model_config 속성 관련 질문
안녕하세요! fastapi 입문으로 강사님 강의를 듣게되어 영광입니다. 강의 내용 따라 진행은 잘되고 있으나 강사님이 구현하신 class SubCategoryCreate(BaseModel): model_config = ConfigDict(from_attributes=True) subcategory_name: str category_id: int model_config = { "json_schema_extra": { "example": { "subcategory_id": 1, "subcategory_name": "수도", "category_id": 1 } }이렇게 구현을 하셨는데 model_config 변수가 두번사용 되어 마지막에 사용된 model_config 값이 첫번째 ConfigDict(from_attributes=True) 값을 덮어 씌워 첫번째로 사용된 model_config 변수의 역할이 없어지는것이 아닌가 하여 의문이 들어 왜 같은 변수명으로 덮어 씌우는지 궁금하여 질문 드립니다.
-
해결됨[코드캠프] 부트캠프에서 만든 '완벽한' 프론트엔드 코스
저도 tailwind.config.js 가 없네요..
이거 관련해서 한번 정리해주시면 좋을거같습니다. ㅠㅠ인터넷에서 찾아보고 gpt한테도 물어봤는데 해결방법을 못찾겠네요.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
조건, 반복문 질문
25:39 C언어 조건, 반목문에서 sum이 왜 -1이 되는지 잘 모르겠습니다.도표에서 sum 값이 이해가 잘 안됩니다.27:52 마찬가지로 다음 C언어 도표의 sum값도 이해가 잘 안됩니다.
-
미해결[플러터플로우] 실전! 앱 출시를 위한 끝장 노하우!
카카오로그인SDK 질문
안녕하세요. 저는 createCustomToken 에러 로그가 이렇게 뜹니다. 분명 처음부터 끝까지 영상 그대로 했는데 왜그런걸까요? user collection등도 다 활성화 되어있는 상태입니다.createCustomTokenjdu0e5j7y993TypeError: Cannot read properties of undefined (reading 'user')at /workspace/create_custom_token.js:21:21at /workspace/node_modules/firebase-functions/lib/common/onInit.js:33:16at AsyncLocalStorage.run (node:async_hooks:338:14)at /workspace/node_modules/firebase-functions/lib/v2/trace.js:18:37at cloudFunction (/workspace/node_modules/firebase-functions/lib/v1/providers/https.js:53:78)at /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/function_wrappers.js💯29at process.processTicksAndRejections (node:internal/process/task_queues:77:11)GPT한테 물어보면,이 Cloud Function은 onRequest를 사용하고 있고, 데이터를 request.body.data로 받도록 작성되어 있습니다. 그런데 실제 요청에서는 request.body에 직접 user 객체가 있거나, data가 빠져있을 가능성이 높습니다. 라고 합니다. GPT가 수정해주는 코드나 밑에 인프런에의 수정코드로 다 해도 DEPLOY부터 실패하네요~~도와주실 수 있으실까요?