묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
MemberServiceTest 회원가입 오류
안녕하세요 질문 사항이 있어 글을 남깁니다. 구글링을 통해 Member findMember = memberService.findOne(savId).get(); 부분이 오류가 있다는 것을 알았습니다. 그리고 나서 다시 로직을 보면서 다시 하여도 똑같은 오류가 발생해 글을 올립니다. MemberServiceTest package com.test.inflearn.service;import com.test.inflearn.domain.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import java.util.Optional; //회색import static org.junit.jupiter.api.Assertions.*; /회색class MemberServiceTest { MemberService memberService = new MemberService(); @Test void 회원가입() { //given (뭔가가 주어졌을 때) Member member = new Member(); member.setName("hello"); //when (이걸로 실행 했을 때) Long savId = memberService.join(member); //then (결과가 이게 나와야 한다.) Member findMember = memberService.findOne(savId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); } @Test void findMembers() { } @Test void findOne() { }} MemberService package com.test.inflearn.service;import com.test.inflearn.domain.Member;import com.test.inflearn.repository.MemberRepository;import com.test.inflearn.repository.MemoryMemberRepository;import java.util.List;import java.util.Optional;public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /** * 회원 가입 */ public Long join(Member member) { //같은 이름이 있는 중복 가입 X validateDuplicateMemory(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMemory(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원 입니다."); }); } /** *전체 회원 조회 */ public List<Member> findMembers() { return memberRepository.findAll(); } public Optional<Member> findOne(Long memberId) { return memberRepository.findById(memberId); }} repository = MemberRepository(인터페이스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.List;import java.util.Optional;public interface MemberRepository { Member save(Member member); Optional<Member> finById(Long id); Optional<Member> findByName(String name); List<Member> findAll(); Optional<Member> findById(Long memberId);// Optional<Member> findById(Long memberId);} repository = MemberRepository (클래스) package com.test.inflearn.repository;import com.test.inflearn.domain.Member;import java.util.*;public class MemoryMemberRepository implements MemberRepository { private Map<Long, Member> store = new HashMap<>(); private static long sequence = 0L; @Override public Member save(Member member) { member.setId(++sequence); store.put(member.getId(), member); return member; } @Override public Optional<Member> finById(Long id) { return Optional.ofNullable(store.get(id)); } @Override public Optional<Member> findByName(String name) { return store.values().stream() .filter(member -> member.getName().equals(name)) .findAny(); } @Override public List<Member> findAll() { return new ArrayList<>(store.values()); } @Override public Optional<Member> findById(Long memberId) { return Optional.empty(); } //test 를 한번 할때 마다 지워준다. public void clearStore() { store.clear(); }} domain = Member package com.test.inflearn.domain;public class Member { private Long id; private String name; //get, set public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }} 오류 메시지 at java.util.Optional.get(Optional.java:135) at com.test.inflearn.service.MemberServiceTest.회원가입(MemberServiceTest.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) 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.util.ArrayList.forEach(ArrayList.java:1259) 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.util.ArrayList.forEach(ArrayList.java:1259) 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:71) 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)
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
grouping과 Collectors.toList의 차이가 무엇이고 emtrySet()은 무슨 기능인가요?
grouping과 Collectors.toList의 차이가 무엇이고 emtrySet()은 무슨 기능인가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원과 주문의 양방향 연관관계가 실무에서는 주문이 회원을 참조하는 것으로 충분하다면
아무래도 회원과 주문이 존재한다면 주문 내역 조회같은 로직이 거의 포함된다고 생각합니다! 이럴 때는 양방향 매핑 관계를 통해 조회하는 것이 좋은지, 아니면 주문 테이블에서 member.getId()로 select 쿼리문을 날려서 조회하는 것이 좋은지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
현재 테스트예시에서의 BeforeEach 현업에서 사용
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 예시에서는 각 서비스별로 연관되는 부분이 없어 BeforeEach를 사용하지 않아도 되지만, 테스트시 연관을 끊는 의도에서 BeforeEach를 사용하는것으로 이해했습니다. 현업에서도 각 메소드에 연관되는 부분이 없더라도 인스턴스생성시에 나눠주는편이 좀더 바람직하다고 볼수 있을까요? 연관되는부분이 있는지 파악하는것도 시간소요이고 실제 빌드시에 테스트코드는 빠지기 때문에 더하는편이 덜하는편보다 낫지 않을까 하는 판단입니다. 아직 직무경험이 없고 배우는 입장이라 이런식의 사고방향이 맞는것인지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
상품 주문시 에러가 발생합니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.delivery -> jpabook.jpashop.domain.Delivery 어떤 부분에서 문제가 생기는지 못찾아서 전체 파일 첨부합니다.. https://drive.google.com/drive/folders/1I0oUU741fn4nApLLQ-e_16pY0H-dywyz?usp=sharing
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
책에 페치 조인 대상에는 별칭을 줄수 없다. 라고 나와서 궁금증이 생겼어여
책 381쪽에 보면 페치 조인 대상에는 별칭을 줄 수 없다라고 나오고, 대신 하이버네이트같은 몇몇 구현체는 지원해 준다고 나와있더라구요 "select distinct o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", 위와 같은 JPQL에서 o.orderItems 과 페치조인하고 oi로 별칭을 주었는데, 이 별칭을 활용하여 join fetch oi.item i 처럼 또 페치조인을 하는데... JPA에서 공식 스펙은 아니지만 하이버네이트가 잘 지원해주는 것 맞나요? 최종 질문은 저렇게 페치조인 대상에 별칭주고 거기서 또 페치조인해서... 잘 써도 되는지 궁금합니다. JPA의 공식스펙이 아닌것 같은데 문제없이 동작하는지.. (위 같은 경우는 당연 일대일이나 다대일에서만 쓸것입니다)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit5로 테스트 작성하기
메세지 검증방식으로 해보았습니다. Junit5로 시도하는분들에게 도움이 되길~ public class NotEnoughStockException extends RuntimeException{ @Override public String getMessage() { return "재고가 모자랍니다"; } } NotEnoughStockException thrown = assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), order)); assertEquals("재고가 모자랍니다", thrown.getMessage());
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
윈도우 명령어 관련 질문입니다.
윈도우는 h2.bat으로 접속을 했습니다. 2:08 부분에서 ll 와 ls - arlth 명령어를 통해 jpashop.mv.db가 생성되는 것을 확인할 때 윈도우 명령어로는 어떻게 진행해야 할까요? 보시는 것처럼 연결하게 되면 키 입력이 먹히지 않아 확인을 어떻게 해야할지... 윈도우 명령어랑 리눅스 명령어 비교를 해보려고 찾아봤는데 딱 맞는게 없는거 같아서 질문드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
repository 생성이유
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 좋은강의 감사합니다!! 다름이아니라, MemberRepository를 따로 만드는 이유에 대해서 아직 궁금증이 안풀려서요! MemberRepository 인터페이스에서 메서드를 꺼내서 쓰는 것 보다는 MemoryMemberRepository(implement로 인터페이스 구현을 하지않고) 메서드를 직접 쓰는게 낫지 않나 해서요! 결론적으로 굳이 repository 인터페이스를 만드는 이유에 대해서 궁금합니다!
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
actuator/refresh 호출 시 오류 문의
안녕하세요. POSTMAN에서 POST방식으로 호출하는 경우, ConfigService쪽에 아래와 같은 오류가 발생합니다. 잘못 입력한 부분이 있는지 확인 부탁 드립니다. 1. user-service yml spring: application: name: user-service cloud: config: name: ecommerce config: import: optional:configserver:http://127.0.0.1:88882. config-service yml server: port: 8888spring: application: name: config-service cloud: config: server: git: uri: file://D:\\Projects\\intelliJ\\git-local-repo 3. 오류로그 org.springframework.cloud.config.server.environment.NoSuchLabelException: No such label: main at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:314) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.getLocations(JGitEnvironmentRepository.java:262) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.getLocations(MultipleJGitEnvironmentRepository.java:139) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository.findOne(AbstractScmEnvironmentRepository.java:55) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOneFromCandidate(MultipleJGitEnvironmentRepository.java:188) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository.findOne(MultipleJGitEnvironmentRepository.java:173) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.CompositeEnvironmentRepository.findOne(CompositeEnvironmentRepository.java:64) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentEncryptorEnvironmentRepository.findOne(EnvironmentEncryptorEnvironmentRepository.java:61) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.getEnvironment(EnvironmentController.java:134) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.EnvironmentController.defaultLabelIncludeOrigin(EnvironmentController.java:116) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.3.21.jar:5.3.21] at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:485) ~[spring-cloud-context-3.1.3.jar:3.1.3] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.21.jar:5.3.21] at org.springframework.cloud.config.server.environment.EnvironmentController$$EnhancerBySpringCGLIB$$dc31df60.defaultLabelIncludeOrigin(<generated>) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:577) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.21.jar:5.3.21] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.21.jar:5.3.21] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.64.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.21.jar:5.3.21] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.21.jar:5.3.21] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1787) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.64.jar:9.0.64] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref main cannot be resolved at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:223) ~[org.eclipse.jgit-5.12.0.202106070339-r.jar:5.12.0.202106070339-r] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.checkout(JGitEnvironmentRepository.java:468) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] at org.springframework.cloud.config.server.environment.JGitEnvironmentRepository.refresh(JGitEnvironmentRepository.java:307) ~[spring-cloud-config-server-3.1.3.jar:3.1.3] ... 65 common frames omitted
-
미해결실전! 스프링 데이터 JPA
안녕하세요 영한님! 네이티브 쿼리 사용이 적절한 상황인지 궁금해서 질문드려요
우선 제가 하려는 동작은 "특정 브랜드의 카테고리별 상품의 최저가의 합" 을 구하는 쿼리를 작성해야했었고 결과물 쿼리는 " select sum(temp_mins.mins) as total from ( select min(price) mins from product where brand_num = ? group by category_num) as temp_mins" 위처럼 작성했습니다. 코드는 @Query(value = "select sum(temp_mins.mins) as total from (select min(price) mins from product where brand_num = ? group by category_num) as temp_mins", nativeQuery = true)Integer sumLowestPriceEachCategoryByBrand(Long brandNum); 입니다. queryDsl이나 JPQL에선 from절의 서브쿼리 기능을 제공하지 않는다고 파악되어서 고민끝에 네이티브 쿼리까지 왔는데요.현재 강의에서 네이티브 쿼리의 대표적인 단점으로 뽑아주신게 반환타입 부분으로 학습했는데 제 생각으로는 단순한 박싱 타입으로 반환하기 때문에 크게 문제가 없다고 생각됩니다. 혹시 위 코드가 네이티브 쿼리를 사용하는데 적절한 상황일까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
클릭해서 해당 클래스로 이동
강의 7분50초처럼 다른 곳에서 클래스를 클릭할때, 해당 클래스로 이동하는 설정은 어떻게 하는 것인가요? 윈도우 사용중인데 안 되어서 질문 드립니다. 단축키는 ctrl+B인것을 아는데 클릭해서 가는건 어떻게 하는지 모르겠네요 ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
test 부분에 대하여 질문 드립니다!
안녕하세요! 좋은 강의 감사드립니다. test 부분에서 메모리에 기록이 남아 있어서 afterEach method를 작성하여서 이전 기록을 지우는 걸로 이번 강의에서 배웠는데 동일한 이름을 가진 기록("spring1", "spring2") 때문에 에러가 발생하는 걸까요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
BeanCreationException 질문드립니다.
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: jpabook.jpashop.domain.item.Item.categories[jpabook.jpashop.domain.Category] 이런 에러가 발생합니다. 코드 첨부합니다. 해당 부분을 지우면 문제없이 돌아가요.. package jpabook.jpashop.domain;import jpabook.jpashop.domain.item.Item;import lombok.Getter;import lombok.Setter;import javax.persistence.*;import java.util.ArrayList;import java.util.List;@Embeddable@Getter@Setterpublic class Category { @Id @GeneratedValue @Column(name = "category_id") private Long id; private String name; @ManyToMany @JoinTable(name = "category_item", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "item_id")) private List<Item> items = new ArrayList<>(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); public void addChildCategory(Category child) { this.child.add(child); child.setParent(this); } protected Category(){}} package jpabook.jpashop.domain.item;import jpabook.jpashop.domain.Category;import lombok.Getter;import lombok.Setter;import javax.persistence.*;import java.util.ArrayList;import java.util.List;@Entity@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn(name = "dtype")@Getter @Setterpublic abstract class Item { @Id @GeneratedValue @Column(name = "item_id") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<Category>();}
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
혹시 강의에 자막은 없을까요?
안녕하세요 다름이 아니라 강의에 따로 자막 기능은 없을까요? 혹은 추가 할 수 있는 방법은 없을까요?ㅠ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문할 때 상품 여러개 선택하는 기능 추가
안녕하세요, 이 프로그램을 좀 더 발전시켜보고 싶은데요 주문할 때 상품을 여러개 선택하도록 만들고싶은데, 이렇게 하려면 상품과 주문 수량을 골랐을 때 다시 화면에 추가로 선택 칸이 만들어져야 할 것 같습니다. 이 기능을 혹시 스프링과 타임리프 만으로 구현할 수 있나요, 아니면 자바스크립트를 공부해서 만들어야 할까요? 대략적인 가이드라도 조언 부탁드립니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
stream
안녕하세요! 6:40초 쯤에 보면, 이 코딩이 이해가 잘 가지않아 질문을 드리게 되었습니다. 이 부분이 stream + 람다식 문법을 사용한게 맞을까요? 아래처러머 제가 이해한 게 맞는지 궁금합니다 ㅠㅠ.. store라는 참수변수의 value(값)을 stream을 통해 읽고, filter()를통해 데이터를 걸러내고 마지막 최종연산으로 findAny()로 name을 찾아낸다.. 가 맞을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
질문있습니다!!
강의를 보던 중에 연관 관계 메소드에 관련되어서 질문이 있습니다. Category 클래스에서 보면 엔티티 안에서 멤버 변수들끼리 양방향 관계를 맺는 parent랑 child가 있는데 아래 코드가 잘 이해가 안됩니다. this.child는 멤버 변수 child를 의미하는데 child 리스트 안에 파라미터인 child를 넣는다는 뜻인건가요? 그리고 child.setParent에는 왜 this가 들어가나요..? this는 객체 자신인 Category라고 알고 있는데 제가 잘못 안건가요? public void addChildCategory(Category child){ this.child.add(child); child.setParent(this);}
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링 데이터 JPA 메서드 두 번 호출 이슈
리파지토리에 스프링 데이터 JPA를 적용하고 AOP를 실습해본 결과 리파지토리 메서드들이 두 번 호출되고 있습니다. 이유를 찾고자 구글링도 해봤는데 명확한 답을 못찾았네요.. 원인과 이유를 찾을 수 있는 디버깅 방법을 알 수 있을까요? Service Join 호출 로그
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JDBC 강의 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 인텔리제이나 h2 콘솔에서 에러가 뜨지는 않습니다. 그런데 localhost8080에 접속하여 수강 목록에 들어갔을때 새로운 창으로 넘어가지 않고, 가입창에서 입력을 했을때도 데이터베이스에 저장이 되거나 홈화면으로 리다이렉트되는 등의 조치가 시행되지 않습니다.. 무엇이 문제인지 궁금합니다. 감사합니다. https://drive.google.com/file/d/1j3y1a2OuGRsjAHbAITL-iFoAPqClJgbr/view?usp=sharing