[리뉴얼] 처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
좋은 강의 해 주셔서 감사합니다. 짧은 시간안에 nosql 이해하는데 많은 도움이 되었습니다. 업무에 적용해봤으면 하는게 있어 문의 드립니다. 아래와 같이 예를 들어보면, 매일 한번씩 배우 평점데이터를 수집하여 1년치 평점 변화를 분석 하고자합니다. 수집되는 배우가 10만명정도되고 한번 수집되는 데이터의 양이 document max size를 초과한다면, 이런 시계열(?) 데이터들은 어떻게 적재를 하는게 맞는건지 문의 드립니다. { 배우이름: 조우진, 평점: 4, 수집날짜: 2021-07-17 } 제가 생각한 방안은 이렇습니다. 1) 한명의 배우는 하나의 Document만 생성. 변경되는 데이터는 배열로 추가. ( 찾아보니 Document max size가 16mb라서.. 데이터가 늘어날수록 제약이 있네요. 한번 수집되는 데이터가 1mb라면 16일만 수집이 되겠네요) 2) 매번 수집되는 배우의 정보를 새로운 Document에 추가. ( 동일한 배우의 여러 Document가 생길경우 비효율적으로 보입니다. 10만명의 배우라면.. 매일 10만개의 document가 생기겠네요..) 3) Collection을 배우별로 분리?? 어떻게 구현은 되겠으나, DB 운영경험이 없어.. 성능이나 이런 부분에 대해 감이 없네요 ^^; 구성 방향이나 공부해야할 부분에 대해 조언좀 부탁드립니다. 감사합니다!!
강사님 안녕하세요. 강의 잘 보고 있습니다. 다름이 아니라 오라클 db 버전을 11로 하신 이유가 있으신가요? 현재 오라클은 19버전만 나와있어서 그것을 다운받으려고 하는데 "지정된 사용자에 대한 acl 설정을 실패했습니다." 라고 하면서 이상한 오류가 떠서 다운이 안받아 지네요 ㅜ
현재 강의에서 Object is possibly null 이라는 에러가 발생하는데 d.ts 파일 들어가서 확인해보면 타입이 유니언으로 string | null 이라서 발생하더라구요. 유니언이 또는 이라는 의미를 가지고있어서 둘중에 하나만 타입이 일치해도 괜찮은걸로 아는데 왜 에러가 발생하는건가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 아래 주석처리 된 테스트는 성공적이었던 테스트입니다. 제 생각에는 orderService.order 에서 문제가 발생하는 것 같습니다. this.member가 null 값이라고 뜨네요 ㅜㅜ @Test public void 상품주문 () throws Exception { //given Member member = createMember() ; Book book = createBook( "시골 JPA" , 10000 , 10 ) ; //when int orderCount = 2 ; Long orderId = orderService .order(member.getId() , book.getId() , 2 ) ; //then Order getOrder = orderRepository .findOne(orderId) ; org.assertj.core.api.Assertions. assertThat (orderId).isEqualTo( 1 ) ; org.assertj.core.api.Assertions. assertThat (member.getId()).isEqualTo( 1 ) ; assertEquals (OrderStatus. ORDER , getOrder.getStatus() , "상품 주문 시 상태는 ORDER" ) ; // org.assertj.core.api.Assertions.assertThat(OrderStatus.ORDER).isEqualTo(getOrder.getStatus()); // org.assertj.core.api.Assertions.assertThat(book.getPrice()).isEqualTo(10000); // org.assertj.core.api.Assertions.assertThat(member.getName()).isEqualTo("회원1"); } @Test public void 주문취소 () throws Exception { //given Member member = createMember() ; Book item = createBook( "시골 JPA" , 10000 , 10 ) ; int orderCount = 2 ; Long orderId = orderService .order(member.getId() , item.getId() , orderCount) ; //when orderService .cancelOrder(orderId) ; //then Order getOrder = orderRepository .findOne(orderId) ; assertEquals (OrderStatus. CANCEL , getOrder.getStatus() , "주문 취소 시 상태는 CANCEL" ) ; assertEquals ( 10 , item.getStockQuantity() , "주문이 취소된 상품은 그만큼 재고가 증가해야 한다." ) ; } java.lang.NullPointerException: Cannot invoke "book.shop.domain.Member.getOrders()" because "this.member" is null at book.shop.domain.order.Order.setMember(Order.java:45) at book.shop.domain.order.Order.createOrder(Order.java:61) at book.shop.service.OrderService.order(OrderService.java:44) at book.shop.service.OrderService$$FastClassBySpringCGLIB$$c7276b73.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) at book.shop.service.OrderService$$EnhancerBySpringCGLIB$$54b15850.order(<generated>) at book.shop.service.OrderServiceTest.주문취소(OrderServiceTest.java:58) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) 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:210) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) 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:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 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:143) 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:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) 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:143) 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:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) 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.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) 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:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) 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:221) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) //==연관 관계 메서드==// public void setMember (Member memebr) { this . member = member ; member .getOrders().add( this ) ; } public void addOrderItem (OrderItem orderItem) { orderItems .add(orderItem) ; orderItem.setOrder( this ) ; } public void setDelivery (Delivery delivery) { this . delivery = delivery ; delivery.setOrder( this ) ; } //==생성 메서드==// public static Order createOrder (Member member , Delivery delivery , OrderItem... orderItems) { Order order = new Order() ; order.setMember(member) ; order.setDelivery(delivery) ; for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem) ; }
TravisCI에서 이번 강의에서 작성한 .travis.yml 파일을 가지고 aws beanstalk에 배포할 때 .yml 파일에는 Dockerfile.dev를 빌드하고 실행하는 내용만 적혀있는데, 돌아가는 과정을 보면 Dockerfile이 배포가 되는 것 같습니다. TravisCI에서 Dockerfile은 언제 읽는지 궁금합니다.
강사님이 워낙 잘 설명해주신 덕분에 기능이나, 어떤 방식으로 돌아가는지는 잘 이해했습니다! 하지만, 개발이 아직 익숙치 않은 입장에서 고민인 것이 실제 혼자서 개발할 때 domain에서 어떤 기능까지 구현해야할지, 어떤 부분을 서비스에서 구현해야할지 저만의 기준이 없어 아직 확신이 들지 않고 각각의 클래스에서 어떤 메서드를 구현해야할지 설계하기가 힘든데 이런 부분은 어떻게 채워가는 것이 좋을까요? 어느정도 정형화 되어 있는 부분이여서 익숙해지는건가요??
이렇게 전체 API Exception을 한 경우와 멤버 API에게만 Exception을 설정한 게 있습니다. 문제는 userHandle(Exception e)를(서버 오류) ApiControllerAdvice에 넣으면 validation 유효 판단을 할 때, signUpValidation을 호출하지 않고, userHandle(Exception e)를 먼저 호출 했었습니다. 그래서 userHandle(Exception e)를 MemberApiController에만 넣었더니 userHandle(Exception e)가 먼저 실행되기보다는 정상적으로 SignupValidation을 실행했는데요. 그러면 Exception(내부 서버 오류용)을 ApiControllerAdvice에 넣지 말고, Member 같은 특정 API에만 모두 공통으로 넣어야 하는건가요?