묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
docker-compose down 안되는 현상
안녕하세요.docker-compose down시 계속 permission denined가 뜹니다.우선 저는 가상머신 os:ubuntu에서 프로젝트를 진행중이며, sudo 붙여서 종료 시도, sudo docker kill 로도 강제 종료를 시도했지만 permission denined이라 다 실패하였습니다.최후의 수단으로 docker설치 삭제 후, 재설치도 해보았지만 안타깝게도 실패하였습니다.하여 container를 종료하려고 할 때마다 가상머신 종료하고 다시 들어가야하는 매우 불편하고도 불운한 상황에 처해있습니다. groups를 통해 docker가 있는 것도 확인하였습니다. 도저히 왜 안되는지 모르겠습니다.도움이 절실합니다... 감사합니다.ㅠ
-
해결됨eks를 활용한 spring 운영서버 배포(feat. devops의 모든것)
MAS 환경에서 Feign Client 라이브러리를 이용해 HTTP 통신 발생시 에 대한 질문 있습니다.
공유해주신 API Gateway 아키텍처를 보면Order 서비스가 Product 서비스에게 해당 상품 수량 어느정도인지 요청시Order 서비스는 유레카에게 Product 서비스 위치를 질의 한다.유레카에 등록된 Product 서비스 위치 정보를 Order 서비스에게 응답한다.Order 서비스는 Product 서비스에게 실질적으로 상품 수량 GET 요청 한다. 제가 알고 있는 일반적으로 (MAS X) 모놀리식 구조에서 Feign Client 를 사용시 유레카를 사용 하지 않는 상황에서 특정 서버에게 요청시 곧바로 해당 서버에게 요청을 했었는데요. (3 Way Handshake 생략)그런데 @FeignClient(name = "product-service", url="http://product-service") public interface ProductFeign { }이렇게 FeignClient 어노테이션에서 name 을 특정 서버 어플리케이션 이름으로 지정하게 된다면 알아서 유레카에게 질의하고 응답 받아서 Product 서비스에게 요청해서 총 HTTP 요청이 2번 일어 난다고 보면 되는건가요? 일단 비지니스 로직단에서는 HTTP 요청이 2번 일어난다(유레카 서버에게 호출 하고 그 다음 실질적은 요청하고자 하는 서버에게 다시 요청) 라고 로직상에서는 안보여서요. 이부분은 내부 로직(Feign client 라이브러리 내부 로직?? 이라고 해야 할까요?..)에서 처리된거라서 눈에 안보이는 부분인지 알고 싶습니다.
-
미해결
프로젝트 기획부터 배포까지 함께 성장할 팀원 모집(프론트엔드)
안녕하세요. 프로젝트를 진행 하기위한 팀원 모집합니다.프로젝트 주제 : 뉴스 서치 플랫폼프로젝트 목표 : 기획부터 배포까지 경험 + 경쟁력 있는 포트폴리오예상 일정 : 주 1회 온라인 / 월 1회 오프라인예상 커리큘럼 간략히 :예상 모집인원 :현재 인원 : 기획/디자이너 1 프론트엔드1 백엔드3모집 인원 : 프론트엔드 1프로젝트 소개와 개설 이유 : 현재 저는 주니어 개발자로 재직중이며 시작한지 몇달 안되었고 이전에도 팀프로젝트는 물론 개인 프로젝트도 진행해보지 않아 어떤 툴을 써야할지 뭐가 필요한지 전무한 수준입니다.그리고 회사에서는 이미 구축이 되어있어 기능 개발 이외에 경험을 하지못하여 전체적인 프로젝트 관련 지식이나 이해도가 부족하여 직접 해보며 성장해 나아가기 위해 프로젝트 진행을 하게되었습니다.막상 혼자 처음 시작할려니 어려움이 있어 여러 사람을 모아 함께 고민하며 진행해 나아가고 싶습니다.실력이 부족한만큼 프로젝트를 진행해보며 개발이 어떻게 되는지 배포는 어떻게 하는지 경험을 쌓기 위한 프로젝트라고 생각해 주시면 감사하겠습니다.프로젝트 관련 주의사항 : 초보자도 상관없고 실력이 있으신 분도 상관없습니다.기준을 정하고 구하는 것이 아니니 실력 차이가 많이 날수 있습니다.(기획을 못따라갈 수도 있고 디자인이 마음에 안들 수도 있고 개발이 더딜 수 있습니다.)부족하면 더 열심히하고 실력이 좋은 사람은 이끌어줄 수 있는 사람을 원합니다.프로젝트에 지원할 수 있는 방법을 남겨주세요. (이메일, 카카오 오픈채팅방, 구글폼 등) :지원 및 문의 사항은 오픈 채팅방으로 연락주세요.https://open.kakao.com/o/sdClaIwh
-
해결됨아날로그 회로설계 실무 : Analog IP 설계와 성능 개선하기
VDD 질문
1) 해당 공정의 VDD 값이란: VDD(BGR)=4V, VDD(AMP)=3.3V 등 VDD 조건이 달라, 어떤 전압을 기준으로 설계해야 할지 혼란스러워 질문드립니다!. tsmc 180nm의 정확한 공정 매뉴얼을 찾아보려 했지만 정확하게 알 수가 없네요ㅠㅠ 또한 정확한 공정 규격을 알아야 소자 손상없이 올바른 동작이 가능한것으로 알고 있습니다. → 제가 알아본 정격 전압은 1.8V이긴합니다2) 저전압 설계에서의 VDD: BGR 과제에서 VDD=4V를 사용하여 낮은 기준전압을 생성했습니다. 기 경우, "저전압 설계'라는 것은 공급전압과 무관한게 맞는지 혼란스러워 질문드립니다 ! (제가 이해하고 있는 저전력/저전압 설계는 다음과 같습니다)(저전력 설계 : Power=VI를 낮춘 설계. 즉, VDD뿐만아니라 Current까지 작으면 좋음)(저전압 설계 : 낮은 VDD를 사용)
-
해결됨스프링 핵심 원리 - 기본편
request Scope 질문. 다른 강의에서 더 활용하는지?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 드립니다.requset scope가 웹 스코프 에서 중요한 역할을 한다는것을 어느 정도 인지가 되는 상황이지만, 여러 번을 들어도 "모르겠다"라는 는 말이 저절로 나옵니다...그래서 일단은 그냥 넘어 갈려고 합니다.여기서 질문입니다.requset Scope를 더욱더 활용하거나 공부하는 강의가, 다음 강의 및 다른 강의에서 있나요?추가1만약에 없다면 어떤 것을 들어야(해야지) 이해 할수 있을까요?답변 부탁드립니다.
-
미해결김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍
병렬 프레임 병목 현상 해결책에 대해 궁금한 점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Fork/Join 공용 풀(및 병렬 스트림)을 I/O 대기 작업에 사용하면 스레드 병목으로 요청이 밀려서 그 해결책으로 로직 전용 스레드 풀을 만들었잖아요.ExecutorService logicPool = Executors.newFixedThreadPool(400);다른 해결책으로 다음과 같이 공용이 아닌 그냥 Fork/Join 풀을 써도 되나요? 공용이 아니니깐 스레드 병목 현상도 없으니깐요.ForkJoinPool logicPool = new ForkJoinPool(400);아니면 이것도 여전히 안 좋나요?
-
미해결앱 개발 기초부터 실전까지 하나로 끝내는 Swift & iOS 마스터 클래스
타이머 오차
안녕하십니까? 강사님강의를 열심히 듣고 있는 중입니다.363강 Step #29 - Timer를 실습하던중 의문점이 생겨서 문의 드립니다.30초에 타이머가 일시정지하게끔 하거나 중지시키게 하면 항상 2-3초의 오차가 발생합니다.이게 소스상의 문제인지 아님 다른 문제인지 알수가 없어서 문의 드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
아이템 시스템 강의
현재 강의랑은 관련없는 질문글 죄송합니다.올해 봄 출시 에정이라고 하셨던 아이템시스템 강의의 데이터테이블 관리방식이 궁금해서 계속 기다려왔는데, 혹시 언제쯤 나오는지 알 수 있을까요?
-
미해결[리뉴얼] 처음하는 파이썬 머신러닝 부트캠프 (쉽게! 실제 캐글 문제 풀며 정리하기) [데이터분석/과학 Part2]
test / train 데이터 나누기
안녕하세요, 선생님.좋은 강의 항상 감사히 잘 듣고 있습니다.train 데이터와 test 데이터를 미리 파일로 나누어 작업하시는 것을 보았는데, 실제 회사에서도 이렇게 작업하는지 궁금합니다.보통 어느 단계에서 train과 test 데이터를 나누는 것이 맞는지도 알고 싶습니다.예를 들어,결측값이나 이상치 처리, NaN 값을 처리한 후에 데이터를 나누는 것이 맞는지,아니면 처음부터 비율(예: 8:2)로 나누고 시작하는 것이 맞는지 궁금합니다.답변해 주실 수 있을까요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
3:32 추상클래스와 추상메서드 예제2
예제2 abstract가 붙으면 재정의한 자식거 출력하고 이문제에서 stopEngine이 자식이 상속받지안호았으므로 부모것이 출력된건가요?설명 자세히 부탁드립니다
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
intellij에 diagrams.net 관련 플러그인이 있네요.
editor가 랜더링 되지 않으면 vm option을 추가해야 합니다. Help > Edit Custom VM Options...-Dide.browser.jcef.out-of-process.enabled=false해당 옵션 설정에 대한 Copliot 설명➡JCEF 브라우저를 IDE 프로세스 내(in-process)에서 실행하겠다는 의미입니다.기본적으로 JetBrains IDE는 JCEF 브라우저를 별도의 프로세스(out-of-process)로 실행해서 안정성과 보안성을 높이려고 해요. 하지만 이 옵션을 false로 설정하면:브라우저가 IDE와 같은 프로세스에서 실행됩니다.일부 환경에서는 성능 향상이나 디버깅 편의성을 위해 이렇게 설정하기도 해요.반면, 브라우저 충돌 시 IDE 전체가 영향을 받을 수 있는 위험도 있어요.
-
미해결김영한의 실전 자바 - 기본편
helloshop
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.com.helloshop이라 쓰면 그냥 패키지 하나로 뜨고 그 밑에 product를 만들어도 helloshop패키지 이름이 바뀝니다. 뭐가 문제일ㄲ?ㅏ요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
createGlobalStyle의 위치와 영향범위
createGlobalStyle이 컴포넌트 형태로 적용되다보니 마치 현재 컴포넌트 하위만 적용될 것 같은 느낌이 있는데요 실제 영향범위는 class 수정이므로 페이지 전체에 영향을 끼치다보니 개인적으로 비직관성이 느껴집니다 createGlobalStyle을 실제로 사용하신 경험이 있는지와 사용하셨다면 _app 외에 다른 위치에서도 쓰셨는지 궁금합니다
-
미해결[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!
카프카 클러스터에서 감당 가능한 파티션(레플리카) 수 문의
안녕하세요.카프카 클러스터 규모를 추산하던 중 감당 가능한 토픽/파티션 수가 궁금하여 질문드립니다. 예를 들어,Replication Factor를 3으로 가정할 때 레플리카 개수가 대략 10,000개가 나옵니다(3,000 파티션 × replication factor 3)파티션 10개인 토픽 100개: 1,000개파티션 20개인 토픽 100개: 2,000개총 파티션: 3,000개RF가 3일 때 전체 클러스터 레플리카 수: 9,000개추후 토픽 추가에 따라 레플리카 수가 최대 18,000개까지 늘어날 수 있음토픽과 파티션 규모가 이 정도라면 카프카 클러스터를 적절한 단위(도메인)로 나눠야 할지,아니면 한 클러스터에서 충분히 운용 가능한지 궁금합니다.클러스터를 하나로 구성하여 사용하자니 레플리카 수가 감당 가능할지 고민되고클러스터를 여러개로 구성하여 사용하자니 그에 따른 비용과 오버 엔지니어링이 고민됩니다.파티션이 많을수록 파일 같은 자원을 더 사용하고 각 클라이언트로부터 수많은 요청을 받게 되는데, 브로커를 충분히 늘리면 감당 가능한 정도일까요?큰 규모의 카프카 클러스터를 운용해본 적이 없어 강사님께서 카프카 클러스터를 어떻게 운용하셨는지 여쭤봅니다. (이정도 수준의 레플리카를 운용해본적이 있는지 등)참고로 카프카는 3.x (KRaft 모드) 버전을 사용하려고 합니다.아래는 참고한 자료입니다.참고1) 컨플루언트 개발자 가이드에 따르면 토픽은 KRaft일 때 수백만 개 생성 가능하다고 하지만결국 각 토픽당 파티션 수에 따라 달진다고 언급하고 있습니다.참고2) 컨플루언트 블로그에 따르면 가용성을 고려하면 2,000~4,000개를 권장하고, 지연시간을 고려하면 100 × b × r (b: 브로커 수, r: 복제 팩터) 공식을 제안하고 있습니다.그런데 10년 전에 작성된 글이라 현재는 더 많이 지원하지 않을까 싶습니다.
-
미해결AI 에이전트로 구현하는 RAG 시스템(w. LangGraph)
agent_executor 실행시 JSONDecodeError에러가 발생해요.
문제가 발생하는 코드 ㄴ LLM모델만 gemini-2.5-pro로 사용하고 있고 다른 부분은 다른게 없는데 아래의 에러가 발생하네요...혹시 도와주실 수 있을까요? # AgentExecutor 실행 query = "시그니처 스테이크의 가격과 특징은 무엇인가요? 그리고 스테이크와 어울리는 와인 추천도 해주세요." agent_response = agent_executor.invoke({"input": query})에러로그 Entering new AgentExecutor chain... Invoking: search_menu with {'query': 'Signature Steak'} [Document(metadata={'menu_name': '시그니처 스테이크', 'menu_number': 1, 'source': './data/restaurant_menu.txt'}, page_content='1. 시그니처 스테이크\n • 가격: ₩35,000\n • 주요 식재료: 최상급 한우 등심, 로즈메리 감자, 그릴드 아스파라거스\n • 설명: 셰프의 특제 시그니처 메뉴로, 21일간 건조 숙성한 최상급 한우 등심을 사용합니다. 미디엄 레어로 조리하여 육즙을 최대한 보존하며, 로즈메리 향의 감자와 아삭한 그릴드 아스파라거스가 곁들여집니다. 레드와인 소스와 함께 제공되어 풍부한 맛을 더합니다.'), Document(metadata={'menu_name': '안심 스테이크 샐러드', 'menu_number': 8, 'source': './data/restaurant_menu.txt'}, page_content='8. 안심 스테이크 샐러드\n • 가격: ₩26,000\n • 주요 식재료: 소고기 안심, 루꼴라, 체리 토마토, 발사믹 글레이즈\n • 설명: 부드러운 안심 스테이크를 얇게 슬라이스하여 신선한 루꼴라 위에 올린 메인 요리 샐러드입니다. 체리 토마토와 파마산 치즈 플레이크로 풍미를 더하고, 발사믹 글레이즈로 마무리하여 고기의 풍미를 한층 끌어올렸습니다.')] Invoking: search_wine with {'query': 'steak'} [Document(metadata={'menu_name': '사시카이아 2018', 'menu_number': 3, 'source': './data/restaurant_wine.txt'}, page_content='3. 사시카이아 2018\n • 가격: ₩420,000\n • 주요 품종: 카베르네 소비뇽, 카베르네 프랑, 메를로\n • 설명: 이탈리아 토스카나의 슈퍼 투스칸 와인입니다. 블랙베리, 카시스의 강렬한 과실향과 함께 허브, 가죽, 스파이스 노트가 복잡성을 더합니다. 풀바디이지만 우아한 타닌과 신선한 산도가 균형을 잡아줍니다. 오크 숙성으로 인한 바닐라, 초콜릿 향이 은은하게 느껴집니다.'), Document(metadata={'menu_name': '샤토 디켐 2015', 'menu_number': 9, 'source': './data/restaurant_wine.txt'}, page_content='9. 샤토 디켐 2015\n • 가격: ₩800,000 (375ml)\n • 주요 품종: 세미용, 소비뇽 블랑\n • 설명: 보르도 소테른 지역의 legendary 디저트 와인입니다. 아프리콧, 복숭아, 파인애플의 농축된 과실향과 함께 꿀, 사프란, 바닐라의 복잡한 향이 어우러집니다. 놀라운 농축도와 균형 잡힌 산도, 긴 여운이 특징이며, 100년 이상 숙성 가능한 와인으로 알려져 있습니다.')]--------------------------------------------------------------------------- JSONDecodeError Traceback (most recent call last) Cell In[163], line 4 1 # AgentExecutor 실행 3 query = "시그니처 스테이크의 가격과 특징은 무엇인가요? 그리고 스테이크와 어울리는 와인 추천도 해주세요." ----> 4 agent_response = agent_executor.invoke({"input": query}) File c:\Users\jangi\AppData\Local\pypoetry\Cache\virtualenvs\langgraph-agent-AGzdf7hx-py3.11\Lib\site-packages\langchain\chains\base.py:170, in Chain.invoke(self, input, config, kwargs) 168 except BaseException as e: 169 run_manager.on_chain_error(e) --> 170 raise e 171 run_manager.on_chain_end(outputs) 173 if include_run_info: File c:\Users\jangi\AppData\Local\pypoetry\Cache\virtualenvs\langgraph-agent-AGzdf7hx-py3.11\Lib\site-packages\langchain\chains\base.py:160, in Chain.invoke(self, input, config, kwargs) 157 try: 158 self._validate_inputs(inputs) 159 outputs = ( --> 160 self._call(inputs, run_manager=run_manager) 161 if new_arg_supported 162 else self._call(inputs) 163 ) 165 final_outputs: Dict[str, Any] = self.prep_outputs( 166 inputs, outputs, return_only_outputs 167 )... 339 if end != len(s): --> 340 raise JSONDecodeError("Extra data", s, end) 341 return obj JSONDecodeError: Extra data: line 1 column 29 (char 28)Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
Snowflake처럼 동적으로 생성되는 ID, Mock 테스트가 올바른 접근법일까요?
14:42 에서 Snowflake 알고리즘으로 articleId를 생성한 후 DB에 저장된 121530268440289280L값을 사용해서 테스트 코드를 작성하시는 것을 보고,실제로 Snowflake를 도입해서 Id를 생성하고 같은 방식으로 테스트 코드를 작성한다면 DB에 종속적이라서 반복적으로 테스트 코드를 실행할 때 테스트 코드의 유지보수에서 문제가 발생할 수 있을 거라는 생각이 들었습니다.이런 문제를 막기 위해서 테스트 시에는 Mock 객체를 사용해 미리 정해진 Snowflake가 고정 ID 값을 반환하도록 하는 방식으로 테스트 코드를 작성하는게 맞는건지 궁금해서 질문글을 남기게 되었습니다.
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
@NaturalIdCache에 대한 보충 설명 및 사용법 공유
'25. 엔티티의 자연키 지정' 영상의 후반부에 적용한 @NaturalIdCache에 대해 추가로 학습한 내용이, 저처럼 해당 애노테이션을 처음 접한 분들에게 도움이 될 것 같아서 글을 작성합니다. 강의에서 오해가 있을 수 있는 부분, 그리고 자연키에 캐시를 적용하는 방법을 정리해 보았습니다. 강의 내용과 실제 동작의 차이점강의에서는 “같은 트랜잭션 안에서 같은 아이디 값을 가지고 여러 번 조회 시 Persistence Context 에 캐시된 값을 꺼내오는 것 처럼. @NaturalIdCache를 적용하면 이것도 영속 컨텍스트에 캐싱이 된다.”고 말씀하셨습니다. 해당 내용에 대한 이해를 돕기 위해 Hibernate의 두 가지 캐시에 대해 간단히 짚고 넘어가겠습니다.1차 캐시 (First-Level Cache): 세션(영속성 컨텍스트) 범위의 캐시입니다. 같은 트랜잭션 안에서만 유효하며, 트랜잭션이 끝나면 사라집니다. Spring Data JPA에서는 기본적으로 @Id 에 대한 조회를 1차 캐시합니다. 2차 캐시 (Second-Level Cache): 세션 팩토리 범위의 캐시로, 여러 세션에서 데이터를 공유할 수 있습니다. 적용하려면 별도의 의존성 추가 및 캐시 관련 설정(@Cache 등)이 필요합니다. 따라서, "같은 트랜잭션 안에서 캐시된 값을 꺼내온다."는 말은 세션 범위의 1차 캐시로 해석됩니다. 하지만 제가 직접 테스트해 본 결과, @NaturalIdCache는 1차 캐시가 아닌 2차 캐시와 관련이 있었으며, 1차 캐시를 적용하기 위해서는 다른 방법이 필요했습니다. 테스트를 통한 확인자연키에 대한 1차 캐시 동작을 확인하기 위해, 강의에서 적용한 Member 엔티티의 @NaturalIdCache 를 제거하고, 자연키(Email)에 @NaturalId만 적용한 상황에서 두 가지 방식으로 테스트를 진행했습니다. 테스트1: findByEmail 메서드를 사용한 조회Java@Test void NaturalIdFirstLevelCache() { Member member = Member.register(createMemberRegisterRequest(), createPasswordEncoder()); memberRepository.save(member); entityManager.flush(); entityManager.clear(); System.out.println("회원 저장 및 persistence context 초기화 완료"); // 같은 email(Natural ID)로 두 번 조회 Member findMember1 = memberRepository.findByEmail(member.getEmail()).get(); Member findMember2 = memberRepository.findByEmail(member.getEmail()).get(); assertThat(findMember1).isSameAs(findMember2); } Spring Data의 쿼리 메서드를 사용하여 이메일로 조회하는 findByEmail 메서드를 만들고, 한 트랜잭션에서 같은 회원을 두 번 조회했습니다. 자연키에 대한 1차 캐시가 동작한다면, SELECT 쿼리는 한 번만 실행되어야 합니다.결과는 SELECT 쿼리가 두 번 실행되었습니다. 즉, 자연키에 대한 1차 캐시가 동작하지 않았습니다. 테스트2: Hibernate의 자연키 관련 API를 사용한 조회@NaturalId를 다루는 글들을 찾아본 결과 Hibernate가 제공하는 자연키 관련 API가 있다는 것을 확인했고, 이를 적용하기 위해 커스텀 리포지토리를 구현했습니다.Java@Repository @RequiredArgsConstructor public class CustomizedMemberRepositoryImpl implements CustomizedMemberRepository { private final EntityManager entityManager; @Override public Optional<Member> findByNaturalId(Email naturalId) { return entityManager.unwrap(Session.class) .bySimpleNaturalId(Member.class) .loadOptional(naturalId); } } 그리고, 테스트 1과 같은 방식으로 테스트를 진행하였습니다. @Test void NaturalIdApi() { Member member = Member.register(createMemberRegisterRequest(), createPasswordEncoder()); memberRepository.save(member); entityManager.flush(); entityManager.clear(); System.out.println("회원 저장 및 persistence context 초기화 완료"); Member findMember1 = memberRepository.findByNaturalId(member.getEmail()).get(); Member findMember2 = memberRepository.findByNaturalId(member.getEmail()).get(); assertThat(findMember1).isSameAs(findMember2); }결과는 SELECT 쿼리가 한 번만 실행되었습니다. 이를 통해 자연키에 대한 1차 캐시는 @NaturalIdCache 애노테이션과 무관하게, 전용 API를 사용해야만 동작하는 것을 확인했습니다. @NaturalIdCache의 용도@NaturalIdCache Javadoc에는 다음과 같은 설명이 있습니다.Specifies that mappings from the natural id values of the annotated entity to the corresponding entity id values should be cached in the shared second-level cache.…중략This annotation is usually used in combination with Cache, since a round trip may only be avoided if the entity itself is also available in the cache.대략 “natural id와 상응하는 id에 대한 매핑을 2차 캐시에 저장하는 애노테이션이고, 엔티티가 캐시되어있어야 하기 때문에 일반적으로 Cache와 함께 사용된다.”라고 해석됩니다. 즉, 1차 캐시가 아닌 2차 캐시를 위한 애노테이션입니다. 정리2차 캐시 관련 설정 및 테스트를 마저 진행한 후 최종 정리한 내용은 다음과 같습니다. 자연키의 1차 캐시@NaturalIdCache 애노테이션과 관련 없습니다. 자연키에 @NaturalId만 붙이면 됩니다.반드시 Hibernate Session의 bySimpleNaturalId() 같은 전용 API를 사용해야 적용됩니다. 자연키의 2차 캐시@Cache와 @NaturalIdCache를 함께 사용해야 동작합니다.@Cache만 사용 시 @Id로 조회할 때만 2차 캐시가 동작합니다.@NaturalIdCache만 사용 시 자연키와 ID에 대한 매핑 정보는 캐시 히트되는 걸 확인했지만, ID와 엔티티에 대한 캐시가 없어서 캐시가 적용되지 않았습니다. @Cache와 @NaturalIdCache 모두 사용 시 ID를 통한 조회와 자연키를 통한 조회 모두 2차 캐시가 적용됩니다. 참고 자료Hibernate6.6 공식 문서NaturalCache javadocsbaeldung: Hibernate Natural IDs in Spring BootSpring Custom Repository 글의 오류나 부족한 내용을 알고 계신 분은 코멘트를 달아주시면 감사하겠습니다.
-
미해결악성코드 분석 중급과정 (유형별분석)
2025년 로컬 컴퓨터(윈도우11)에서 가상환경으로 드래그앤드롭 안됨
선생님이 강의하신 환경 구성을 그대로 했습니다.클립보드 공유, 드래그 앤드롭 다 양방향으로 설정했습니다. 근데 실습파일을 가상환경에 옮길려고 했는데 드래그앤드롭이 되지 않아서 질문드립니다!이런 경우 어떻게 해야될까요?버츄얼박스 버전은 7.0입니다..!!
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
인라인 스타일 리렌더링 관련
인라인 스타일 사용 시 style이라는 객체 prop이 매번 달라져 리렌더링이 발생한다고 해주신 부분 관련하여 질문드립니다 부모가 리렌더링되는 상황이라 이와 무관하게 자식의 리렌더링도 유발하게 될텐데요자식 컴포넌트 자체에 memo를 적용하는 경우가 아니라면, useMemo를 쓰더라도 최적화 효과가 없을 것으로 보이는데 맞을까요?
-
해결됨[Rookiss University] UE5 Lyra 클론 코딩 (Haker)
UPROPERTY매크로 AllowedType이 동작하지 않습니다.
사진에 보이는 에디터 화면은 UserFacingExperience상속받아 만든 DataAsset인데 MapId나 Experienceid를 눌렀을때 AllowedType대로 동작하지 않고 에셋매니저에 등록된 모든 에셋을 불러옵니다.혹시 제가 사진에 올린거 말고도 다른것들을 해줘야했나요?