영한 쌤!!! @Transactional을 Service에 말고 Repository에 달면 안되나요? 그리고 @Transactional 은 Test 폴더 안에서만 rollback을 시키는건가요? 아니면 SpringBootTest 어노테이션 안에서만 rollback 이 되는건가요?
안녕하세요 영한님!!! 요즘 진행중인게 있어서 아직 새강의를 못들었어요 ㅜㅜ 요번 추석날때 외할머니집 가서 들으려고 하는데 기대가됩니다 ㅎㅎ! 이번 질문은 다름이 아니고 현재 modelMapper.map() 메서드를 이용해서 dto 에 있는 정보를 엔티티에 집어넣으려고 하는데, 해당 메서드가 엔티티에 setter 메서드 들이 존재할 때에만 작동을 하는 것 같더라구요 빌더패턴 또한 setter가 돌아가는데, setter사용을 지양해야하는데, 영한님의 경우에는 빌더패턴을 사용을 안하시나요? 그리고 modelMapper.map() 메서드도 지양하시는 편인가요?? 분명 해당 내용이 로드맵 강의 중 1개 강의에서 다뤘었고 현직자 분이 올린 질문글에도 빌더패턴과 관련해서 질문이 있었던걸로 기억해서 찾으려고하는데 안찾아지네요 ㅜ.ㅜ
intellij 커뮤니티 버전을 사용하다가 학생 버전을 설치해 쓰려고 했는데.. 잘 인식하던 스프링부트 프로젝트가 자바 파일을 인식하지도 못하고, gradle의 라이브러리도 인식을 못하는것 같아 질문드립니다. 기존에 사용하던 커뮤니티 버전은 삭제했습니다. 이렇게 자바 파일을 아예 실행할 수 없는 상황입니다.. 1. intellij에서 바로 자바를 실행해보려 했으나 Gradle project 메뉴가 보이지 않습니다. 2. 프로젝트 다시 클론을 받거나 재빌드를 해도 그대로입니다. 3. src 폴더를 강제로 source root로 설정하면 자바 파일은 실행이 되나 어노테이션이 전부 인식되지 않고, 다음과 같은 에러메세지를 뱉어냅니다. 시도해본 방법은 이정도이고.. github에 올려놓고 mac과 window에서 같이 사용중인데 window에서만 이런 문제를 겪고 있습니다. https://github.com/eprj453/inflearn_spring 위의 repository에 2개의 springboot 프로젝트에서 모두 나타나는 문제입니다. 여러 방면으로 몇시간동안 찾아봤는데 해결되지 않아서 질문 올립니다. 새로 스프링부트 프로젝트를 생성하면 잘 작동하던데.. 다 밀고 다시 만드는 방법밖에는 없을지..ㅜㅜ
김영한님 안녕하세요. 먼저 JPA를 사용함에 있어서 정말 중요한 지식들을 쉽고 좋은 강의를 통해 공유 해주심에 감사 드립니다. 개인적으로 작은 사이드 프로젝트를 진행 하면서 스프링 데이터 JPA를 공부하는 도중에 궁금한 점이 생겨서 이렇게 질문을 드리게 됐습니다. 현재 간단한 조회 쿼리는 스프링 Data JPA의 쿼리 메서드를 통해 해결하고 있고, 강의에서 언급 하셨던 And가 두 개 이상 붙는 조회 쿼리는 JPQL을 통해 해결하려 하고 있습니다. 이 때 JPQL, EntityManager를 직접 사용하는 Repository와 JpaRepository 인터페이스를 분리해서 사용하는 방법, 그리고 @Query 애노테이션을 활용하여 인터페이스 한 곳에서 JPQL을 함께 관리 하는 두 방법 중 어떤 방식이 더 컨벤션에 가까운지 궁금 합니다. 현재 제가 진행하는 사이드 프로젝트는 너무 작은 규모라 사실 한 인터페이스 안에 모든 로직이 다 들어가도 상관이 없겠지만 정말 규모가 큰 실무에서는 어떻게 하는지, 구체적으로는 JPQL도 객체지향 쿼리이기는 하나, 직접 SQL을 짜야 한다는 관점에 있어서는 Dao같은 것으로 따로 분리 해서 관리를 하는건 아닐까? 라는 의문이 들었습니다. 그리고 결국 JPA는 Spring Data JPA, JPQL, QueryDSL 세 가지 기술을 함께 사용 하게 된다는 말씀을 강의 중에 하셨는데요. 이 세 가지 기술을 모두 적용하는 경우에는 Repository가 어떤 구조로 관리가 되는지 알고 싶습니다. 실무 경험도 없고 아직 한창 공부하는 입장이다 보니 이런 질문이 조금은 낯설게 느껴지실 수도 있다는 생각이 드네요 :) 개발 공부가 쉽지 않아서 종종 지칠때도 있는데 영한님 강의 볼 때마다 긍정적인 에너지를 얻어가며 즐겁게 공부 하고 있습니다. QueryDSL강의와 이번에 내주신 스프링 강의까지 열심히 잘 듣겠습니다. 감사합니다.
안녕하세요 복습하면서 궁금한 점이 생겼는데요 OrderItem 클래스에서 만든 비즈니스 로직과 조회로직에서 getItem, getOrderPrice 그리고 getCount 사용하셨는데 get없이 그냥 해도 같은 결과를 얻었습니다. 혹시 get을 사용하신 이유가 있으신가요 ?
안녕하세요? 23분 부터의 내용입니다. DB가 mysql일때는 @SelectKey 와 addContentInfo의 @Insert문은 어떻게 구성하나요? 구글링해도 잘 모르겠습니다...ㅠㅜ @selectkey 쿼리내용을 SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "databaseName" AND TABLE_NAME = "tableName" 로 수정하는게 맞는지 궁금합니다.. 양질의 강의 감사히 보고있습니다!
안녕하세요 김영한강사님. 알찬 강의 열심히 응용중에 문제가 생겼습니다. 다음처럼 Repository 반환값을 List<엔티티> 에서 Stream<엔티티> 로 했을 경우 Controller 에서 엔티티를 받아오지 못하더라구요 MemberRepository . findAll() ---> Stream<Member> 반환 em . createQuery ( "select m from Member m" , Member . class ) . getResultStream () // MemberController 의 addAttr 직전 Stream을 List변환 memberService . findMembers () . collect ( Collectors . toList ()) ; error1 : The object is already closed [90007-199] error2 : could not advance using next() 직감으로는, 닫혔다는것이.. Stream 이라 불변객체여서 변경이 안된다는 이야기로 보이는데 List<Member> 로 싹 바꿔야 되나 고민하고 있습니다. -------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------- LIst<엔티티> 로 바꾸니 문제없이 출력이 되었습니다. 원인이 createQeury().getResultStream() 이었는데 결국 Proxy 를 Stream 에 담은 상태로 불변성이 보장되어서 하이버네이트가 내부에 RealEntity 값을 심어야 되는데 이작업을 할 수 없으니 애러가 나는것이 맞는건가요? 맞다면, Stream은 어느시점에 사용하는것이 좋은가요..?
1. 제가 DAO라는 방식으로 먼저 배워서 repository를 DAO라고 생각하고 이해하고 있는데요. 이게 맞는건가요? 2. repository로 바로 비즈니스로직을 수행을 해도 되는데 service로 나눠준 이유는 사용자들이 동시에 사용할 수 있게 하기 위한거라고 알고 있는데 이게 맞는건가요?
선생님께서 하신 것과 똑같이 하였는데, 아래와 같이 오류가 나는데 어디를 손봐야 할까요? main 에서 아래 한줄만 딱 추가했습니다. Persistence. createEntityManagerFactory ( "hello" ) ; Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43) at org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:86) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:212) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:174) at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:76) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:171) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:119) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:10)
Member m1= em.getReference(Member.class,member1.getId()); System.out.println("m1.getClass() = " + m1.getClass()); Member m2= em.find(Member.class,member1.getId()); System.out.println("m2.getClass() = " + m2.getClass()); System.out.println("m1==m2"+(m1.getClass() == m2.getClass())); System.out.println(" =============== "); 1. 제가 예상한것은 영속성 컨텍스트에 프록시 객체가 담길것이고, 2. find 해서 가져오려 했으나 영속성 컨텍스트에 Member객체가 있기에 db로 안가고 프록시 객체를 그냥 가져와서 true가 나온다... 가 예상이었슴다. 근데 결과는 2번이 약간 달랐죠 일단 db로 쿼리는 select 때린다. 근데 가져온것은 프록시 객체. ㅡㅡ.... 아니 DB왜 간거지... DB까지 간것이 맞고 그 내용까지 JPA 자기 눈으로 직접 보았으나 일단 영속성 컨텍스트에 이미 있으니 DB에서 가지고 온것을 '버리자!!!' 하고 그냥 앞의 프록시 객체를 사용을 하는건가요? 제가 이해한게 맞나여? 강사님
안녕하세요. 강의보면서 질문이 있어 문의 드립니다. (섹션 4. 실전프로젝트 - 인증 프로세스 Ajax 인증 구현) ------------------------------------------------------------------------------------------------------ SecurityConfig 구현은 http.csrf().disable(); 이렇게 설정하고 임의로 CustomUserDetails details = (CustomUserDetails) userDetailsService.loadUserByUsername("userId"); SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(details.getUserInfo(), null, details.getAuthorities())); 사용자 정보를 넣어 (디버깅으로 사용자 조회하여 데이터 들어가는것까지 확인했습니다. authorities 는 ROLE_USER) ------------------------------------------------------------------------------------------------------ 사용하고자 하는 서비스에서 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 호출하여 사용자 정보를 가져오려고 하는데 anonymous_user 라고 나오네요. SecurityConfig 에서 넣은 사용자 정보도 없고요. 강제로 인증되어 사용자 정보까지 가져오려면 어떻게 해야 할까요? ------------------------------------------------------------------------------------------------------ 이렇게 하는 이유는 개발환경에서만 security를 풀어 SecurityContextHolder 를 사용하는 다른 곳에서 security 를 동작했을때와 같은 환경으로 사용하고자 합니다.
안녕하십니까 선생님의 강의 정말 유익하게 잘 보고 있습니다. 다름이아니라 상품주문 test 를 하게되면 ==== 오류 org.springframework.dao.InvalidDataAccessApiUsageException: id to load is required for loading; nested exception is java.lang.IllegalArgumentException: id to load is required for loading 이런식으로 납니다.그래서 id가 자동으로 생성이 안되는내용이라서 @GenereatedValue 가 이미 Item 에 id 에 선언되어있고 혹시나 해서 setId로 id 값 지정후 해보니 그다음으로는 == 오류 전문 java.lang.NullPointerException at jpabook.jpashoop.service.OrderService.order(OrderService.java:41) at jpabook.jpashoop.service.OrderService$$FastClassBySpringCGLIB$$f6e85b24.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) at jpabook.jpashoop.service.OrderService$$EnhancerBySpringCGLIB$$ac50f3a2.order(<generated>) at jpabook.jpashoop.service.OrderServiceTest.상품주문(OrderServiceTest.java:44) 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:686) 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$6(TestMethodTestDescriptor.java:212) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) 이런식으로 NullPointEception 이 일어납니다. 혹시 이렇게 되면 item class가 문제인지 또는 service 와 repository 문제인지 혹시 알고싶습니다.
이클립스 환경인데요, build과정에서 오류가나서 프로젝트를 지우고 다시 불러왔는데 아예 gradle 라이브러리 인식을 못합니다.. ㅠㅠ 구글링을 엄청했는데도 못고쳐서 진도를 못나가고 있어요 The import org.springframework cannot be resolved 오류이름은 이거에요