묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
SecurityConfig의 WebSecurityConfigurerAdapter 가 deprecated 되어 아래와 같이 코드를 수정하였는데 괜찮을까요?
안녕하세요 강의 잘 듣고 있습니다.해당 수업을 들으면서 코드를 직접 작성을 하고 있었는데 SecurityConfig의 WebSecurityConfigurerAdapter 가 deprecated가 되어서 인식이 안됬습니다.그래서 커뮤니티를 통해 어떤 오류가 났는지 다른 회원님의 글을 보고 알게 되어 해당 코드를 인용했음에도 오류가 발생하여 아래와 같이 코드를 수정을 했는데 괜찮을까요? package com.studyolle.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; import org.springframework.security.web.util.matcher.RequestMatcher; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; @Configuration //스프링 설정 클래스 @EnableWebSecurity //웹 보안 활성화, 웹 보안 설정 재정의 public class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector) throws Exception { RequestMatcher[] matchers = { new MvcRequestMatcher(introspector, "/"), new MvcRequestMatcher(introspector, "/login"), new MvcRequestMatcher(introspector, "/sign-up"), new MvcRequestMatcher(introspector, "/check-email"), new MvcRequestMatcher(introspector, "/check-email-token"), new MvcRequestMatcher(introspector, "/email-login"), new MvcRequestMatcher(introspector, "/check-email-login"), new MvcRequestMatcher(introspector, "/login-link"), new MvcRequestMatcher(introspector, "/profile/*") }; //보안 요청에 대한 권한 및 역활 설정 http.authorizeRequests() //배열에 있는 경로들에 대한 모든 요청을 허용 .requestMatchers(matchers).permitAll() //지저오딘 경로외의 모든 요청은 인증된 사용자만 접근할 수 있도록 함 .anyRequest().authenticated(); // POST에 대한 별도 조건을 설정하려면 추가 코드 필요 return http.build(); } }
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
service폴더가 hellospring폴더가 아닌 java하위 폴더에 있는 경우 오류
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용] 제가 (프로젝트명)폴더가 아닌 java밑에 service폴더를 넣어놨더니이런 오류가 발생했습니다.여기서 궁금한점이 [프로젝트명]폴더 밑에있어야지만 SpringContainer에 service repository controller가 DI되는건가요?확신이없어서 질문드립니다ㅠ
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Assertions 메서드 인자 순서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]회원 리포지토리 테스트 케이스 작성 강의에서 assertEquals(A, B), assertThat(A).isEqualTo(B)에 대한 질문이 있습니다. 두가지 메서드 모두 A와 B의 순서가 크게 중요하지 않아보이는데 그런가요?다르다면, 첫번째 메서드는 member를 앞에 넣으시고, 뒤에 메서드는 member1을 뒤에 넣으셨는데, 메서드를 어떻게 해석해야할까요? junit 문서를 찾아보아도 그런 설명이 없네요..
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderItem 상태? 부모의 상태로 참고 가능?
안녕하세요실전! 스프링부트와 JPA 활용 1편 강의를 수강 중인데요.섹션6 주문도메인 개발 중 '주문, 주문상품 엔티티 개발' 강의에서 08:13쯤에 OrderItem에도 상태가 필요하다고 하셨는데 여기서 상태값은 무엇을 말하시는 걸까요?OrderStatus.CANCLE처럼 Enum형식의 상태값을 모아놓은 필드를 말씀하시는 건가요? 맞다면 어떤 상태값이 OrderItem에 들어갈수 있을까요? 주문취소 같은 건 Order에 들어가있고 어떤 값이 필요한지 모르겠습니다. 그리고 바로 그 말씀에 뒤이어 부모 상태로 참고가 가능하다고 하셨는데 어떤 부모의 상태를 말씀하시는 건지 모르겠습니다. 답변 부탁 드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합 테스트 코드 - 회원가입() 메서드 에러 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]16:47초에 실행하시는 통합테스트 코드 - 회원가입() 메서드 실행에서 에러가 납니다.. 에러 내용은 다음과 같습니다.could not prepare statement [Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-214]] [select m1_0.id,m1_0.username from member m1_0 where m1_0.username=?]org.hibernate.exception.SQLGrammarException: could not prepare statement [Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-214]] [select m1_0.id,m1_0.username from member m1_0 where m1_0.username=?] at app//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64) at app//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56) at app//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:187) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:76) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.lambda$list$0(JdbcSelectExecutorStandardImpl.java:102) at app//org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:226) at app//org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:163) at app//org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:254) at app//org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:134) at app//org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) at app//org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66) at app//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:198) at app//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:361) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) at app//org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:110) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:303) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244) at app//org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518) at app//org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367) at app//org.hibernate.query.Query.getResultList(Query.java:119) at app//hello.hellospring.repository.JpaMemberRepository.findByName(JpaMemberRepository.java:33) at app//hello.hellospring.service.MemberService.validateDuplicateMember(MemberService.java:33) at app//hello.hellospring.service.MemberService.join(MemberService.java:27) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at app//org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) at app//org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at app//org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) at app//org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) at app//org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at app//hello.hellospring.service.MemberService$$SpringCGLIB$$0.join(<generated>) at app//hello.hellospring.service.MemberServiceIntegrationTest.회원가입(MemberServiceIntegrationTest.java:28) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at app//org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727) at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@17.0.4.1/java.util.ArrayList.forEach(ArrayList.java:1511) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@17.0.4.1/java.util.ArrayList.forEach(ArrayList.java:1511) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at app//org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:110) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:90) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:85) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-220] at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244) at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226) at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213) at org.h2.command.query.Select.prepareExpressions(Select.java:1170) at org.h2.command.query.Query.prepare(Query.java:218) at org.h2.command.Parser.prepareCommand(Parser.java:583) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634) at org.h2.server.TcpServerThread.process(TcpServerThread.java:288) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:833) at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:502) at app//org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at app//org.h2.engine.SessionRemote.done(SessionRemote.java:606) at app//org.h2.command.CommandRemote.prepare(CommandRemote.java:78) at app//org.h2.command.CommandRemote.<init>(CommandRemote.java:50) at app//org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:480) at app//org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) at app//org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92) at app//org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) at app//com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:327) at app//com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:91) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:177) ... 123 moreJava HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appendedMemberServiceIntegrationTest > ȸ������() FAILED org.hibernate.exception.SQLGrammarException at MemberServiceIntegrationTest.java:28 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at MemberServiceIntegrationTest.java:282023-08-20T14:08:26.076+09:00 INFO 17356 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2023-08-20T14:08:26.079+09:00 INFO 17356 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2023-08-20T14:08:26.109+09:00 INFO 17356 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.1 test completed, 1 failed> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/man25/OneDrive/����%20ȭ��/������%20����/hello-spring/build/reports/tests/test/index.html* 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.* Get more help at https://help.gradle.orgBUILD FAILED in 22s4 actionable tasks: 1 executed, 3 up-to-date 아래 사진은 application.properties 디렉터리의 코드입니다. 아래 사진은 SpringConfig 클래스의 코드입니다. 해결 방법을 모르겠네요ㅠㅠㅠ
-
미해결윤재성의 자바 기반 안드로이드 앱개발 Part 3 - 데이터관리와 네트워크
35강이 없습니다
강의 자료를 보다 보니 35강이 있는데 동영상 강의는 35강이 없습니다
-
해결됨[자바/Java] 문과생도 이해하는 DFS 알고리즘! - 입문편
final 선언 이유
Main 클래스 안에서MAX 변수에 대해 굳이 final로 초기화 하는 이유가 무엇일까요?
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
리액트 웹 UI부분을 한글로 바꾸고 싶습니다
src/main/resources/static/v1/static/js/main.d4f24480.js.map웹 UI의 보여지는 버튼이라던가 클릭시 나오는 팝업창의 메세지를 한글에서 영어로바꾸고 싶은데 위에 경로의 파일의 한글부분을 영어로 바꿔도 어플리케이션 실행에는 문제가 없을까요??? <Title>태그나 <Button Title>태그 한글부분을 영어로 바꿔봤는데 웹UI의 한글은 딱히 바뀌지는 않네요 음 너무 복잡하다면 굳이 안해도 되지만 혹시 바꿀수 있는 방법이 있나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
롬복 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. C:\study\jpashop\jpashop\src\main\java\jpabook\jpashop\JpashopApplication.java:10: error: <identifier> expected hello.setData("hello"); 이런 에러가 뜨는데 원인이 무엇일까요..?
-
미해결실전! 스프링 데이터 JPA
강의 15분경 즉시로딩 실행결과 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.MemberTest 테스트클래스testEntity() 코드입니다. Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); //초기화 em.flush(); em.clear(); List<Member> members = em.createQuery("select m from Member m ", Member.class) .getResultList(); for (Member member : members) { System.out.println("member = " + member); System.out.println("-> member.team = " + member.getTeam()); }처음에 즉시로딩 실행결과로멤버 조회 쿼리 하나랑각각 팀 조회 쿼리 +N번 (여기서는 2번) 나가는 것을 확인했습니다. 지연로딩으로도 쿼리실행시점 문제만 다르지 똑같이 member.getTeam() 할때 team쿼리가 나가는 것을 확인했습니다. N+1문제를 해결하기 위해 페치조인을 한다는것은 강의와 학습을 통해 알게되었습니다. 질문이있는데요처음에 즉시로딩할때 조인쿼리가 안나가고왜 따로 member, team쿼리가 나간것일까요? 즉시로딩도 N+1문제가 발생하는것이 맞나요? 수정단건조회 시 즉시로딩으로 left outer join 으로 member와 team이 함께 조회되는것을 확인했습니다.단건조회가 아니라 memberRepository.findAll() 메소드나 JPQL (select m from Member m) 인경우에는 member와 team이 같은 한 쿼리가 아니라따로 조회되는 것인가요? 왜 List를 조회할때에는 같이 join해서 쿼리를 날리지않는것일까요?
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
안녕하세요 강사님 save 메서드 사용 질문있습니다.
트랜잭션이 걸려있는 경우에stock.decrease(quantity)만 해줘도 영속성 컨텍스트에 있는 값을 가져와서 재고 감소가 가능한 걸로 아는데왜 save를 한 번 더 해주는 건지 이유가 궁금합니다.그리고 위에 제가 이해한 영속성 컨텍스트에 대한 내용도 맞을까요?
-
해결됨스프링 웹 MVC
2:51초 질문입니다.
SampleController 클래스에 @Validated 어노테이션을 추가하였고, Event 클래스에서 name에 @NotBlank와 limit에 @Min(value = 0)을 추가하였습니다. 코드는 다음과 같습니다.Event.classpackage com.springMvc.N04_handlerMethod; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; public class Event { private Integer id; @NotBlank private String name; @Min(value = 0) private Integer limit; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getLimit() { return limit; } public void setLimit(Integer limit) { this.limit = limit; } } SampleController.classpackage com.springMvc.N04_handlerMethod; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @Controller public class SampleController { @GetMapping("/events/{id}") @ResponseBody public Event getEvent1(@PathVariable Integer id){ Event event=new Event(); event.setId(id); return event; } @GetMapping("/events/form") public String eventsForm(Model model){ Event newEvent=new Event(); newEvent.setName("action"); newEvent.setLimit(30); model.addAttribute("event", new Event()); return "/events/form"; } @PostMapping("/events") public String getEvent(@Validated @ModelAttribute Event event, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "/events/form"; } return "/events/list"; } }SampleControllerTest.classpackage com.springMvc.N04_handlerMethod; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringRunner.class) @WebMvcTest class SampleControllerTest { @Autowired MockMvc mockMvc; @Test public void postEvent() throws Exception { mockMvc.perform(post("/events") .param("name", "krille") .param("limit", "-1")) .andDo(print()) .andExpect(status().isOk()) .andExpect(model().hasErrors()); } }Event.class에서 설정한 validation과 SampleController.class의 getEvent() 메소드의 @Validated, BingingResult에 따르면 test에서 입력된 param값에 따라 limit가 음수로 나오면 model().hasError()로 인해 테스트가 통과가 되어야 할텐데 java.lang.AssertionError: Expected binding/validation errors가 나오면서 계속 테스트가 통과되지 않습니다. 오류를 해결하기 위해 구글링, chatGPT를 검색해보았지만 결국 해결하지 못해 이렇게 질문하였습니다.사용한 스프링 프레임워크 부트는 3.1.2 버전입니다. 추가로 지금까지 수업을 들으며 다른 질문도 하려고 합니다.1. Test 작성시 mockMvc.perform()을 사용할 때 마다 자동으로 import를 하고 싶은데 어떤 키를 눌러야 하나요?2. junit이 start.spring.io에서 제공하지 않나요? @RunWith(SpringRunner.class) 어노테이션을 작성할 때마다 수동으로 junit 의존성을 추가합니다.3. 개인적인 질문인데 코딩을 하다가 계속 막히면 화가 너무나서 감정 컨트롤이 너무 힘든데 강사님은 어떻게 감정을 다스리는지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션의 범위와 준영속 상태
안녕하세요 강의를 수강하다 제가 잘못 이해하고 있는 부분이 있는 것 같아서 질문드리게 되었습니다.다음은 "간단한 주문 조회 V2: 엔티티를 DTO로 변환" 강의에서 35초에 해당하는 화면을 캡처한 부분입니다.orderRepository는 @PersistenceContext 처리된 EntityManager를 가지고 있는데 이 때 Transaction의 범위가 어디까지인지를 잘 모르겠습니다.추측으로는 List<Order> all가 준영속상태로 반환될 것으로 예상했는데 order가 membe프록시 객체를 가지고 있다가 Lazy 강제 초기화가 가능한 것을 보면 영속성 컨텍스트가 여전히 존재하는 상태인 것 같습니다.Transaction의 범위가 어디까지인지 궁금합니다.감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO를 Result<T>에 담아서 반환할 때의 제너릭 표기 여부
안녕하세요DTO를 직접 반환하지 않고 Result로 감싸서 반환하는 것을 구현하는 도중 궁금한 점이 생겼습니다. 일단 코드는 다음과 같습니다./** * DTO를 감싸서 반환하는 클래스 * 반환에 성공하면 status에는 "success", data에는 DTO, error에는 null이 담긴다 * 예외가 발생하면 status에는 "fail", data에는 null, error에는 errorCode가 담긴다 */ @NoArgsConstructor @Getter public class Result<T> { private String status; private T data; private ErrorDTO error; public Result(String status, T data, ErrorDTO error) { this.status = status; this.data = data; this.error = error; } } @PostMapping("/save") public ResponseEntity<Result<UserDTO>> save(@RequestBody @Validated UserDTO userDTO, BindingResult bindingResult) { if (bindingResult.hasErrors()) { for (ObjectError error : bindingResult.getAllErrors()) { return ResponseEntity.ok().body(ResultUtils.fail(error.getCode(), error.getDefaultMessage())); } } UserDTO savedUserDTO = userService.save(userDTO); return ResponseEntity.ok().body(ResultUtils.success(savedUserDTO)); }public class ResultUtils { private static final String SUCCESS = "success"; private static final String FAIL = "fail"; public static <T> Result<T> success(T data) { return new Result<>(SUCCESS, data, null); } // 이 메서드의 제너릭 표기도 어떻게 해야할지...? public static Result fail(String errorCode, String message) { return new Result(FAIL, null, new ErrorDTO(errorCode, message)); } } 이렇듯 예외가 발생한 경우에 data에는 null을 담아서 반환하고 싶으면, 예외 발생 여부에 따라 Result<T>의 T가 userDTO이기도 하고 null의 2가지...? 인 느낌이 드는데 그럼 public ResponseEntity<Result<UserDTO>> save처럼 메서드 선언부에서 Result의 제너릭을 표기하는 의미가 있을까요? Result로 적는 것이 좋을지 그래도 userDTO를 명시해 줘야할지가 궁금합니다. 추가로 userDTO 단건일시에는 제너릭이 그다지 복잡하지 않지만 만약 DTO에 페이징 기능을 더하여 반환하고자 한다면 Result<Page<UserDTO>> 처럼 제너릭 안에 제너릭이 있게 될텐데 이러한 경우에도 그냥 제너릭을 생략하는 것이 좋을지 궁금합니다!
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@OneToOne(mappedBy)의 쿼리 최적화 방법
안녕하세요!OneToOne(mappedBy = ...)와 관련한 질문을 드립니다.위와 같이 mappedBy로 되어있는 엔티티를 조회하게 되면, LAZY로 설정하여도 반드시 즉시로딩됩니다. 또한, default_batch_fetch_size도 적용되지 않아 반드시 N+1문제가 발생하는 것으로 알고있습니다.여기서 생기는 고민이, 특정 엔티티의 목록을 조회하는 로직을 구현할 때 엔티티를 select절에 넣는것에 대해서 조금 조심스럽습니다. (단건 조회는 즉시로딩이 발생해도 상대적으로 문제의 심각도가 적음)현재 목록을 조회하려는 엔티티에 OneToOne(mappedBy = ..)가 없다면, 엔티티의 목록을 조회해도 N+1 문제와 무관합니다. 하지만, 미래에 추가가 된다면 성능에 문제가 없던 것들도 N+1문제가 생길 수 있습니다.이에 대한 한 가지 해결방법은 Querydsl의 Projection을 사용하는 방법이 있습니다. 이는 결국 select절을 입력해줘야하며 지연로딩과 @BatchSize을 통해 해결하는게 아니기 때문에, 더 복잡한 조인 쿼리를 작성해야할 수도 있습니다. 이로 인해 생산성도 낮아질 수도 있습니다. 정리하자면,select 절에 entity --> 다른 필드를 지연로딩 처리하여 더 쉽게 데이터를 찾지만, 미래에 발생할 수 있는 N+1문제를 어쩔 수 없이 수용한다.select절에 Dto Projection --> 조인 쿼리를 다 작성해야한다. Projection을 기입해야한다. 하지만, @OneToOne(mappedBy)가 추가되어도 쿼리 성능에는 문제가 없다.양쪽의 트레이드 오프가 있는 것 같습니다. 현업에서는 어떠한 방법을 이용하나요? (추가적으로, mappedBy를 이용하지 않거나 하이버네이트에서 제공하는 바이트코드 조작 방법도 있네요)
-
해결됨실전! Querydsl
컨트롤러의 파라미터로 Pageable를 직접 받을까요 혹은 page, size, sort등을 따로 받을까요?
안녕하세요!컨트롤러의 파라미터로 Pageable을 직접 받을 수 있으나 @PageableDefault로는 1가지 기준으로만 정렬이 가능한 것 같은 제약사항이 있는 것으로 알고 있습니다.@SortDefault로 여러개의 정렬 조건을 추가할 수 있다고는 하나 파라미터에 어노테이션이 너무 많아지나..? 싶기도 합니다.또 만약 page라는 변수명이아니라 pageNo처럼 다른 변수명을 사용할 때의 유연성을 위해서라도 Pageable 인터페이스로 직접 받기보다는 페이징의 각 요소를 받아서 PageRequest 객체를 따로 생성하는 것이 더 나을까요?토이프로젝트보다 훨씬 복잡한 상황의 현업환경에서는 어떤 방식이 더 자주 사용되는지 궁금합니다!
-
미해결스프링 시큐리티
스프링 시큐리티 6.0 이상에서 securityfilterchain의 requestMatcher
강의 2-2 필터 초기화와 다중 보안 설정을 시큐리티 6.0 버전 이상으로 따라 하던 중에 다른 결과가 나와서 질문 드립니다configuration은 위와 같이 설정하였고 처음에는 영상에서 처럼 Order(0)과 Order(1)을 지정 하여 실행하였습니다.제 생각으로는 6.0이상 버전에서는 사용할 수 없는 antMacher대신 requestMatchers를 사용하여 requestMatcher가 1번첫번째 필터체인은 "admin/**" 두번 째 체인은 any request가 될 것이라고 생각했지만 디버깅 해보니 둘 다 any request가 나와 루트로 접속했을 때 첫번째 필터체인이 생성되어 루트로 가는 것이 아닌 basic login form이 나왔습니다.그래서 디버깅 중 위와 같이 뜨는 것이 보여 애초에 등록이 잘못 된 건가 싶기도 했는데 영상에서처럼 filters를 확인해보면 첫번 째는 httpbasic와 같이 등록된 12개의 필터, 두번 째는 formlogin과 같이 등록된 14개의 필터로 각각 알맞게 등록되어 있었습니다.어째서 두 개 모두 다 위 필터들은 정상적으로 등록이 되었는데 requestMatcher는 둘 다 any request 인걸까요? 6.0 이후 버전에서는 requestMatcher를 바꾸려면 다른 방법을 써야 하는 것일까요? 도움 주시면 감사하겠습니다 ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜젝션 범위와 준영속 상태
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? ([예]/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ([예]/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? ([예]/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요! 강의에서 [회원 수정 API] 파트에서 질문이 있어 이렇게 문의드리게 되었습니다.트랜잭션 범위와 준영속 상태에 관한 질문입니다.우선 Service 계층에서 update에서 member 객체를 준영속 상태로 반환하도록 하였습니다.그 후 Controller 계층에서 PutMapping 방식으로 member의 이름을 "-newhello"로 변경하여 db에 반영하였고그 다음에 member객체의 이름을 "준영속 상태"로 변경 하였습니다. 이미 트랜잭션이 끝나면서 영속성 컨택스트가 종료되었다고 생각했고여기까지는 db의 값이 여전히 "-newhello"라는 것을 확인해서 문제가 없었는데 그 다음이 이해가 가지 않습니다.memberServie에서 findMember를 다시 조회하였는데이 객체가 member와 완전히 동일한 객체로 나옵니다.전 db에서 값을 가져와서 이름이 "-newhello"일 것으로 예상했는데 이렇게 된 이유를 모르겠습니다...마치 db와의 연동은 안되지만 영속성 컨택스트의 1차캐시에 남아있는 member 객체를 같은 id 식별자를 바탕으로 찾아온 것 같아서 혼란스럽습니다. ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[빌드하고 실행하기] java -jar hello-spring-0.0.1-SNAPSHOT.jar 후 웹 창이 뜨지 않음.
안녕하세요 저는 [빌드하고 실행하기] 강의를 따라서 빌드를 마치고, java -jar 명령어를 통해 웹사이트를 띄우려고 했습니다.java -jar hello-spring-0.0.1-SNAPSHOT.jar 명령어를 실행하였고, 실행이 된것을 확인할 수 있었습니다.하지만 강의처럼 웹사이트 화면은 뜨지 않았습니다. 제가 오류가 난건가요? 아니면 일단 실행은 된 것 같으니 정상실행된건가요?
-
해결됨스프링 시큐리티
logout을 했지만 세션이 남아있습니다.
http .authorizeRequests() .antMatchers("/user").hasRole("USER") .antMatchers("/admin").hasRole("ADMIN") .antMatchers("/admin/**").access("hasRole('ADMIN') or hasRole('SYS')") .antMatchers("/admin/**").hasAnyRole("ADMIN","SYS") .anyRequest() .authenticated(); http .formLogin(); http .sessionManagement() .maximumSessions(1) .maxSessionsPreventsLogin(true); http .logout() .logoutUrl("/logout");위 내용과 같이 설정 후 user 계정으로 [로그인 -> 로그아웃] 후로그인 시도시 아래와 같은 화면이 표시됩니다.디버깅 해보니 logout 후에도 기존 세션이 있어 기존 살아있고, 해당 세션과 세션아이디가 다르니 초과 오류를 반환하는 것으로 확인이 됩니다.Logout 후에도 세션이 남아있는 이유와 해결방법이 있을까요?