묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
JPA 와 스프링 데이터 JPA
JPA 기술만 사용 할 때는 간단한 쿼리를 JPA가 SQL로 작성해 주고, 복잡한 쿼리가 필요한 경우 개발자가 JPQL을 따로 작성해서 처리합니다. 스프링 데이터 JPA를 사용 할 때는 간단한 쿼리든 복잡한 쿼리든 JPQL로 작성 해 줍니다. 혹시 여기까지 제가 잘못 이해한 부분이 있을까요? 그리고, 스프링 데이터 JPA에서는 SQL 대신 JPQL을 사용하는데 SQL을 사용하지 않는 이유를 알 수 있을까요?어차피 JPQL은 SQL로 해석되기 때문에 JPQL로 작성하든 SQL로 작성하든 차이는 없을 것 같은데.. 궁금증에 여쭤봅니다. 남은 연휴 잘 보내시고 좋은 하루 되세요~~
-
미해결스프링 기반 REST API 개발
mvn package 시 다음과 같은 에러가 나시면
Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module다음과 같은 에러 나시면 plugin 에<groupId>org.asciidoctor</groupId> <artifactId>asciidoctor-maven-plugin</artifactId> <version>2.1.0</version>버전을 최신으로 업데이트 하심 해결됩니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터 사용 시 핸들러 어댑터의 반환 값
안녕하세요!강의를 들으며 결국 HandlerAdapter는 내부 로직을 통해 핸들러 종류에 관계없이 ModelAndView를 생성해 DispatcherServlet에게 전달해준다고 이해했습니다.그렇다면, @ResponseBody 등을 사용해 HTTP 메시지 바디에 값을 직접 입력하는 경우에도 ModelAndVIew가 반환되나요? ModelAndVIew 가 내부적으로 뭔가 HTTP 메시지 바디를 그대로 들고있을 수 있는 field 같은 것이 있는건지 궁금합니다.감사합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
객체 생성을 막아야하는 이유
https://www.inflearn.com/questions/643569 안녕하세요 ConnectionConst abstract Class 관련해서 위의 질문글에 추가적인 질문인데 왜 외부로부터 객체생성을 막고자 하는 것일까요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO에 @Getter가 필요한 이유
OrderDto, OrderItemDto 같은 DTO에 @Getter 가 필요한 이유가 궁금합니다.또, 요청을 받는 DTO는 요청 받을 필드만 선언하면 되고, 응답용 DTO는 응답하고 싶은 필드만 정의 하여 생성자를 만들면 되는지 궁금합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 경로 한글 질문입니다.
경로 안에 한글이 없으면 업로드가 잘되지만 한글이 포함되어있으면 로그에서 한글 부분이 깨져 업로드가 되지 않는데 해결 방법이 있을까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
mybatis를 사용하다가 jpa로 이전할 계획의 프로젝트
안녕하세요 개인프로젝트 하며 딱 고민하고있던 부분이었는데 강의로 듣게되어 너무 기뻤습니다..현재는 mybatis로 진행을하고있는 토이프로젝트인데 jpa를 학습하고 나면 jpa로도 변경할 생각입니다 사실 service에서 mapper로 직접 의존할까 고민했었는데 나중에 JPA로 변경한다했을때 service를 건드려야될것 같아서 고민이 되더라구요..1 . service-repository-mapper 의 구조였는데 이런경우에는 중간에 repository가 있는게 가치가 있을수 있다 로 해석하면 될까요?2 . 간단한방식을 추천하셨는데 만약 저처럼 계획을 하고있다고 한다면 똑같이 간단한방식으로 하실것인지 아니면 repository를 둘것인지 궁금합니다. 물론 아주 간단한 프로젝트겠지만요
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드 질문드립니다.
안녕하세요. 강의 잘 듣고있습니다!다름이 아니라 요청마다 쓰레드를 생성하여 다중 요청에 대응하는 부분을 보고 질문이 생겨서 남깁니다.servlet은 서블릿 컨테이너에 의해 싱글톤으로 관리되는 것으로 배웠는데, 기존 쓰레드가 요청 1을 servlet을 사용하여 처리하고 있는 와중에 새로운 요청 2가 들어와서 새로운 쓰레드가 생성되고 servlet을 사용하려고 하면 이미 요청 1이 servlet을 사용하고 있기 때문에 사용할 수 없지 않은지 질문드립니다.감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
변수 바로 찾아가는 단축키
변수이름 클릭하시고 선언된 곳으로 바로 이동하시던데 단축키좀 알려주세욤
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
맥에서 pdf 내용 복사붙여넣기
영한님 핵심원리 강의부터 열심히 듣고있는중입니다.맥에서 미리보기 혹은 어도비 리더로 pdf파일을 열어 사용중인데 코드 복사할 때 제대로 코드가 복사되지 않아 너무 불편합니다.혹시 나름의 팁이 있을까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
./h2.sh 실행이 안되네요
1:07분에서 하는 것처럼 똑같이 해서터미널로 들어가서 bin폴더까지 접근해서거기서 cat h2.sh를 하면 영상처럼 똑같이 나옵니다.그래서 다음 단계인 ./h2.sh를 했는데permission denied라는 문구가 출력됩니다.그래서 sudo ./h2.sh를 할 경우 sudo: ./h2.sh: command not found 라는 문구가 출력됩니다.h2-1.4.199.jar h2.bat h2.sh h2w.bat a@aui-iMac bin % cat h2.sh #!/bin/sh dir=$(dirname "$0") java -cp "$dir/h2-1.4.199.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Console "$@" a@aui-iMac bin % ./h2.sh zsh: permission denied: ./h2.sh a@aui-iMac bin % sudo ./h2.sh Password: sudo: ./h2.sh: command not found혹시 이럴때는 어떻게 해결해야 되나요?
-
미해결실전! 스프링 부트와 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에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다' 틀린 말 아닌가요?