묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부 호출 해결 방안에 대해 질문이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예제에서 internal() 메서드를 별도의 클래스로 분리하지 않고, external() 메서드에 @Transactional 어노테이션을 사용하여 미리 트랜잭션을 시작하여 internal()에도 적용되도록 하는 방법은 적절한 해결 방안이 아닐까요?왜 클래스를 별도로 분리하는 것이 더 합리적인 해결 방안인지가 궁금합니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트 3.X 버전으로 바꾸려면
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용대로itemservice-db-start를 이름 수정해서 쓰려고 했는데이 코드는 스프링 부트 2.X 버전이더라고요. 이렇게 강의에서 제공하는 코드가 2.X 버전인 경우, 저는 이전 MVC 2편 강의 들을 땐 제가 스프링 이니셜라이저 사이트에 가서 직접 프로젝트를 3.X 버전으로 하나 만들고, 강의에서 제공하는 코드에서 main 폴더랑 test 폴더만 제가 만든 프로젝트 쪽으로 복사 + 붙여넣기 하는 식으로 해결했었습니다. 이번에도 그런 식으로 했고 실행해서 상품 등록이랑 수정해 보니 오류는 딱히 안 나는데 조금 걱정되는 부분이 있어서 질문드립니다. 강의에서 제공하는 코드를 보면modules 폴더나 sql 폴더가 있습니다. 제가 새로 만든 프로젝트엔 없고요. 그래서 위 폴더들도 그대로 복사 붙여넣기 할까 생각도 했는데.. 위 두 개 폴더 말고도 더 있을지도 모르고, 이런 식으로 없는 폴더를 일일이 복사 붙여넣기 해서 무언가 잘못되어서 나중에 가서 오류가 터질까 봐 조금 걱정이 되네요. 조금 안전한 방법으로 스프링 부트 3.X 코드를 쓰고 싶은데, 제가 그동안 했던 방법으론 조금 불안합니다..ㅎㅎ 관련 질문과 답변이 MVC 2편 커뮤니티엔 많은데, DB 2편 커뮤니티엔 없는 것 같아서 질문드립니다.스프링 부트 3.X로 하려면 어떻게 하는 게 좋을까요?그냥 2.X 버전으로 진행해도 아무 문제 안 생긴다면 2.X로 해도 상관은 없습니다. +)그냥 강의에서 제공하는 스프링 부트 2.X 버전 코드에 추가로 https://www.inflearn.com/community/questions/988208/%EC%9E%90%EB%B0%94-17%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%A7%84%ED%96%89%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94 이 게시글대로 해 보고, 여기에 추가로plugins { id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' id 'java' }이 부분만 3.3.2랑 1.1.6으로 수정해 봤는데요.(스프링 부트 3 이상으로 바꾸기 위해)이렇게 하니깐 다음 메시지가 뜹니다. 강의 코드를 수정해야 할지, 아니면 제가 새로 프로젝트를 만들어서 수정해야 할지, 그러면 복붙을 어디어디 할지 모르겠네요.. A problem occurred configuring root project 'itemservice-db'.> Could not resolve all artifacts for configuration ':classpath'.> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.3.2.Required by:project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.3.2> No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.3.2 was found. The consumer was configured to find a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.2' but:- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component and the consumer needed a runtime of a component- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')- Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 17)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')- Variant 'modernGradleRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component, as well as attribute 'org.gradle.plugin.api-version' with value '8.7' and the consumer needed a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.2'- Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.5' and the consumer needed a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.2'- Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 17)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
빈 등록 및 의존관계 주입
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 등록 및 의존 관계 주입이 헷갈려서 그러는데 JdbcTemplateItemRepositoryItemService이 두 개는 TemplateConfig에서 직접 빈 등록하고, 등록하면서 의존 관계가 주입되고 DataSource는 properties 파일에서 설정을 통해 스프링이 자동으로 빈으로 등록해주고 web 패키지에 있는 Controller들은 컴포넌트 스캔 + Autowired로 빈을 등록하고 의존 관계가 주입되고 있는 거 맞나요? 이게 맞다면JdbcTemplateItemRepository랑 ItemService에 @Repository, @Service 애노테이션을 사용하지 않고Config로 직접 빈을 등록하고 의존 관계를 주입한 이유가 있을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
index.html 에 질문있습니다!
안녕하세요 선생님 도서관리 앱을 만드는 과정을 모두 영상과 함께 코딩하여 완성하고 나니 문득 궁금한 점이 생겼습니다. 지금 여기에는 회원등록, 도서 등록, 도서 대출, 도서 반납, 상단에는 목록보기 정도가 있는데 선생님이 만들어 놓으신 버튼 이외에 다른 버튼을 제가 더 추가 해 더 완성도 높은 도서관리 앱으로 공부해서 만들어 보고 싶다면 HTML은 어디서 수정을 해야 하나요? v1/index.html 파일에서 할 수 있나요?? 몹시 궁금해서 여쭤봅니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티 매니저 초기화 방법 질문입니다
@Repository public class MemberRepository { @PersistenceContext private EntityManager em; } @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; }안녕하세요엔티티매니저 초기화 방법에 대해 질문드리고 싶습니다.DB 2편 데이터 접근 활용 기술에서는 후자의 방법으로 초기화하셨고이번 강의에서는 전자의 방법으로 초기화 하셨는데검색해보니 @RequiredArgsConstructor가 아닌 @PersistenceContext를 사용하라는 글이 있던데 몇년 된 게시물들이었고최근에는 @RequiredArgsConstructor를 사용해도 괜찮다는 게시글도 봤습니다 결론적으로는 둘 다 사용해도 괜찮은지아니면 둘 중 추천하시는 어노테이션이 있는지그리고 둘의 차이가 궁금합니다
-
미해결Practical Testing: 실용적인 테스트 가이드
서비스단 private 메서드의 책임을 새로운 객체로 분리 시, repository 의존성 이슈에 대해
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. 안녕하세요 우빈님! 강의 너무 잘 듣고 있는 컴공과 대학생입니다!!이번 목차에서 말씀해주신 내용을 바탕으로 개발한 프로젝트에 테스트코드를 작성하기 위해 리펙토링을 하던 도중, 의문점이 생겨서 질문 드립니다.강의에서 말씀해 주신 것처럼, 서비스단의 private 메서드가 가지는 책임을 서비스단이 아닌 다른 객체로 책임을 위임하는 것이 더 객체지향적이라 생각해서 저도 똑같은 방식으로 리펙토링을 진행중입니다.그런데, Layered architecture 에서 서비스단이 레포지토리단에 의존하고 있고, 강의에서와 마찬가지로 레포지토리단에 의존하고 있는 private 메서드인 경우에도 이 메서드의 책임을 서비스가 아닌 다른 객체로 위임하는 것이 과연 괜찮은 건지에 대한 의문이 들었습니다.Layered architecture 를 따른다면, 서비스단만이 레포지토리에 대한 의존성을 가게끔 하는 것이 맞지않나 라는 생각이고, 또 레포지토리의 변경이 발생했을때, 변경이 확산되는 범위를 서비스단으로 국한시키는 것이 더 좋은 게 아닐까라고 생각합니다.강사님의 생각이 궁금합니다!! 답변 달아주시면 감사하겠습니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
삭제를 눌렀을때의 오류..
안녕하세요 강사님 영상으로 스프링을 처음 배우기 시작하여 공부 중인데 도서관 애플리케이션에서 사용자를 등록은 가능하나 삭제를 눌렀을때 서버 내부 오류입니다라는 내용이 나오는데요 에러 내용은 .. java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:186) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:161) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:107) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.14.jar:6.1.14]at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936) ~[spring-webmvc-6.1.14.jar:6.1.14]at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-10.1.31.jar:6.0]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.14.jar:6.1.14]at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.31.jar:6.0]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar:6.1.14]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar:6.1.14]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.14.jar:6.1.14]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.14.jar:6.1.14]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.31.jar:10.1.31]at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]이런 내용으로 출력이 됩니다. 도무지 해결할 방법을 찾이 못해 질문드립니다~
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Database "mem:testdb" not found 에러 해결 방법
가장 최신 버전으로 H2와 Spring Boot를 활용하신다면spring-boot-starter-jdbc 추가하시면 바로 연결 가능합니다.<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>3.3.5</version> </dependency> 추가적인 작업(JPA 유도 등)을 하지 않아도 바로 접속이 가능합니다~!
-
미해결코드로 배우는 React 19 with 스프링부트 API서버
코드로 배우는 React with 스프링부트 개정판3
코드로 배우는 React with 스프링부트 개정판3영는 React with 스프링부트 개정판3 영풍문고 IT 코너에 메인으로 전시되어 있네요.최근 개정판 맞죠? 너무 반가워서 ^^ 응원 하러 왔어요 ^^ 스프링 mvc의 기초를 다져준 이 강의에 꽤나 인상이 깊었나 봐요 ^^ 이어서 Reactor, webflux 강의도 기대해 봅니다 ^^)*
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
auto = update
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 있지만 적용이 안 됩니다3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]<property name="hibernate.hbm2ddl.auto" value="update" /> update 옵션 사용시에 에러가 발생합니다. h2 database는 1.4.200 버전으로 변경 후 사용하고 있습니다 (기존 2.xx)아무리 찾아봐도.. 이거 해결책이 안 보이는데, 버전이 잘못 되거나 다른 이슈가 있을까요..?에러 로그는```Exception in thread "main" jakarta.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1591) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1512) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at hellojpa.JpaMain.main(JpaMain.java:13)Caused by: org.hibernate.exception.SQLGrammarException: Unable to build DatabaseInformation [Column "start_value" not found [42122-200]] [n/a] at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:66) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:94) at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:194) at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:98) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:286) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145) at java.base/java.util.HashMap.forEach(HashMap.java:1429) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:142) at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:315) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507) ... 4 moreCaused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "start_value" not found [42122-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.jdbc.JdbcResultSet.getColumnIndex(JdbcResultSet.java:3169) at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3268) at org.h2.jdbc.JdbcResultSet.getLong(JdbcResultSet.java:680) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.resultSetStartValueSize(SequenceInformationExtractorLegacyImpl.java:110) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.lambda$extractMetadata$0(SequenceInformationExtractorLegacyImpl.java:54) at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:50) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.initializeSequences(DatabaseInformationImpl.java:66) at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.<init>(DatabaseInformationImpl.java:60) at org.hibernate.tool.schema.internal.Helper.buildDatabaseInformation(Helper.java:185) ... 14 more``` pom.xml 입니다```<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>jpa-basic</groupId> <artifactId>ex1-hello-jpa</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ex1-hello-jpa</name> <description>ex1-hello-jpa</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.2.Final</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.200</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ```
-
미해결
jpa 질문입니다
현재 jpa 와 스프링 부트를 사용하여 브롤스타즈 친구 찾기 웹 사이트를 만들고있습니다. 물어보고 싶은게 있는데요 현재 구조는 이런데요 저의 브롤스타즈 친구찾기 웹사이트에 메인 화면 에서는 게시글을 등록합니다하나의 게시글에 필요한 값들은post엔티티의 (메모,작성일)유저엔티티의 (해시태그,성별,나이 그룹,총 트로피)유저 브롤러 엔티티의 (트로피 갯수)브롤러 엔티티의 (이름)아래 사진은 여러개의 게시글이있는 메인 화면입니다.제가 구현한 방법은 fetch join 을 사용해서 구현은 하긴 했는데 여기서 페이징 처리 까지 해야 해서 성능상 당연히 문제가 생길거같아서 질문드립니다.public List<Post> findPostsWithBrawlers(int page, int size) { String queryStr = "SELECT p FROM Post p " + "JOIN FETCH p.user u " + "JOIN FETCH u.userBrawlers ub " + "JOIN FETCH ub.brawler"; TypedQuery<Post> query = em.createQuery(queryStr, Post.class); // 페이징 처리 query.setFirstResult(page*size); query.setMaxResults(size); return query.getResultList(); }테이블을 다시 설계해야 할까요? 아니면 fetch 조인 보다 더 좋은 방법이있을까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
First service gateway service 연동 관련 문의
강의를 따라서 실행하던 도중 security 관련 의존성을 추가한 적이 없는데 localhost:8000/first-service/welcome으로 접속을 하면 위 사진과 같은 경로로 리다이렉트 되면서 에러가 발생합니ㄷㅏ.어떤 이유에서 이 경로로 리다이렉트가 되는걸까요? 아래는 설정 파일들을 사진으로 First-service는 정상적으로 잘 작동됩니다
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
프로젝트 익스포트에 대해 질문이 있습니다.
Module 'library-app' output path is incompatible with the Eclipse format which supports output under content root only. Make sure that "Inherit project compile output path" is not selected혹시 배포하신 프로젝트를 제가 STS에서 실행하기 위해 인텔리제이에서 Export to Eclips를 하고 Project Status Modul에서 Eclipse를 선택하고 ok를 눌렀더니 저런 경고 문이 뜨는데.. 배포하신 프로젝트는 이클립스 환경으로 익스포트가 안되는건가요??
-
미해결실전! Querydsl
JPAQueryFactory를 스프링 빈으로 등록 시 테스트 코드 작성
안녕하세요.좋은 강의 잘 보고 있습니다. 13:43초 쯤에 말씀하신 JPAQueryFactory를 스프링 빈으로 등록하는 방법은 테스트 코드를 작성하는 데 귀찮아진다고 말씀하셨습니다. 테스트 클래스(MemberJpaRepositoryTest)를 수정하지 않고도 통과가 되는데, 어떤 점이 귀찮아진다는 말씀이신가요? @SpringBootTest를 사용하지 않고 순수 자바로 테스트할 때, EntityManager와 JPAQueryFactory를 2개 생성해야 해서 귀찮아진다고 하신 것일까요?
-
해결됨실전! 스프링 데이터 JPA
질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Test void bulkAgePlus(){ memberRepository.save(new Member("AAA", 10, null)); memberRepository.save(new Member("BBB", 15, null)); memberRepository.save(new Member("CCC", 20, null)); memberRepository.save(new Member("DDD", 25, null)); memberRepository.save(new Member("EEE", 30, null)); int count = memberRepository.bulkAgePlus(18); em.flush(); em.clear(); List<Member> result = memberRepository.findByUsername("EEE"); Member findMember = result.get(0); assertThat(count).isEqualTo(3); assertThat(findMember.getAge()).isEqualTo(31); } 여기서 벌크성 연산을 할경우 엔티티 매니저를 거치지 않고 바로 업데이트를 하기에 findById 호출 전에 flush, clear하지 않으면 업데이트 이전에 save된 값이 나오는 것으로 알고 있어(캐쉬된 값) flush, clear를 해주는 것으로 알고 있는데 이때 em.flush()를 해버리면 벌크 연산 값이 아닌 그 이전 값이(save에서 저장한 값 EEE라 가정하면 31이 아닌 30) db에 업데이트 되는 꼴이라 벌크성 연산이 db에 유효하게 저장되려면 em.clear()만 실행 해야되는거 아닌가요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 질문있습니다!
31강에서 수업 코드를 잘 따라 쳐서 수업 내용과 똑같은 결과를 확인 할 수 있게 되었는데요. 한 가지 의문점이 들어 질문을 남깁니다. 수업의 마지막 내용인 클린 코드 책이 이미 대출이 되있어 B사용자가 대출을 하려 했으나 대출을 클릭하는 순간 서버 내부 오류입니다. 라는 내용의 경고창이 뜨는걸 확인했는데 영상의 내용에는 진작 대출되어 있는 책입니다 라는 IllegalArgumentException으로 예외처리를 했어서 서버 내부 오류입니다 라는 내용이 아니라 진작 대출되어 있는 책입니다 떠야 하는게 아닌가요? 다음 강의에서 확인할 수 있으려나요~?
-
해결됨Practical Testing: 실용적인 테스트 가이드
안녕하세요 @Autowired, @Mockbean, @Mock, @InjectMocks에 대해 질문 있습니다.
각 어노테이션을 언제 주로 사용하는지에 대해 아래와 같이 정리를 했는데 맞게 정리 한 건지 궁금합니다.@Autowired를 사용하는 경우@ActiveProfiles("test") @SpringBootTest class OrderServiceTest { @Autowired private ProductRepository productRepository; @Autowired private OrderRepository orderRepository; @Autowired private StockRepository stockRepository; @Autowired private OrderService orderService; ... }스프링 컨텍스트에 실제 빈 객체를 등록하고 해당 빈을 사용합니다. 이렇게 실제 빈을 사용하는 테스트라 실제 동작 검증에 있어서 가장 정확성이 높은 테스트 입니다.@Mockbean과 @Autowired를 섞어 사용하는 경우@WebMvcTest(controllers = ProductController.class) class ProductControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @MockBean private ProductService productService; ... }스프링 컨텍스트에 실제 빈이 아닌 Mock 빈을 등록합니다.컨트롤러 레이어에 대해서만 단위 테스트를 하고 싶은데 컨트롤러가 서비스 레이어에 의존하고 있으니 이러한 의존을 끊기 위해 @MockBean을 사용하는 방식입니다.@Mock과 @InjectMocks@ExtendWith(MockitoExtension.class) class MailServiceTest { @Mock private MailSendClient mailSendClient; @Mock private MailSendHistoryRepository mailSendHistoryRepository; @InjectMocks private MailService mailService; ... }@Mock을 통해 스프링 컨테이너에 등록되지 않는 가짜 객체를 생성합니다. 그리고 @InjectMocks에 사용된 객체에 @Mock을 통해 생성한 가짜 객체를 주입하는 방식입니다.스프링 컨테이너가 필요없는 외부 시스템에 대해 테스트를 할때 진행하는 방식입니다.위 질문 중에 "@Mockbean과 @Autowired를 섞어 사용하는 경우" 코드에 대해 질문이 있습니다. 컨트롤러에 대한 단위 테스트를 하기 위해 @MockBean을 사용하여 서비스에 대한 의존성을 끊는 부분은 이해를 했습니다. 근데 결국 서비스 객체를 가져다 쓰니 서비스가 의존하고 있는 Repository에 대한 부분도 @MockBean을 사용하여 스프링 컨테이너에 Mock을 등록해야 하지 않나 라는 생각이 듭니다.아래 코드에 대해 질문이 있습니다. 실제 스프링 부트를 실행 하면 각 서비스 객체와 Repository 객체 모두 스프링 컨테이너에 등록되어 서비스 레이어쪽에서 Repository레이어에 의존하는 상황입니다. 저는 스프링 컨테이너에 빈들도 잘 등록되고 서로 잘 데이터를 주고 받는지도 테스트를 해야한다고 생각하는데 아래와 같이 @InjectMocks과 @Mock을 사용하면 스프링 컨테이너와 상관이 없어져서 아래와 같은 상황에서 @InjectMocks과 @Mock을 사용하여 테스트 코드를 작성해도 되는지 궁금합니다. @ExtendWith(MockitoExtension.class) class CustomServiceImplTest { @InjectMocks private CustomServiceImpl customServiceImpl; @Mock private BankRepository bankRepository; @Mock private ProductRepository productRepository; @Mock private OrderRepository orderRepository; ... }1번 질문과 같이 정리를 했지만 @Autowired와 @Mockbean 사용에 대해 헷갈리는점이 있어 아래 내용을 정리 했는데 맞게 이해를 한건지 궁금합니다.@Autowired를 테스트 코드에서 사용하는 핵심은 해당 기능을 스프링 컨테이너에 등록하는걸 넘어서 해당 객체의 기능을 실제 사용하겠다 라는 의미다. @Mockbean을 테스트 코드에서 사용하는 핵심 이유는 의존 관계를 끊기 위함이다. 예를 들어 컨트롤러 쪽에서 서비스쪽에 강한 의존관계를 가지고 있어 우선 @Mockbean을 통해 생성한 가짜 객체를 스프링 컨테이너에 등록하고 이 가짜 객체를 컨트롤러쪽에서 의존하고 있는 객체에 넣어줘서 의존관계를 끊는다. 주의할점은 @Mockbean을 통해 생성한 가짜 객체의 기능은 사용하지 않는다. 아래 코드에서 @MockBean을 통해 생성한 ProductService 객체는 가짜 객체이므로 ProductRepository 객체를 못 불러오나요?@WebMvcTest(controllers = ProductController.class) class ProductControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @MockBean private ProductService productService; ... }
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
중간 코딩 작성 영상 짤린건가요?
5부 25초 domain 패키지에서 Book클래스 만들고 처음에 코드 입력하는 부분이 통 편집된거죠? 클래스 생성하고 갑자기 @Cloumn 어노테이션 작성하는 부분이로 넘어가네요
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderItem
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]다른 것들은 ...이 추가가 되지 않는데 OrderItem만 ...이 추가 되는 이유가 뭔가요? add를 넣었다고 해서 그런건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트 코드에 sql 로그가 남는 이유
@Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; @Transactional //변경 public Long join(Member member) { validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member); return member.getId(); } } @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } } --------------------------------------------------------------------------- // 테스트 코드 @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //Given Member member = new Member(); member.setName("kim"); //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId)); } }회원 도메인 개발 파트의 마지막 강의에 있는 테스트 부분입니다테스트는 성공이고, 테스트 결과 로그에는 member 객체에 대한 select sql이 찍힙니다 그런데 테스트 로그에 왜 select sql이 나오는지 잘 모르겠습니다 제가 이해하고 있는 내용은 이렇습니다//When Long saveId = memberService.join(member);위 코드에서 insert sql 이 생성되지만 내부 트랜잭션이라 커밋하지 않아서 해당 엔티티가 영속성 컨텍스트에만 추가된 상태 //Then assertEquals(member, memberRepository.findOne(saveId));위 코드에선 영속성 컨텍스트의 member를 가져오니 select sql 이 실행되지 않습니다 //When Long saveId = memberService.join(member); //Then assertEquals(member, memberRepository.findOne(saveId));그리고 테스트 코드에서 @Transactional 은 롤백이니 join()의 결과가 롤백됩니다 join() 은 롤백됬으니 테스트 결과 로그에 insert sql 이 나오지 말아야 하고,영속성 컨텍스트의 member를 조회했으니 select sql 도 나오지 말아야 하는 것으로 예상됩니다 하지만 insert sql 은 예상한대로 테스트 결과에 나오지 않는데,select sql 은 나오는 이유를 모르겠습니다 해결했습니다validateDuplicateMember(member) 중복 회원 검증하는 메서드에서 select sql을 호출하고 있었습니다em.persist() 보다 먼저 호출하기 때문에 DB에서 바로 조회해오고 있었습니다이걸 못보다니..