묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
주문에서 orderItem
주문하는 메서드에서 주문상품을 생성하는데 여러개의 상품을 주문할 때도 가능한 건가요?? 그럼 itemId가 여러 개 있어야 하는 건 아닌지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
섹션3 - 새로운 할인정책 개발에서 테스트 코드 작성 중.
섹션 3 - 새로운 할인정책 개발 강의에서 test 코드에서RateDiscountPolicy discountPolicy = new RateDiscountPolicy();관련하여 질문 있습니다. Q1.다른 test 코드에서는 자료형에 인터페이스 명을 적어서 선언했는데이번엔 구현체 명을 적어서 선언한 이유가 있나요 ? Q2.그렇지 않다면, 인터페이스 명으로 자료형을 선언할 때와 구현체 명을 선언할 때차이점과 어떠한 상황에서 선언이 되어야 하는지 궁금합니다 !
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
강의 도중 말씀에 대한 간단한 질문
안녕하세요 강사님! 수업 너무 잘 듣고 있습니다. 다름이 아니라 설명하시는 도중18:20 가량 부터 잠깐 하시는 말씀에 대해 조금 이해가 덜 된 것 같아서 질문을 좀 드리고 싶어서 글을 남기게 되었습니다. 1. 설계하고 돌려서 테이블 생성된 것을 보고 원하는 대로 만들어졌는지 확인하는 것을 반복하라>> DB 테이블에 칼럼들 들어간 모습들과 내가 원하는대로 들어갔는지 확인하면서 해라! 라는 말씀으로 이해하면 되는 걸까요?2. 생성된 것을 그대로 쓰면 안된다(?)>> 제가 실무를 혼자서 진행해보고 DBA 분들과 얘기를 해본적이 없어서 이해가 잘 안됐을 수도 있는데, 혹시 이부분에서 말씀하시는 그대로 쓰면 안된다는게 어떤 부분인지 조금 더 말씀해주실 수 있을까요? Script 란 DB sql 들어가는 글들을 말씀하시는 것 같은데, 해당 SQL 을 따로 뽑아서 한번 쭉 본 후에 JPA DDL-AUTO 기능을 사용하지 말고 직접 DB workspace 같은 공간에 직접 import 를 해주는 방식으로 하라는 말씀이실까요?도움주셔서 감사합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
keyHolder는 어떻게 작동하나요?
데이터베이스에서 id값을 가져올 때 KeyHolder를 사용하는 것 같은데, 어떻게 작동하는지 자세한 설명이 없는 것 같아서요. 강의를 좀 더 보니 어차피 keyholder를 거의 사용하지 않는 것 같긴 한데.. 그냥 이런게 있다 정도로만 알고 넘어가는게 좋을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 실행 시 문제
테스트 실행 시 아래와 같은 오류가 나는데 어떻게 해결할 수 있을까요..? java.lang.IllegalStateException: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다: localhost" [90067-214] at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:21) at hello.jdbc.connection.DBConnectionUtilTest.connection(DBConnectionUtilTest.java:14) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) 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:1511) 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:1511) 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)Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다: localhost" [90067-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:212) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:437) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:325) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.Driver.connect(Driver.java:59) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:17) ... 70 moreCaused by: java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다 at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:244) at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:263) at java.base/java.io.DataInputStream.readInt(DataInputStream.java:393) at org.h2.value.Transfer.readInt(Transfer.java:270) at org.h2.engine.SessionRemote.done(SessionRemote.java:603) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:163) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) ... 76 moreProcess finished with exit code -1
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ViewResolver 구현체를 찾는 방식
안녕하세요!논리 뷰 이름 획득 이후 적합한 ViewResolver를 찾는 방식에 대해 질문드립니다.HandlerAdapter 때와 비슷하게 ViewResolver에 메시지를 보내 특정 논리 뷰 이름에 대응하는 View를 생성할 수 있는 ViewResolver인지(?) 확인하는 방식으로 찾게 되는건가? 하고 생각했는데 이러한 방식이 맞는 것일지 궁금합니다!감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요. 스프링 정복 로드맵 db2편까지 완강하고 수강하는 학생입니다.
스프링 정복 로드맵 2편까지 완강 후 jpa 활용 1편을 듣고 있는데요.아무래도 시간이 좀 지난 강의라 db2편에서 들었던 jpa와 jpa 활용에서 듣는 jpa간에 셋팅이 다른 점이 있는데요.(entitymanager에 @persistencecontext 를 달아주시거나, 테스트하시면서 resources에 schema 를 설정하시는 대신 spring.jpa.hibernate.ddl-auto=create 를 설정하시는 등)db2편이 최신이므로, db2편을 기준으로 확장해나가는 편이 나은지 혹은 jpa shop에서 하시는 것을 새로이 기준으로 하면 좋을지 여쭤봅니다!별개로 강의는 항상 잘 듣고 있습니다.감사합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
객체 생성을 막기위한 abstract 클래스 선언
안녕하세요 영한님! JDBC 이해 강의를 듣던 중 사소한 거지만 궁금한 점이 생겨서 질문드리게 되었습니다.ConnectionConst 객체의 경우, static 멤버만을 저장하는 객체이기 때문에 의도치 않은 외부로 부터의 객체 생성을 막고자 abstract 추상 객체로 선언해 주셨다고 이해하였는데요.public abstract class ConnectionConst { public static final String URL = ... .... }단순히 객체 생성만을 막고자 한다면 abstract이 아닌 private 생성자를 선언해주는 방법도 있을것 같습니다.혹시 두 방식의 장단점이나 차이점이 있을까 해서 질문 드려봅니다!
-
미해결스프링 핵심 원리 - 기본편
주문 서비스를 변경하지 않아도 된다라고 하는데요
주문과 할인 도메인 설계 강의 8:00 부터입니다.회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다고 하시는데 이전 강의 중 회원 도메인 설계에서 문제점으로 OCP, DIP 전부 다 위반한다고 하셨습니다. 이렇게 위반을 하니까 스프링을 사용해야 하는 것 같고요. 이 강의도 마찬가지로, OrderServiceImpl에서 private final MemberRepository memberRepository = new MemoryMemberRepository(); 를 사용함으로써 '회원을 메모리가 아닌 실제 DB에서 조회'하면 OrderServiceImpl 파일의 내용도 변경되어야 한다고 생각합니다. '회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다' 틀린 말 아닌가요?
-
해결됨스프링부트 시큐리티 & JWT 강의
시큐리티 필터보다 MyFilter1()을 먼저 실행하는 이유가 궁금합니다.
안녕하세요 강의 잘 듣고있습니다. 감사합니다.강의를 듣다가 MyFilter1()이 시큐리티 필터보다 먼저 실행되야 하는 이유가 궁금해서 질문드립니다.항상 잘 듣고 있습니다.감사합니다.
-
해결됨스프링 핵심 원리 - 고급편
쓰레드로컬관련 질문이 있습니다.
안녕하세요.수업을 듣다가 궁금하여 질문드립니다.. FiedlLogTrace는 빈으로 등록하여 작동하니, 동시성 문제가 있어 쓰레드 로컬을 사용하였는데 @Controller, @Service 이러한 것들도 빈으로 등록이 되는 것인데 이러한 것들은 동시성 문제와 관련이 없는건가요? 바보같은 질문이지만.. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
중첩 bean validation 질문입니다.
안녕하세요? 지난번에 Collection Bean 검증 관련해서 질문 글을 올렸었어요. 지난번 글은 아래 링크를 통해서 보실수 있습니다.https://www.inflearn.com/questions/639710Collection Bean 검증까지도 잘 되었고 1차 중첩 검증 까지는 잘 되었었습니다. 코드를 보여드리자면...@Component @Slf4j @RequiredArgsConstructor public class CollectionValidator implements ConstraintValidator<CustomValid, Object> { private final ElementValidator validator; @Override public void initialize(CustomValid constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); } @Override public boolean isValid(Object values, ConstraintValidatorContext context) { log.info("validator 로직 실행 {}", values.toString()); DataBinder dataBinder = new DataBinder(values); BindingResult bindingResult = dataBinder.getBindingResult(); //bindingResult를 생성해서 전달 validator.validate(values,bindingResult);//필드에 선언된 어노테이션에 따라 검증 if(bindingResult.hasErrors())return false; return true; } }//지난번 글에서 David님의 조언에 따라 수정되었습니다.@Data public class Item { @CustomValid private PatternDto pattern;//내부에는 phonNumber라는 필드와 @Pattern으로 전화번호 형식인지 검사합니다 public Item() { } } @PostMapping("/nested") public Object nested(@RequestBody @Validated Item item){ return item; }여기까지는 검증이 잘 되었습니다. 즉 POST: /nested 로 아래 형식으로는 잘 검증이 되었습니다.{ "pattern" : { "phoneNumber":"01045309731" } } 하지만 PatternDto안에 새로운 객체 ItemValid를 넣고 검증 어노테이션을 추가하게 되면 ItemValid에 대한 검증이 되지 않아요.즉, 정리하자면 POST: /nested url로 Item 객체에 선언된 PatternDto pattern 필드 객체는 검증이 잘 되지만, PatternDto 클래스 안에 있는 ItemChild의 @Min(10) value에 대한 검증은 이뤄지지 않네요.@Data @NoArgsConstructor public class ItemChild { @Min(10) private Long value; }@Data @EqualsAndHashCode @NoArgsConstructor public class PatternDto { @Pattern(regexp = "^01(?:0|1|[6-9])[.-]?(\\d{3}|\\d{4})[.-]?(\\d{4})$", message ="잘못된 번호 형식입니다.") private String phoneNumber; @CustomValid private ItemChild itemChild; }이렇게 domain을 수정 후에 다음과 같이 요청을 보내면{ "pattern" : { "phoneNumber":"01045309731", "itemChild":{ "value":10 } } } 아래 사진과 같은 에러가 나옵니다.구글링 해도 잘 안나오는데 어떻게 해결할 수 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드
왜 연관관계 메서드에서 어떤 건 set이라고 하고 어떤 건 add라고 하나요??ex. setMember() / addOrderItem() //== 연관관계 메서드 ==// public void setMember(Member member) { 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); }setMember는 member.getOrders()라고 하고 setDelivery()는 setOrders()로 다른 이유는 무엇인가요?? 여기서 this는 order를 의미하는 걸까요??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
질문이 있습니다.
private List<OrderItemQueryDto> findOrderItems(Long orderId) { return em.createQuery( "select new jpabook.jpashop.repository.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" + " from OrderItem oi" + " join oi.item i" + //이걸 왜 하는거지 => 실 객체바꿀라고? " where oi.order.id = :orderId", OrderItemQueryDto.class ).setParameter("orderId", orderId).getResultList(); }위 코드에서 "join oi.item" 하는 이유가 궁금합니다.OrderItem엔 Item이 있으니 i.name 대신 oi.item.name하여도 될 것 같은데 굳이 Item도 조인하는 이유가 있을까요? 제가 생각한 결과로는 Item을 조인하여 i.name할 때 Item이 프록시에서 실 객체로 바뀌니 이것을 위해 조인하였을 것 같은데 맞을까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
분산락 관련 질문입니다.
안녕하세요 좋은 강의 감사드립니다.이전까지 알아보았던 락들은 분산락이 아닌 것인가요?만약 아닌 것이라면 다중 서버 환경에서 동시성 문제를 해결하기 위해서는 위의 방법들이 아닌 분산락을 사용하여야 하는 것인지 궁금합니다. 추가로 동시성 관련 질문이 하나 있습니다.다중 서버 환경에서 게시판 등에서 조회수 기능을 동시성 문제 없이 해결하고 싶으며, 다음과 같이 구현하고자 합니다.(조회수라 어느정도 누락되어도 상관 없다고 하실 수 있겠지만, 목표는 하나도 누락되지 않게 하는 것입니다!)조회 요청이 들어오면 레디스에 조회수 증가분을 올린 이후, 특정 시간마다 배치처리를 통해 반영하고자 합니다.이때 다음 두 의문점이 있습니다.먼저 다중 서버 환경에서 레디스 증가분을 올리는 경우, 이 경우에도 동시성 문제가 발생할 수 있을 것 같습니다. 이를 해결하기 위해서는 이곳에도 분산락을 걸거나 increment()를 사용하여 동기적으로 처리해야 할 거 같은데 저의 생각이 맞는 것인지, 맞다면 다른 방법은 없는지 궁금합니다.두번째는 레디스 조회수 증가분을 배치처리를 통해 반영시키는 경우, 해당 작업 사이에 조회수 증가가 되어버리면 해당 증가분은 누락될 것 같습니다. 이를 해결하기 위해서는 배치처리를 할 때 레디스에 Lock을 걸어야 할 것 같습니다. 그런데 그렇게 된다면, 배치처리가 진행되는 그 순간동안은 레디스가 블로킹되어 있기에 게시글 조회가 이루어지지 않을 것 같습니다. 이정도는 감수하고 사용하거나, 혹은 카프카 등을 활용하여 이벤트로 처리하는 방법도 있을 것 같은데, 이러한 방법이 모두 사용 가능한 것인지, 더 나은 방법은 없는지 궁금합니다. 너무 많은 질문을 하는 것 같아 죄송합니다. 좋은 강의 정말 감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
dto 설계시 궁금증
위와같이 Form의 필드가 4개라고 했을 때각각을 입력하거나 입력하지 않는 경우 총 2^4 = 16개입니다.그렇다고 하면 dto에 입력 경우의 수에 따른 변경감지 로직을 총 16개 작성해 두어야하는건가요? 어떻게 설게를 해야하는지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
createMember, createItem 메서드
테스트 클레스에createMember, createBook 메서드를 만들었는데이걸 domian에 생성하고기본 생성자를 protect로 만들어놓으면OrderItem에서 했던 방식처럼더 나은 방식인건가요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
/orders에서 화이트라벨페이지가 뜹니다..
짧은 지식으로 추측컨데,html파일에 문제가 있는것으로 판단해 몇차례 확인 후 복붙을 시도해보았습니다매핑을 잘못한것인가 컨트롤러도 수차례 확인하였고...혹시 관련된 비지니스로직에서 데이터를 잘못 불러오는것인지,,데이터를 백업해두고,강의 초반에 있는 소스코드를 통해java 부분과 templates을 통채로 복사해보았음에도, 해결이 되지 않습니다.최대한 혼자서 해결하려 했으나... 도저히 해결방안이 떠오르지 않아서 질문드립니다.어째서 이러한 문제가 발생하는것일까요...?ㅜㅜ하단에 구글드라이브 링크 첨부해두었습니다. 도와주세요...ㅠㅠ야생형 코스로 활용 -> 기본 -> 활용 단계로 복습하는 시점이라..(1회차에선 멀쩡히 넘겼던 부분을 2회차때 도저히 못고치는 기현상...... ㅜㅜ)아티펙트, 그룹명이 jpabook2 , jpashop2 로 설정되어 있습니다. 이점 양해 부탁드립니다..https://drive.google.com/file/d/1gY3cQKM2yq8SsObwAMAbk3gKOScsx6Jp/view?usp=sharing
-
해결됨생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
10:30쯤에 나오는 ErrorCode에서 TEST를 만드는 방법에 대해 질문 있습니다
@Getter public enum ErrorCode { TEST(HttpStatus.INTERNAL_SERVER_ERROR, "001", "business exception test"); ErrorCode(HttpStatus httpStatus, String errorCode, String message) { this.httpStatus = httpStatus; this.errorCode = errorCode; this.message = message; } private HttpStatus httpStatus; private String errorCode; private String message; } httpStatus, errorCode, message를 위에 올리고 TEST를 만들면 오류가 생기는데, 위 소스처럼 httpStatus, errorCode, message를 아래로 내리면 오류가 없어집니다. 어떤 기능인지 궁금한데요. 검색 키워드라도 알려주시면 감사드리겠습니다
-
미해결스프링 핵심 원리 - 기본편
테스트코드 작성시 메소드
MemberServiceTest 코드를 작성할 때 영한님 코드를 보면 join 메소드를 default로 선언하시고 실행하고 정상적으로 테스트에 성공하셨습니다. 하지만 제 환경에서는 에러가 발생하네요 해당 에러코드를 확인 후 join 메소드를 public으로 선언하니 정상적으로 테스트에 성공했습니다.제가 아직 JUnit에 대한 이해가 충분하지 않지만 혹시 어떤 원인 때문에 package-private 메소드인 join에 접근하지 못하는지 궁금합니다. 혹은 어떤 키워드로 검색해보면 좀 도움이 될까요?감사합니다.