테스트용 데이터를 추가하기 위해 아래와 같은코드를 만들었습니다. @Component @RequiredArgsConstructor public class TestDataInit { private final ItemService itemService; private final ItemRepository itemRepository; /** * 테스트용 데이터 추가 */ @PostConstruct public void init() { itemService.saveItem(new Book("김영한","츨핀시한빛")); itemService.saveItem(new Book("호날두","출판사멩구")); //오류 발생// itemRepository.save(new Book("a","출판사a")); itemRepository.save(new Book("b","출판사b")); } } 한번은 itemService를 이용하여 값을 넣었고 다른 한번은 itemRepository를 이용하여 값을 넣었습니다. 제 단순한 생각으로는 '어차피 itemService는 itemRepository에 바로 위임을하니 바로 itemRepository로 저장하자' 여서 실행했더니 localhost에서 연결을 거부했습니다. 오류가 나왔습니다. <질문> 왜 itemRepository로 저장하면 안되고 itemService로만 저장해야 데이터가 추가되는 지 궁금합니다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의 코드를 그대로 따라가고 있지는 않고 기존에 알고 있던 내용이랑 합쳐서 코드를 작성하고 있습니다. Controller @PutMapping("/user") public void updateUserName(@RequestBody UpdateUserDto updateDto) { userService.updateUserName(updateDto.getId(), updateDto.getName()); } Dto public class UpdateUserDto { private long id; private String name; public long getId() { return id; } public String getName() { return name; } Repository @Override public void updateUserName(long id, String name) { String sql = "update user set name = ? where id = ?"; jdbcTemplate.update(sql, name, id); } Service @Override public void updateUserName(long id, String name) { userRepository.updateUserName(id, name); } 수정을 눌렀을 때 name은 정상적으로 값이 넘어오는데 id가 계속 0으로 넘어옵니다,, 등록 시에는 DB에 id가 정상적으로 입력되고 있는데 뭐가 문제일까요?
안녕하세요. 혼자 개인 프로젝트를 하면서 강의를 듣고 있는데 궁금한 점이 생겨서 질문 남깁니다! 현재 projectA 안에 프론트, 백 폴더를 제로초님처럼 만들어놓고 프론트는 react+typescript / 백은 nestjs+typescript 로 전부 설치해놓은 상태입니다. 다만, 이렇게 할 경우 proxy 설정을 프론트에서 해줘야 된다고 하여 아래 처럼 설정을 해당 강의 듣기전에 구글링하여 만들어놨었습니다. 미들웨어 설치 npm i http-proxy-middleware projectA > pront > src > setupProxy.ts const { createProxyMiddleware } = require("http-proxy-middleware"); module.exports = function (app) { app.use( createProxyMiddleware("/api", { target: "http://localhost:3095", changeOrigin: true, }) ); }; package.json // 위에 생략... "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "proxy": "http://localhost:3095/", // 아래 생략... 여기서 궁금한 점이.. proxy를 설정할 때 미들웨어를 설치하여 setupProxy.js 파일을 만들어서 사용하라는 글들을 많이 봐서 그대로 따라하고 파일명만 ts로 변경했었습니다. 이렇게 하니 api를 불러오는 url 부분에 localhost:3095 ~~~ 이 부분을 전부 다 입력해야 에러가 나지 않았고 생략해서 사용하려면 package.json에 proxy 경로를 추가하는 방법밖에는 없는걸까요??(미들웨어 설치 + setupProxy.ts 파일로만 proxy 설정을 해보고 싶었는데 이 경우에는 api url 불러오는 부분에 locallhost~~~... 를 쓸 수 밖에 없는지가 궁금합니다.) 다만.. package.json에 proxy 경로를 넣어놓고 setupProxy.ts 파일의 코드를 지워도 제대로 돌아가더라구요.. setupProxy.ts 파일을 잘 못 만든걸까요? 이때 돌아가는 이유가 package.json의 proxy 경로로만 인식을 한 것 같습니다.. https://www.npmjs.com/package/http-proxy-middleware 마지막으로 위 proxy 설정 파일을 해주면 cors 오류가 발생하지 않는 것 같은데 둘중 하나만 설정을 해주는 것이 맞을까요? 둘다 해줘야 하는건지.. 프론트에서 proxy만 하거나 백에서 cors를 설치하는 방향 둘중에 뭐가 더 나은 방향인지도 궁금합니다! 원래는 아래 cors 설치하고 아래 코드까지 작성 해놨었습니다. main.ts(back 폴더안) import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import cors = require('cors'); async function bootstrap() { const app = await NestFactory.create(AppModule); app.use(cors()); await app.listen(process.env.PORT); console.log(`listening on port ${process.env.PORT}`); } bootstrap();
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 회원 리포지토리 테스트 케이스 작성 강의에서 assertEquals(A, B), assertThat(A).isEqualTo(B)에 대한 질문이 있습니다. 두가지 메서드 모두 A와 B의 순서가 크게 중요하지 않아보이는데 그런가요? 다르다면, 첫번째 메서드는 member를 앞에 넣으시고, 뒤에 메서드는 member1을 뒤에 넣으셨는데, 메서드를 어떻게 해석해야할까요? junit 문서를 찾아보아도 그런 설명이 없네요..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 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 more Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended MemberServiceIntegrationTest > ȸ������() FAILED org.hibernate.exception.SQLGrammarException at MemberServiceIntegrationTest.java:28 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at MemberServiceIntegrationTest.java:28 2023-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 FAILED FAILURE: 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.org BUILD FAILED in 22s 4 actionable tasks: 1 executed, 3 up-to-date 아래 사진은 application.properties 디렉터리의 코드입니다. 아래 사진은 SpringConfig 클래스의 코드입니다. 해결 방법을 모르겠네요ㅠㅠㅠ
controllers/auth.ts의 passport.authenticate("local", (authError, user, info) => { ... 부분에서 콜백함수의 매개변수들에 "매개 변수에는 암시적으로 'any' 형식이 포함됩니다.ts(7006)" 이런 에러가 발생해서 const callback: AuthenticateCallback = (authError, user, info) => { ... 이렇게 분리해서 타입을 붙여줬고, 매개변수 에러는 없어졌지만 밑에 if (!user) { // 로직 실패 (유저가 없을 때) return res.redirect(`/?loginError=${info.message}`); } 여기에서 info에선 "(parameter) info: string | object | (string | undefined)[] | undefined 개체가 'undefined'인 것 같습니다.ts(2532)" 에러가 뜨고 message에선 "'string | object | (string | undefined)[]' 형식에 'message' 속성이 없습니다. 'string' 형식에 'message' 속성이 없습니다.ts(2339)" 에러가 떠서 if (!user) { // 로직 실패 (유저가 없을 때) const infoWithMessage = info as { message: string }; return res.redirect(`/?loginError=${infoWithMessage.message}`); } 이런식으로 타입에러 처리를 해줬습니다. 그런데 테스트 코드 짤 때 100%가 나왔다 하더라도 의미없는 테스트 코드를 짤 수 있다고 경고하신 것처럼 이것도 타입스크립트 에러 처리를 해도 타입스크립트를 제대로 활용해서 타입 명시를 한 것인지, 아니면 그냥 에러 지우기만을 위해서 꼼수를 부린 것인지 어떻게 판단해야 할 지 모르겠습니다. 위 경우에 제대로 사용한 것이 맞는지, 어떤 기준으로 제대로 TS를 사용했다 판단하는 것인지 궁금합니다.
몽구스 연결하고, 실행하면, 연결성공 메시지까지 뜨는데, 접속하면 room.find is not a function이 출력됩니다. const Room = require('../schemas/room")을 const {Room}이나 const {Room, roomSchema}로 바꾸는 걸 해봐도 해결되진 않습니다. 제 생각으로는 schemas/room 과 controller의 index가 제대로 연결되지 않는것으로 보이는데 어떻게 접근하면 좋을까요?
백엔드를 npm run start로 했을 시 로그인이 안되는 문제가 있습니다. 프론트,백엔드 https적용되어있고 같은 도메인을 쓰고있습니다. app.js에 cookie.secure를 주석처리하면 로그인이 됩니다. 질문드린 이유는 지금 제 프론트 <-> 백엔드가 https 통신이 아닌 것인지 맞다면 왜 cookie.secure를 true로 했을 때 왜 쿠키가 설정이 안되는 것인지 알고싶습니다. -시도한 방법 - domain에 상위도메인 넣어보았는데도 안됩니다 ㅠ 저와 비슷한 상황을 겪은 분의 질문을 보던 중 궁금한 게 있어서 이것도 적어봅니다. https://www.inflearn.com/questions/342672/express-aws-%EB%B0%B0%ED%8F%AC-%ED%9B%84-%EC%84%B8%EC%85%98-%EC%BF%A0%ED%82%A4 여기서 cors는 어떻게 하란걸까요? -아래는 제 상황을 파악하시는데 도움이 될만한 내용을 적어봤습니다.- 아래는 프론트에서 login 요청시 morgan 로그입니다. 프론트 url입니다 => https가 적용되어있습니다. 아래는 백엔드 url을 인터넷주소창에 쳤을 때입니다. 아래는 프론트에서 백엔드로 login 요청했을 때 요청헤더입니다. 아래는 백엔드서버 nginx 설정입니다. Route53 호스팅 영역 설정입니다. app으로 시작하는게 백엔드입니다. (CNAME이런건 그림판으로 지웠습니다.) 가비아에도 서브도메인으로 등록했습니다.
다른 질문글들을 살펴보니 .env파일 설정이 안되어 있거나 back 서버를 구동하지 않은 상태에서 에러가 나던데 저는 .env파일과 back서버 모두 구동을 했음에도 에러가 뜹니다. 제가 했던 설정 중 일반적인 설정과 다른 경우는 1장에서 db를 생성하고 만들었을 때 mysql비밀번호가 있음에도 도저히 인식하지 못해 설정파일에 변수명이 아닌 직접 비밀번호를 입력한 경우를 제외하곤 강의에서 설명한 설정 그대로 수행했습니다. 어떤게 문제일까요?
제가 지금까지 이해한 바로는, esModuleInterop를 true로 설정하면 CommonJS모듈에서 내보내기 한 것들을 ES모듈의 내보내기 한 것으로 변환 시켜주는데 CommonJS에선 module.exports나 exports.변수 나 둘 다 하나의 객체로 담겨져 보내지니 ES모듈의 내보내기로 전환될 땐 무조건 Default Export 방식으로 전환되는 것으로 알고있습니다. 그래서 ES모듈로 가져오는 것으로 바꿔줄 때에도 그냥 Default Export 를 가져오는 방식으로만 변환해주면 되는 것으로 아는데 const { Strategy: LocalStrategy } = require("passport-local"); 이 부분을 import { Strategy as LocalStrategy } from "passport-local" 이렇게 Named Export를 가져오는 방식으로 바꾸는 것이 가능한 게 이해가 되질 않습니다. import Strategy as from "passport-local" 이렇게 가져와서 따로 구조분해를 해야 하는 것이 아닌가요?
강사님. 항상 강의 잘 보고 있습니다. 궁금한게 있어서 질문 드립니다. 제가 이해하기론 클라이언트가 하나 연결될 때마다 서버는 새로운 소켓을 만들고 거기에 클라이언트를 연결한다?로 이해하고 있는데요. 만약 제가 이해한 것이 맞다면 새로 만들어진 소켓에 새 포트번호가 매핑되서 클라이언트랑 통신을 해야할 것 같은데 wireshark로 확인해보면 25000로 클라이언트와 통신을 하고 있어서요. 제가 놓친 것이 무엇인가요?
노드 모듈을 import할 때 발생하는 TS7016에러는 @types를 설치하니 사라졌는데 import pageRouter from "./routes/page"; import authRouter from "./routes/auth"; import postRouter from "./routes/post"; import userRouter from "./routes/user"; import passportConfig from "./passport"; 부분은 error TS7016: Could not find a declaration file for module './models'. 'C:/Users/mikg2/Desktop/project-ts/models/index.js' implicitly has an 'any' type. 에러가 발생하는데 이것도 나중에 ts파일로 바꿔주면 사라지는 에러인가요? 그리고 제로초님 영상과는 달리 제 컴퓨터에서만 왜 해당 에러가 뜨는 건지 궁금합니다.
App.tsx부분입니다. 여기에서 Router부분 주석처리하고 테스트중입니다라는 텍스트만 적어놓고 npm run build 후 생긴 index.html을 클릭하면 아래 이미지처럼 텍스트가 제대로 나오는거까진 확인을 하였습니다. 그런데 텍스트를 지우고 index.html 을 실행하면 화면에 아무것도 나오질 않습니다. 코드대로라면 백엔드와 통신이 안될 땐 로딩중입니다는 텍스트가 떠야하는데 말이죠.. import React, { FC } from 'react'; import './App.css'; import { Router } from '../router'; const App = () => { return ( <div className="App"> <Router /> </div> ); }; export default App; -npm run build 후 App.tsx에 <Router/> 주석 후 테스트중입니다 텍스트 입력 후 index.html 실행 화면 -npm run build 후 App.tsx에 <Router/> 주석 해제 후 index.html 실행 화면 및 네트워크 개발자도구 -npm run dev (정상일 경우 동작해야하는 화면) 제가 이 질문을 드린건 지금 s3에 버킷 생성 후 dist에 있는 폴더를 아래처럼 다 올렸습니다. 그 후 엔드포인트에 접속했는데 아무것도 안 뜨길래 로컬에서 빌드 후 생긴 index.html에 로딩중입니다가 떠야 s3 엔드포인트에 접속했을 때도 로딩중입니다가 뜰 거 같아서 로컬에서 문제를 해결해보고 있습니다. -s3 파일 업로드 화면- 아래는 웹 시작초기에 관련 있는 코드들이라 생각되어 같이 올립니다. client.tsx부분입니다. import 'core-js/stable'; import 'regenerator-runtime/runtime'; import React from 'react'; import { render } from 'react-dom'; import { BrowserRouter } from 'react-router-dom'; import axios from 'axios'; import App from './layouts/App'; axios.defaults.withCredentials = true; axios.defaults.baseURL = process.env.NODE_ENV === 'production' ? 'http://localhost:3095' : 'http://localhost:3095'; render( <BrowserRouter> <App /> </BrowserRouter>, document.querySelector('#app'), ); index.html입니다. <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>주식 캘린더</title> <style> html, body { margin: 0; padding: 0; overflow: initial !important; } body { font-size: 15px; line-height: 1.46668; font-weight: 400; font-variant-ligatures: common-ligatures; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } * { box-sizing: border-box; } </style> <!-- <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.png" /> --> </head> <body> <div id="modal"></div> <div id="app"></div> <script src="./dist/app.js"></script> </body> </html> 하루 반나절동안 잡고 있는데도 해결이 안되어서 질문드립니다.. ㅠㅠ... 도와주세요 제발...ㅠㅠㅠㅠ
이전에 혼자 ddd, 헥사고날 아키텍처를 공부하면서 느꼈던게 객체지향적인 코드 + 테스트하기 용이한 코드를 작성하기 위해서는 결국 domain layer와 persistence layer의 분리가 필수적인데 jpa entity와 domain entity를 완전히 분리했을 때 JPA가 mybatis나 jdbc template를 사용하는 것과 비교해 가지는 강점이 있는지 잘 모르겠습니다.. 그나마 jpa entity와 domain entity를 분리하지 않는다면 어떻게든 온몸 비틀기로 그나마 테스트하기 용이하고 객체지향스러운 코드를 작성해볼 수는 있지만 결국 복잡한 로직에서는 쿼리 때문에 문제가 생기고 ㅜ 지식 공유자님께서는 이 문제에 대해 어떻게 생각하시나요?