묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
chapter02-02-ex1 정렬 질문 있습니다!
10자리까지만 드래그 되어야 하는게 아닌가요..? 뭔가 정렬이 된 것 같은데, 자릿수를 셀 수가 없어서요.. 어떻게 해야 하나요?
-
미해결스프링 배치
optionalKeys, requiredKeys
안녕하세요 20:00 부분입니다 옵셔널 키는 없어도 된다고 앞에서 해주셨는데왜 체크를 하는건가요 ?!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
@column 어노테이션 관련하여 질문드립니다.
안녕하세요 강사님. 이번 강의에서는 UserLoanHistory 클래스를 @Entity로 사용하는데요, userId, bookName 등 변수에 @column 어노테이션을 붙이지 않은 것을 확인할 수 있었습니다. 저번에 강사님께서 column 어노테이션이 없으면 변수명과 동일한 db 필드에 매핑된다고 하셨습니다. 이번강의에서 코드가 정상적으로 동작하는데 column 어노테이션이 없을때 자바의 camel case 변수가 db의 snake 형태의 이름으로 자동으로 변환되어 쿼리문이 실행되는 건지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@TestConfiguration 유무 차이 질문
안녕하세요, 코드 실행중에 질문이 있어 문의 드립니다.package hello.springtx.propagation; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.UnexpectedRollbackException; import org.springframework.transaction.interceptor.DefaultTransactionAttribute; import javax.sql.DataSource; import static org.assertj.core.api.Assertions.*; @SpringBootTest @Slf4j public class BasicTxTest { @Autowired PlatformTransactionManager txManager; @TestConfiguration static class Config{ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } } @Test void commit(){ log.info("트랜잭션 시작"); TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트잭 커밋 시작"); txManager.commit(status); log.info("트잭 커밋 완료"); } @Test void rollback(){ log.info("트랜잭션 시작"); TransactionStatus status = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트잭 롤백 시작"); txManager.rollback(status); log.info("트잭 롤백 완료"); } @Test void double_commit(){ log.info("트랜(1) 시작"); TransactionStatus status1 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜(1) 커밋"); txManager.commit(status1); log.info("트랜(2) 시작"); TransactionStatus status2 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜(2) 커밋"); txManager.commit(status2); } @Test void double_commit_rollback() { log.info("트랜잭션1 시작"); TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션1 커밋"); txManager.commit(tx1); log.info("트랜잭션2 시작"); TransactionStatus tx2 = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("트랜잭션2 롤백"); txManager.rollback(tx2); } @Test //논리 두개 정상 커밋 -> 물리 커밋 void inner_commit() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("outer.isNewTransaction()={}", outer.isNewTransaction()); /** * 외부 트랜잭션 이어받아서 실행 * 그래서 commit 해도 아무런 변화도 없음, 당연 트잭 생성도 없음 */ log.info("내부 트랜잭션 시작"); TransactionStatus inner = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("inner.isNewTransaction()={}", inner.isNewTransaction()); log.info("내부 트랜잭션 커밋"); txManager.commit(inner);//변화가 없다고 볼수 있따 log.info("외부 트랜잭션 커밋"); txManager.commit(outer); } @Test//내부 commit 외부 rollback -> rollback void outer_rollback() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("내부 트랜잭션 시작"); TransactionStatus inner = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("내부 트랜잭션 커밋"); txManager.commit(inner); //변화가 없다고 볼수 있따 log.info("외부 트랜잭션 롤백"); txManager.rollback(outer); } @Test //내부 : rollback , 외부 : commit : rollback void inner_rollback() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("내부 트랜잭션 시작"); TransactionStatus inner = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("내부 트랜잭션 롤백"); txManager.rollback(inner); log.info("외부 트랜잭션 커밋"); assertThatThrownBy(() -> txManager.commit(outer)) .isInstanceOf(UnexpectedRollbackException.class); } @Test//외부 내부 별개의 커넥션으로 작동, 각각 따로 작동! PROPAGATION_REQUIRES_NEW! void inner_rollback_requires_new() { log.info("외부 트랜잭션 시작"); TransactionStatus outer = txManager.getTransaction(new DefaultTransactionAttribute()); log.info("outer.isNewTransaction()={}", outer.isNewTransaction()); log.info("내부 트랜잭션 시작"); DefaultTransactionAttribute definition = new DefaultTransactionAttribute(); definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); TransactionStatus inner = txManager.getTransaction(definition); log.info("inner.isNewTransaction()={}", inner.isNewTransaction()); log.info("내부 트랜잭션 롤백"); txManager.rollback(inner); //롤백 log.info("외부 트랜잭션 커밋"); txManager.commit(outer); //커밋 } } 해당 코드에서, @TestConfiguration static class Config{ @Bean public PlatformTransactionManager transactionManager(DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } } 이부분은 boot에서 자동 으로 생성해주는 부분이니 빼도 문제없이 작동한다고 생각했습니다. 그래서 돌려보니, 모든 테스트가 통과는 됩니다.그러나, inner_rollback() 에서만 문제가 있어 문의 드립니다. 2023-03-05 18:03:46.478 INFO 11608 --- [ Test worker] hello.springtx.propagation.BasicTxTest : 외부 트랜잭션 시작2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Opened new EntityManager [SessionImpl(1559037239<open>)] for JPA transaction2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@6ee1ddcf]2023-03-05 18:03:46.479 INFO 11608 --- [ Test worker] hello.springtx.propagation.BasicTxTest : 내부 트랜잭션 시작2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(1559037239<open>)] for JPA transaction2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Participating in existing transaction2023-03-05 18:03:46.479 INFO 11608 --- [ Test worker] hello.springtx.propagation.BasicTxTest : 내부 트랜잭션 롤백2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Participating transaction failed - marking existing transaction as rollback-only2023-03-05 18:03:46.479 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Setting JPA transaction on EntityManager [SessionImpl(1559037239<open>)] rollback-only2023-03-05 18:03:46.488 DEBUG 11608 --- [ Test worker] cResourceLocalTransactionCoordinatorImpl : JDBC transaction marked for rollback-only (exception provided for stack trace)java.lang.Exception: exception just for purpose of providing stack trace at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:324) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.engine.transaction.internal.TransactionImpl.markRollbackOnly(TransactionImpl.java:203) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.engine.transaction.internal.TransactionImpl.setRollbackOnly(TransactionImpl.java:224) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.springframework.orm.jpa.JpaTransactionManager$JpaTransactionObject.setRollbackOnly(JpaTransactionManager.java:712) ~[spring-orm-5.3.17.jar:5.3.17] at org.springframework.orm.jpa.JpaTransactionManager.doSetRollbackOnly(JpaTransactionManager.java:611) ~[spring-orm-5.3.17.jar:5.3.17] at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:844) ~[spring-tx-5.3.17.jar:5.3.17] at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:809) ~[spring-tx-5.3.17.jar:5.3.17] at hello.springtx.propagation.BasicTxTest.inner_rollback(BasicTxTest.java:117) ~[test/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) ~[junit-platform-commons-1.8.2.jar:1.8.2] at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) ~[junit-jupiter-engine-5.8.2.jar:5.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2] at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2] at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.8.2.jar:1.8.2] at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) ~[na:na] at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) ~[na:na] at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) ~[na:na] at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) ~[na:na] at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) ~[na:na] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) ~[na:na] at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) ~[na:na] at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) ~[na:na] at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) ~[na:na] at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) ~[na:na] at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) ~[na:na] at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) ~[na:na] at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na] at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na] at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na] at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) ~[na:na] at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source) ~[na:na] at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) ~[na:na] at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) ~[na:na] at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) ~[na:na] at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) ~[na:na] at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na] at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) ~[na:na] at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) ~[na:na] at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na] at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na]2023-03-05 18:03:46.490 INFO 11608 --- [ Test worker] hello.springtx.propagation.BasicTxTest : 외부 트랜잭션 커밋2023-03-05 18:03:46.526 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit2023-03-05 18:03:46.526 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(1559037239<open>)]2023-03-05 18:03:46.527 DEBUG 11608 --- [ Test worker] cResourceLocalTransactionCoordinatorImpl : On commit, transaction was marked for roll-back only, rolling back2023-03-05 18:03:46.527 DEBUG 11608 --- [ Test worker] o.s.orm.jpa.JpaTransactionManager : Closing JPA EntityManager [SessionImpl(1559037239<open>)] after transaction해당 로그가 뜨면서 테스트 통과는 됩니다.왜 이런 오류가 발생하는지 조금 이해가 안되서요, 그리고 내부에서 rollback을 했음에도 불구하고, Global transaction is marked as rollback-only but transactional code requested commit보이지 않습니다. 왜 이런 문제가 발생하는 걸까요??
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
_open 을 판별하는 매서드나 클래스 정보를 알려주실수 있나요?
request에서 담긴 내용을 Cotroller에게 넘겨주기전에DispatchServlet에서 구분하고 값을 변경해서 넣어주는데관련된 매서드나 클래스를 알수 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
MemberServiceTest 실행 시 오류
아래는 MemberServiceTest의 코드입니다package hello.core.member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.util.Assert; public class MemberServiceTest { MemberService memberService = new MemberServiceImpl(); @Test void join() { //given Member member = new Member(1L, "memberA", Grade.VIP); //when memberService.join(member); Member findMember = memberService.findMember(1L); //then Assertions.assertThat(member).isEqualTo(findMember); } }
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
c++을 공부하고 Java를 공부하려고 하는데 클래스부터 진행하도 괜찮을까요??
지금 연산자 강의를 듣고있는데 c++과 중복되는 부분이 많아서 시간 낭비같이 보여서 바로 후반전인 클래스부터 강의를 들을까하는데..... 어떻게 할까요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 68p 오류
#include<bits/stdc++.h> using namespace std; vector<pair<int, int>> v; bool cmp(pair<int, int> a, pair<int, int> b){ return a.first > b.first; } int main(){ for(int i = 10; i >= 1; i--){ v.push_back({i, 10, -i}); } 푸시백에 빨간줄이 생기는데 왜그럴까요 인스턴스가 없다는데 뭔지 모르겟네요 }
-
미해결쉽고 빠르게 익히는 PowerPoint 2016
좋은 강의 ..,,
좋은 강의 였습니다.BEST !!
-
미해결Vue3 완벽 마스터: 기초부터 실전까지 - "기본편"
"v-bind 사용은 해당 데이터가 반응형인지 아닌지에 달려있다"는 이해가 옳은 건가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, template refs 수업에서ref="input" :ref="el => itemRefs.push(el.textContent)" 이와 같이, 전자는 v-bind 없이 사용했고, 함수를 ref로 사용할 땐 v-bind를 사용했습니다.이 이유가 무엇일까요? 비슷한 맥락의 의문으로, 자식 컴포넌트에서 정의된 props (ex. props = ['data'])로 데이터를 내려줄 때,부모 컴포넌트의 script에서 선언한 정적인 데이터 (ex. const msg = "message")의 경우는 < ... data="msg" >반응형 데이터 (ex. const msgRef = ref("message")의 경우는 < ... :data="msgRef"> 로 사용하는 것으로 이해하고 있습니다.즉, v-bind의 사용은 데이터가 반응형인지 아닌지에 따라 판단한다..고 이해하고 있는데요, 이게 옳은 이해인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
API가 어떤 맥락으로 쓰였는지 잘 모르겠습니다..
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]영한님께서 http의 body에 직접 데이터를 넣는 것을 API 방식이라 하셨는데 이 부분이 잘 이해가 되지 않습니다.😢우선 저는 API를 모르는 상태이기 때문에 API에 대해 찾아봤습니다. 그랬더니 아래와 같은 내용이 나왔습니다.운영체제와 응용 프로그램 사이의 통신에 사용되는 언어나 메시지 형식 구현방식을 알지 못하는 서비스와 통신할 수 있게 해줌 (like 가게 직원) 웹기반 데이터 반환 시스템그런데 API에 대해 이해하고 나니 더더욱 왜 json을 body에 직접 넣는 방식을 API 방식이라 하셨는지 이해가 되지 않았습니다....어떤 의미에세 'API 방식'이라 하셨는지 알려주시면 감사하겠습니다.
-
미해결스프링 부트 - 핵심 원리와 활용
conditional 적용 문의
안녕하세요,자동구성 설정 부분에서 예시로 config파일에 memorycontroller를 빈으로 설정 후 conditional 동작 여부 확인하는 부분을 학습하던 중 궁금한 점이 생겨서 문의드립니다.빈으로 등록한 controller에도 conditionalOnMissingBean을 적용해서 원하는 controller만 빈으로 등록되게 할수 있을까요?===========================동작을 예상한 시나리오는 Memory2Controller가 빈으로 등록이 되어서 memory2 로그가 찍히는 걸 예상했는데 설정이 잘못된건지 잘모르겠습니다.아니면 controller에는 conditional적용을 할순없는걸까요?
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
DB 연동 부분에서 에러가 발생합니다.
에러 코드 중 일부입니다. This application has no explicit mapping for /error, so you are seeing this as a fallback.Sun Mar 05 16:31:35 KST 2023There was an unexpected error (type=Internal Server Error, status=500).nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: null ### The error may exist in file [build\resources\main\sqlmapper\v1\CoffeeMenu.xml] ### The error may involve com.boot.sailing.v1.dao.MenuDao.doList ### The error occurred while executing a query ### Cause: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: nullorg.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: null ### The error may exist in file [build\resources\main\sqlmapper\v1\CoffeeMenu.xml] ### The error may involve com.boot.sailing.v1.dao.MenuDao.doList ### The error occurred while executing a query ### Cause: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: null CoffeeMenu.xml<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.boot.sailing.v1.dao.MenuDao"> <!-- 메뉴 조회 --> <select id="doList" resultType="map"> SELECT no, coffee, kind, price, DATE_FORMAT(reg_day,'%Y.%m.%d') AS reg_day, DATE_FORMAT(mod_day,'%Y.%m.%d') AS mod_day FROM coffee_menu; </select> </mapper>MenuDao.javapackage com.boot.sailing.v1.dao; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; @Mapper public interface MenuDao { List<Map<String, Object>> doList(); }MenuSvc.javapackage com.boot.sailing.v1.service; import com.boot.sailing.v1.dao.MenuDao; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Log4j2 public class MenuSvc { @Autowired MenuDao menuDao; public List<Map<String, Object>> doList(){ // Data 만들기 , List , Map List<Map<String, Object>> list = menuDao.doList(); log.info(list); return list; } public MenuSvc() { log.info("============== MenuSvc , 생성자 ====================="); } }DB도 강사님이랑 똑같이 설정했는데 왜 에러가 발생하는지 모르겠습니다
-
미해결[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
인트로 화면 제작부분에서 질문있습니다.
인트로 화면 완료 (Navigation)2분에서 private var _binding: FragmentIntro1Binding?=null 에서요.FragmentIntro1Binding는 무슨 타입인가요? 코인선택 화면 꾸미기 (XML)2분 38초에서요.처음에는 val intent= Intent(this,SelectActivity::class.java)이렇게 쓰셨다가 빨간줄 나오니까 val intent= Intent(requireContext(),SelectActivity::class.java)로 쓰셨는데요.근데 여기 https://www.youtube.com/watch?v=oXIeBhV06-Y 17분정도에는 Intent(this,)로도 가능한데 왜 안되나요? 3.스플래쉬화면만들기에서8분정도에요. 인터넷에 찾아보니 xml 에서도 상속 받는다는건 알겠는데요. 혹시 어디서 받는건가요? 해당 xml 파일은 Theme.SplashScreen이 없던데요.<style name="Theme.MyApplication3.Splash" parent="Theme.SplashScreen">4.네비게이션 인트로 화면세팅 10 분 44초에서tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp"지우고가로 세로 mach_parent로 하면 왜 <androidx.fragment.app.FragmentContainerView 이부분이 빨간줄이 사라지나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-G 12851 문제해설 링크
안녕하세요 v.23.02.24 문제해설 교안을 다운받았는데 여기에도 3-G 링크가 반영이 안된것같아서요 다시 한 번 확인 부탁드리겠습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 적용 내부 메서드를 다른 서비스로 분리시에 서비스간 순환 참조 문제 해결 방안
트랜잭션 AOP 주의 사항 - 프록시 내부 호출2 강의 관련 서비스 계층에서 서비스 계층을 주입 받는 부분 관련해서 문의 드립니다. 실무에서는 서비스간 순환 참조에 어떻게 대응하는지 문의 드립니다.실무 중에 서비스에서 서비스를 주입 받다보면 순환 참조가 발생하는 문제가 생길 수 있다고 알고 있습니다. 그런데 트랜잭션 적용 메서드 내부 호출(this.{트랜잭션 적용 메서드})일 경우에 트랜잭션이 안걸리는 문제를 해결하기 위해 트랜잭션 적용 메서드를 다른 서비스로 분리하고 분리된 서비스를 주입 받아서 프록시가 호출되도록 하셨습니다. 보통은 스프링이 순환 참조일 때 run 시점에 에러를 발생 시키기는 합니다. 그런데 이런 문제를 실무에서 실행 시점이 아닌 코드 작성 시점에 어떤식으로 해결 하나요? 개발팀간에 약속을 하고 분리된 서비스에 다른 서비스를 주입하지 못하게 하는지 아니면 다른 방법이 있는지 궁금합니다. 아래는 예시 코드와 실제 자바 run 시점에 발생한 에러 코드 입니다.Description: The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | externalService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/ExternalService.class] ↑ ↓ | internalService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/InternalService.class] ↑ ↓ | otherService defined in file [/Users/inor/Desktop/Projects/study/db2/springtx/build/classes/java/main/hello/springtx/service/OtherService.class] └─────┘ class ExternalService { private final InternalService internalService ; public void external() { internalService.internalTx(); } }class InternalService { private final OtherService otherService; @Transactional public void internal() {...} }class OtherService { private final ExternalService externalService; }
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
응답 강의중 질문입니다
Pdf 파일에 "204:내용없음, DELETE"라고 되어 있어 질문이 생겼습니다.204는 삭제요청을 했는데 내용 없을때 리턴해주는 상태 코드인건가요?? Get요청을 했는데 없을시에도 204를 리턴해 주어도 될까요?3xx 잘가~ 는 어떤 의미로 받아들여야 할지...이해가 가지 않습니다...
-
미해결테스트주도개발(TDD)로 만드는 NodeJS API 서버
요청 형식 강의 질문입니다
HTTP경로로 자원을 식별한다고 알려주셨는데! lecture?user={id} 와 같은 식으로는 사용하지 않는건가요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
휴가 코드 질문
def DFS(L, sum): global res if L>n: return if L==n: if res<sum: res=sum else: DFS(L+pt[L], sum+p[L]) DFS(L+1, sum) n=int(input()) pt=list() p=list() for i in range(n): a,b=map(int, input().split()) pt.append(a) p.append(b) res=0 DFS(0,0) print(res) 강사님 휴가 코드를 이렇게 짰는데 출력은 정확히 나오는데, 제가 올린 형식으로 풀어도 상관없는걸 까요?
-
미해결Jenkins를 이용한 CI/CD Pipeline 구축
강의 밑에 적어주신 script 현행화 좀 부탁드리겠습니다.
유익한 강의 우선 감사드립니다. Ansible 설정과 동작 과정 수업에서 이걸로 적어 주셨는데 docker run --privileged --itd --name ansible-server -p 20022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/ansible:latest /usr/sbin/init--itd -> -itd로 바꿔야 동작하고 그리고 한 단계 넘어 갔더니 ssh_exchange_identification: Connection closed by remote host메세지가 나타나서 몇번을 구글링 하다 안되서 다시 이전 질문한 것들 보니까 스크립트에 빠진게 있었더라구요답변보니 수정해 놓겠다고 해주셨는데, 여전히 반영이 안되었던거 같습니다.앞으로 수강하시게 되는 분들마다 계속 저와 같은 삽질에 시간이 계속 들거 같은데 현행화 한번 해주시면 걸림돌 없이 수업에 잘 따라 올 수 있을것 같습니다. 제가 말씀 드린 강의 말고도 다른데서도 스크립트 동작이 안되는 곳이 있으니 한번 체크해 주시면 감사하겠습니다.