@Test @Transactional public void 테스트() throws Exception{ Member member1 = new Member("member1", 10); Team teamA = new Team("teamA"); member1.changeTeam(teamA); teamRepository.save(teamA); //member <- cascade persist em.flush(); em.clear(); memberRepository.findByAge(10); // SELECT 1번 memberRepository.findByUsername("member1"); // SELECT 2번 memberRepository.findById(member1.getId()); // 영속성 컨텍스트에 PK값이 존재 } 쿼리 조회 메서드 실행 시 JPQL 이 동작하여 flush 후 DB에 바로 쿼리가 날라가고 가져온 것이 영속성 컨텍스트에 저장된다고 알고 있습니다. 만약에 save(new Member(member1, 10)); 후에 save한 엔티티 대상을 조회하기 위한 findByAge (where = 10) , findByUsername (where = member1) 을 순서 대로 쿼리 메서드 호출을 하였을 때 조회 쿼리가 결국 같은 엔티티를 조회하기 위함인데 SELECT 쿼리문이 2번 나갔습니다. 2번 나간 이유가 findByAge 호출 후에 findByUsername 호출 시 1차 캐시에서 비교할려면은 무조건 id값이랑 비교가 가능하기 때문인지 궁금합니다.
계속 이런 오류가 발생하는 상황인데 어디가 문제인걸까요........ 2023-10-15 19:32:08.071 INFO 20572 --- [nio-8080-exec-2] c.newus.traders.user.jwt.TokenProvider : JWT claims string is empty. java.lang.IllegalArgumentException: JWT String argument cannot be null or empty. at io.jsonwebtoken.lang.Assert.hasText(Assert.java:132) ~[jjwt-api-0.11.5.jar:0.11.5] at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:527) ~[jjwt-impl-0.11.5.jar:0.11.5] at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:589) ~[jjwt-impl-0.11.5.jar:0.11.5] at io.jsonwebtoken.impl.ImmutableJwtParser.parseClaimsJws(ImmutableJwtParser.java:173) ~[jjwt-impl-0.11.5.jar:0.11.5] at com.newus.traders.user.jwt.TokenProvider.validateToken(TokenProvider.java:141) ~[main/:na] at com.newus.traders.user.jwt.JwtFilter.doFilterInternal(JwtFilter.java:40) [main/:na] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) [spring-web-5.3.29.jar:5.3.29] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) [spring-security-web-5.7.10.jar:5.7.10] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) [spring-web-5.3.29.jar:5.3.29] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) [spring-web-5.3.29.jar:5.3.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.3.29.jar:5.3.29] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.3.29.jar:5.3.29] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.29.jar:5.3.29] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.29.jar:5.3.29] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.79.jar:9.0.79] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.79.jar:9.0.79] at java.lang.Thread.run(Thread.java:750) [na:1.8.0_371]
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강사님 안녕하세요! 수업 잘 듣구 있습니다! 다름이 아니라, AWS에 빌드까지 완료하고 인바운드 규칙까지 편집해준 다음, v1 화면으로 돌아가서 사용자 추가 부터 해보았는데 갑자기 서버 내부 오류라는 창과 함께 오류가 뜹니다.. org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table if exists user CASCADE " via JDBC Statement 2023-10-15 08:12:50.119 WARN 18125 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 42001, SQLState: 42001 2023-10-15 08:12:50.119 ERROR 18125 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : Syntax error in SQL statement "insert into [*]user (id, age, name) values (default, ?, ?)"; expected "identifier"; SQL statement: insert into user (id, age, name) values (default, ?, ?) [42001-214] 2023-10-15 08:12:50.123 ERROR 18125 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user (id, age, name) values (default, ?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "insert into [*]user (id, age, name) values (default, ?, ?)"; expected "identifier"; SQL statement: insert into user (id, age, name) values (default, ?, ?) [42001-214] 혹시 제가 SQL문을 잘못 작성한 것일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이런식으로 name 값을 줘도 자꾸 null만 뜨는데 왜 그런거죠??
안녕하세요 강의 정말 잘 듣고 실무에서도 열심히 사용하고 있습니다. 강의에서 lazy loading과 fetch join을 활용하여 최적화 하는 부분에 대해서는 이해를 하고 있습니다. 그렇다면 eager loading은 사용을 피해야하는 걸까요? 아니면 어떤 케이스에 대해서는 즉시 로딩이 더 실무적으로 유용한 경우가 있을까요? 즉시 로딩이 사용을 지양해야 된다면 JPA에서 굳이 만들지 않았을 것 같은데 어떤 상황에서 사용해야할지에 대해 의문점이 듭니다. 제가 생각했을 땐 테이블 분리를 위해 엔티티를 나누었지만 항상 같이 조회되는 상황이나 OneToOne 상황에서는 크게 상관없을 것 같긴한데 필요없는 컬럼까지 즉시 로딩으로 가져오는게 성능에 크게 영향을 끼치는지에 대해 궁금합니다. 이외에도 실무적으로 이럴 땐 지연 로딩보단 즉시 로딩이 더 적합하다라는 상황이 있다면 조언 부탁드리겠습니다. 감사합니다!
spring boot 3.0이상에서 H2 사용할 때 test connection에서 실패하는 경우가 있을 수 있습니다. 에러 메시지로 Database "mem:testdb" not found, either pre-create it or allow remote database creation. 이 뜬 경우 아래와 같은 해결책을 사용할 수 있습니다. 우선 에러의 원인은 mem:testdb 데이터베이스가 존재하지 않기 때문에 발생합니다. H2 1.4이상 버전부터는 보안 상 문제 때문에 스프링부트 기동 시 데이터베이스 자동 생성을 막아두었다고 합니다. DB가 없으니 위와 같은 에러 메시지가 발생한 것이죠. H2 dependency 버전을 다운그레이드 시켜도 되겠지만, 솔직히 최신 버전의 dependency를 사용하고 싶잖아요? 문제 해결을 위해서 수동으로 데이터베이스를 생성하면 됩니다. 해결법은 생각보다 간단한데요. 임의의 더미 Entity를 만들어서 DB 생성을 유도하게 만들면 됩니다. 자세한 방법은 해당 블로그의 글을 참고하시기 바랍니다. https://shanepark.tistory.com/435
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] Transactional이 작동을 안 하길래 찾아보다가, DataSourceUtils.getConnection을 사용하지 않고, (DataSource 객체).getConnection을 써서 그런간가 싶어서 이것을 수정하려 했는데, 이러니까 테스트 코드가 작동이 안되네요... 테스트 코드와 DataSourceUtils가 어떠한 연관이 있는 건가요? (DataSource 객체).getConnection으로 DB를 연동하면 테스트 코드가 잘 되는데, DataSourceUtils.getConnection으로 하면 실행할땐 잘 되지만, 테스트 코드로 하면 데이터베이스 연동에 오류가 나는 것 같네요...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] start.spring.io 에서 spring boot를 설치하고 h2 버전도 1.4.199로 설치하였습니다. 그러나 아래의 사진과 같이 라이브러리 내에 h2:1.4.199가 아닌 h2:2.1.214가 설치되어 있습니다. 이 부분 때문에 다음 강의에서 제대로 실행이 되지 않는 것 같습니다 .. (MEMBER 테이블 생성이 되지 않음) 왜 이러는 걸까요 ..? 해결 방법도 알려주시면 감사하겠습니다 ㅜ ㅜ
안녕하세요. 강의를 듣고 강의자료까지 참고하며 코드를 작성하였습니다. 그러나 실행창에 create와 drop이 뜨지도 않고 MEMBER 테이블 또한 생성되지 않습니다. 관련 질의를 지금 6시간 넘게 다 찾아보며 (띄어쓰기, @Rollback(false) 추가 등) 해결 시도를 했지만 끝까지 되지 않아 질문 남깁니다 .. [yml 코드] 감사합니다 ..
client registration의 redirect uri는 인가 서버로부터 임시코드를 발급받고, redirect uri로 임시 코드를 리다이렉트 시키는데, 강사님께서 redirect uri를 http://localhost:8081/client 로 설정하였고, ClientController의 매핑주소도 위와 같은 주소로 설정하였습니다. 여기서 궁금한점이 있습니다. 임시 코드를 발급한 시점에 저 리다이렉트 주소로 콜백하게 되는데, 이 시점에 clientcontroller에 저 매핑주소가 호출되어야 할텐데 왜 token 발급시에 컨트롤러가 호출되는지 그리고 redirect uri가 token 발급시 콜백 주소도 해당되는건가요?? 엑세스 토큰 발급후에도 http://localhost:8081/client 여기로 호출되어서 의문이 듭니다.
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
태현님 안녕하세요! 저도 같은 에러가 발생했는데 (질문 게시판에 같은 질문이 있는데... 링크를 얻기가 어렵네요) build.gradle 에 implementation 'org.jetbrains.kotlin:kotlin-reflect:1.2.41' 을 추가하니까 해결 되었습니다..! 혹시 원인을 알 수 있을까요? 현재까지 공부한 프로젝트를 보내고 싶은데... 메일로 보낼수 있을까요? 파일 첨부가 안되네용
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 있으나 해결이 안됨 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 실전 스프링부트+jpa1 의 jpa와 db 설정, 동작확인을 듣고있는 학생입니다. 밑의 질문과 같은 이유로 질문하게 되었는데요. application.yml의 들여쓰기가 문제일까 싶어서 들여쓰기를 들였는데 그럼에도 생성이안됩니다... 어디가 문제일까요?? 그리고 그... localhost:8082 를 접속할때 접속이 될때가 있고 안될때가 있는데 이유가 뭘까요?? Iterm으로 ./h2-sh로 킨 상태를 계속 유지해야 콘솔에 접근할 수 있는건가요?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 영한님 말씀대로면 이름이 같을시 오류가 떠야되는데 저는 뜨질 않고 돌아갑니다. 왜그런가요? @Transactional 주석처리하고 해도 같은결과입니다.
강의 내용 중 hello를 눌렀을때(단축키 사용 ctrl+b) cannot find declaration to go to 오류가 발생하더라고요. 구글이나 인프런 답변 내용들을 찾아서 제시해주신 해결 책으로 했을 때 해결이 안되어서 문의를 드립니다. src -> Mark Directory as -> Sources Root(해결x) file -> invalidate Caches -> Restart(해결x) 혹시 무료버전을 사용하고 있어서 해결이 안되는걸까요??