묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 고급편
ThreadLocal 관련하여 질문드립니다.
spring webflux에서 비동기 통신을 한다면한쓰레드에서 블록킹되지 않고 다른 프로세스가 진행되는 것으로 알고 있습니다.webflux에서 threadLocal을 쓴다면 한 thread를 점유하는 의미가 없는것인지 질문드립니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
혹시 강의에서 코딩한 소스코드는 따로 제공은 안해시는지 궁금합니다.
강의 잘 듣고 있습니다. 혹시 강의에서 코딩한 소스코드는어디서 다운로드 받을수 있는지 궁금합니다~~
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
[요청]실전문제풀이 + 해설 PDF
안녕하세요. 강사님,실전문제풀이에 파란색 해설 추가된 PDF 파일 저도 받을 수 있나요?미리 감사드립니다...
-
미해결스프링 핵심 원리 - 기본편
에러부분이 나서 진행이 안되네요... 의존성 문제인거 같기도한데
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\hello\core\out\production\classes\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93)at hello.core.scan.AutoAppConfigTest.basicScan(AutoAppConfigTest.java:15)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1801)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1357)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311)at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)... 83 more종료 코드 -1(으)로 완료된 프로세스 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired // 생성자에서 여러 의존관계도 한번에 주입받을 수 있다. public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.disCount(member, itemPrice); return new Order(memberId , itemName, itemPrice ,discountPrice); } // 테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } } public class AutoAppConfigTest { @Test void basicScan() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); MemberService memberService = ac.getBean(MemberService.class); assertThat(memberService).isInstanceOf(MemberService.class); // AnnotationConfigApplicationContext를 사용하는 것은 기존과 동일하다. // 설정 정보로 AutoAppConfig 클래스를 넘겨준다. // 설정해보면 기존과 같이 잘 동작하는 것을 확인할 수 있다. } @Configuration @ComponentScan( //자동으로 스프링 빈을 등록할 수 있는 기능 excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION ,classes = Configuration.class) ) public class AutoAppConfig { }빈을 찾기 못해서 발생하는 문제인건 알겠는데 어느부분인지는 모르겠네요ㅜㅜ
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
글씨체 궁금!
피피티에 선명하게 찍힌 저 글씨체가 무슨글꼴인가요!?ㅎㅎ
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
어댑터 Context
ContentsListActivity에서 어댑터에 context를 넣어줄 때는 baseContext를 쓰고, BookmarkFragment.kt 에서 어댑터에 context를 넣어줄 때는 requireContext()로 다르게 쓰신 이유가 있으실까요?
-
미해결따라하면서 배우는 고박사의 유니티 기초
23년인 지금 들어도 버전문제는 없을까요
버전이 달라지면 기능도 많이 바뀌는듯해서.이 강의 시리즈를 23년인 지금들어도 문제가 없을지 궁금해집니다.
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"
페이지 컴포넌트에 props를 함수 모드로 전달할 때!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.router 설정 시 페이지 컴포넌트에 props를 전달할 수 있다는 부분을 학습했고, boolean 뿐만 아니라 함수 모드도 가능하다고 알려주셨습니다.{ path: '/posts/:id', name: 'PostDetail', component: PostDetailView, // props: true, props: route => ({ id: parseInt(route.params.id) }), },함수를 정의하는 부분에서, route를 인자로 두고 route.params.id를 값으로 하는 id를 return하는 것을 작성했습니다.이 때, route를 미리 정의하지 않아도 이런 식으로 쓸 수 있는건가요?router/index.js에도 route는 정의되어 있지 않습니다.이를 테면, const route = useRoute()로 선언이 되어 있어야 route.params.id와 같은 접근이 가능한거 아닌가.. 생각했습니다.혹은 이 props를 사용하는 PostDevailView.vue에는 route가 미리 정의되어 있어야 한다고 생각했는데, 그것도 아니네요. 어느 부분을 더 학습하면 올바른 이해를 할 수 있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
await initializeDateFormatting(); 에러 문의
강의를 보면 await initializeDateFormatting(); 코드를 추가하라고 나와있는데 실행하면 아래와 같이 변수를 할당하지 않았다고 에러가 나옵니다. 찾아들어가면 하나는 locale이고 하나는 url를 추가하라고 하는데 url에는 무었을 넣어야 하나요 lib/main.dart:8:33: Error: Too few positional arguments: 2 required, 0 given.
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"
RouterLink 사용 시 to와 :to
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요,강의 중 router.replace()를 설명하는 부분에서<RouterLink to=“/nested/one”> 를<RouterLink :to=“{ name: ‘NestedOne’, replace: true}”> 로 대체하면서 v-bind를 사용했습니다. 이 때 v-bind는 어떤 의미일까요? 단순 text와 객체의 차이가 v-bind 사용 유/무에 영향을 준 것일까요? 항상 충분한 설명이 담긴 답변 주셔서 감사합니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
Intelli J 사용관련
안녕하세요. _Quiz_07.java를 만들어 Run시키면 Chapter 9의 Inteface관련 Package쪽 에러가 있다고 합니다. Run Configuration에 Quiz07.java를 지정해도 동일한 에러가 반복됩니다. 마치 Intelli J는 프로젝트 전체를 Build하면서 특정 부분에 에러가 있으면 Run이 안되는 것 같습니다. 어떻게 해결할 수 있을까요?이 외에도 Intelli J를 잘 활용하고 싶은데, 좋은 방법 있으면 추천 부탁 드립니다.
-
미해결코딩테스트 [ ALL IN ONE ]
강의 교재 질문드립니다.
강의 교재 [노션 공유] 에 대해 궁금하여 질문 남깁니다.- 구글 폼을 이용하여 신청을 하였는데 노션을 해당하는 메일과 인프런 계정 이메일에도 메일 수신을 확인이 안되어 어떤 경로로 보내주시는 건지 궁금하여 글 남김니다 .
-
미해결Svelte.js [Core API] 완벽 가이드
강의 소스 코드
안녕하세요,혹시 깃허브 같은 저장소에서 강의에서 사용하는 소스 코드를 다운받을 수 있나요?있다면 어디에서 받을 수 있을까요?감사합니다.
-
미해결메타스플로잇(Metasploit) 활용한 취약점 분석(초중급과정)
스캐너 종류가 엄청많던데...
meatsploit에 있는 스캐너들의 설명이 나와있는 페이지가 있나요?? 스캐너마다 장단점이 있을거라 생각하는데... 어떠한 환경에선 이 스캐너가 좋다...이런 설명이 나와있는 페이지가 있나요??
-
해결됨그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)
7:31초 데이터 표에서 질문있습니다
안녕하세요 코딩테스트전에 기본 개념을 알고자 이렇게 강의 듣게 되었습니다 :) 그림으로 쉽게 설명해주셔서 덕분에 이해가 빨리됩니다! 덕분에 운영체제도 들어볼까하는데 ㅎㅎ 기대가 됩니다.해시테이블구현 - 7:31초에 hashTable.set()으로 선수들의 데이터 값을 저장했습니다. 저장시, 인덱스 1에서 이운재 선수가 먼저 연결리스트에 저장되고 후에 박지성 선수가 저장되면 그림상 데이터에서 박지성선수가 먼저오고 다음 이운재가 되어야 된다고 생각하는데 반대인 이유가 궁금합니다. set(key,value){ this.arr[this.hashFunction(key)].insertAt(0, new HashData(key, value)) }여기서 index를 0으로 지정한 이유가 가장 앞부분부터 삽입하기 위해서라고 생각했습니다. remove 함수에서 console.log(currentNode)를 확인하면서 하는데 제가 처음 공부하는거라 확신도 없고 아리송합니다. 답변주시면 정말 감사하겠습니다. 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Spring Boot 3.X distinct 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화Spring Boot 3.2버전에서 실습 중에, distinct 옵션을 사용하지 않고도 distinct 옵션을 넣은 것처럼 Row가 2줄 출력됩니다. 이것저것 코드를 확인하다가 Spring Boot를 2.x 버전으로 내린 후에 다시 확인해보았는데, 그제서야 강의에 나오는 것처럼 중복 데이터 4개가 나옵니다. 혹시 이것 관련해서 jpa에서 업데이트가 된 것인지요..? 검색 능력이랑 문서 능력 찾아보는 능력이 딸려, 한참 찾아보다 여기에 질문합니다 ㅜㅜ 실례가 안된다면 이러한 내용을 어떻게 찾는지도 알게 될 수 있다면 좋을거 같습니다!
-
미해결
홍정모의 따라하며 배우는 C++ 강의자료 없나요?
예제는 스스로 해보고 있는데 강의 자료 없나요 ppt 같은거요
-
미해결실전! Querydsl
QueryDSL 에서 leftJoin & fetchJoin 후 lazy loading 이 되는 현상
영한님 안녕하세요, QueryDSL 공부 중 막히는 부분이 있어 질문드립니다.1:N 연관관계를 가지고 있는 두 엔티티 Team 과 Member 가 있을 때, QueryDSL 로 leftJoin & fetchJoin 으로 두 테이블을 조인하여 Member 목록을 조회하고 싶은데, 만약 Team 테이블에 FK 에 해당하는 row 가 존재하지 않는 경우에는 Member.team 에 그냥 null 이 들어있고 객체에 접근하더라도 추가적인 select 쿼리가 실행되지 않도록 하고 싶습니다. 그런데 제 바람과는 달리 Member.team 을 참조하는 시점에 lazy loading 이 되면서 select 쿼리가 실행되더라고요.실제 코드를 바탕으로 설명해보겠습니다.아래와 같이 1:N 연관 관계를 갖는 Team 과 Member 라는 엔티티가 있습니다.@Table(name = "member") @Entity class Member( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Int = 0, @Column(name = "team_id") var teamId: Long? = null, @Column(name = "name") var name: String? = null, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id", insertable = false, updatable = false, foreignKey = ForeignKey(name = "none")) val team: Team? = null, ) @Table(name = "team") @Entity class Team( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0, @Column(name = "name") var name: String? = null, )여기서 아래의 코드로 left outer join 쿼리를 실행합니다.val members = from(member) .leftJoin(member.team, team).fetchJoin() .fetch()DB 는 아래와 같이 데이터가 저장되어 있습니다.// team +----+-------+ | id | name | +----+-------+ | 1 | team1 | +----+-------+ // member +----+---------+------+ | id | team_id | name | +----+---------+------+ | 1 | 2 | John | +----+---------+------+그럼 저는 아래와 같은 Member 객체 하나로만 이루어진 List 를 얻을 수 있을 거라고 생각했고, team 변수에 접근할 때 select 쿼리 실행 없이 null 만을 반환할 것이라고 기대했습니다.{ "id": 1, "team_id": 2, "name": "John", "team": null }하지만 아래와같이 member 테이블을 lazy loading 하는 로그가 찍히네요.Hibernate: insert into team (id, name) values (default, ?) Hibernate: insert into member (id, name, team_id) values (default, ?, ?) Hibernate: select member0_.id as id1_7_0_, team1_.id as id1_9_1_, member0_.name as name2_7_0_, member0_.team_id as team_id3_7_0_, team1_.name as name2_9_1_ from member member0_ left outer join team team1_ on member0_.team_id=team1_.id Hibernate: select team0_.id as id1_9_0_, team0_.name as name2_9_0_ from team team0_ where team0_.id=?그런데 만약 DB 의 데이터 중 member 의 team_id 만 1로 변경하니 쿼리 후 member.team 에 접근하더라도 아래와 같이 lazy loading 하는 로그가 찍히지 않았습니다.Hibernate: insert into team (id, name) values (default, ?) Hibernate: insert into member (id, name, team_id) values (default, ?, ?) Hibernate: select member0_.id as id1_7_0_, team1_.id as id1_9_1_, member0_.name as name2_7_0_, member0_.team_id as team_id3_7_0_, team1_.name as name2_9_1_ from member member0_ left outer join team team1_ on member0_.team_id=team1_.id테스트에 사용한 코드는 아래와 같습니다.@DataJpaTest @Import(MemberService::class) // MemberService.listMembers() 에서 QueryDsl 로 쿼리를 합니다. class MyTest( private val sut: MemberService, private val em: EntityManager, ) : FunSpec( { beforeEach { val team = Team(name = "team1") em.persist(team) val member = Member( name = "John", teamId = team.id + 1, // 이것만 team.id 로 바꾸면 team 접근 시 select 로그가 찍히지 않습니다. ) em.persist(member) em.clear() } test("my test") { val members = sut.listMembers() members.shouldNotBeEmpty() val team = members.first().team println(team) } }, )어차피 조회한 엔티티에 변경을 가하지는 않을 것이라, Member 엔티티를 detach 시키고 team 에 접근하면 lazy loading 이 안될까 싶어서 해보았는데 여전히 lazy loading 이 되더라구요 ^^;일단 @QueryProjection 을 붙인 별도의 DTO 를 정의해 아래와같이 쿼리하는 식으로 해결하려고 하는데 더 좋은 방법은 없을까요?class MemberDto @QueryProjection constructor( val id: Int, val teamId: Long? = null, val name: String? = null, val teamName: String? = null, ) @Service @Transactional(readOnly = true) class MemberService : QuerydslRepositorySupport(Member::class.java) { private val member = QMember.member private val team = QTeam.team fun listMembers(): List<MemberDto> { val members = from(member) .select(QMemberDto(member.id, member.teamId, member.name, team.name)) .leftJoin(member.team, team) .fetch() return members } }감사합니다.
-
해결됨만들면서 배우는 리액트 : 기초
강의 6분 후반부~7분 부분에서 handleFormSubmit의 검증전 에러메시지초기화(setErrormessage)에 대한 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.setErrormessage가 handleFormsubmit함수 안에 있게 되면,만약한글로 입력창에 "나나나" 이렇게 치면 에러메시지가 "한글은~"이라고 뜰 것입니다.이 때 따로 한글로 인풋이 들어간다고해서 전송이 안되는게 아니니까 이 상태로 전송하면,setErrormessage(handleFormsubmit)에 의해 초기화 될 것입니다. 이후 글자를 하나라도 지우면 handleInputchange에 따라서 검증되고, "한글은~"메시지가 뜰 것입니다. 여기서 질문이와 같이 동작하는 게 맞을까요?이러한 동작이 맞다면 handleFormSubmit안의 setErrormessage는 사용하는 이유가 없고, 오히려 없는게 자연스러워 보이는데 (없게 되면 한글만 입력하고 전송버튼 눌러도 에러메시지("한글은 입력할 수 없습니다")가 남아있음) .. 제가 어느 부분을 놓치고 있는 걸까요?
-
미해결Three.js로 시작하는 3D 인터랙티브 웹
깊게 파려면 어떤 지식들이 더 있을까요?
혹시 본 강의에서 다루고있지 않지만 필수적인 web 3D 지식들이 있다면 뭐가있을까요?최적화에 관한 부분이나 깊게 파고들만한 부분이 더있는지 궁금합니다