묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
깃허브 질
지금 깃허브도 만들었고 PS D:\programming\java_kotlin\Java_Spring_Library_Application\library-app\library-app> git push --set-upstream origin masterremote: Invalid username or token. Password authentication is not supported for Git operations.fatal: Authentication failed for 'https://github.com/ej123123123/library-app.git/'이렇게 뜨면서 깃허브 push가 안되는데 왜그럴까요
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
여기까지 다 끝냈다고 하셨는데
제가 잘못구현한건지 같은 책 이름으로여러개의 책 이름이 들어가는 거 같은데이건 상관없나요?책등록은 여러개 되는데 그에 따라서 대출은 하나밖에 안되는데예를 들면 클린코드를 3개 등록할 수 있는데, 3개 등록해도 대출은 1개밖에 안돼요
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
형 코드에 public static class 이게 뭐야 ?
형 코드 보고 있는데 아래와 같이 public static class로 되어 있어. 이게 무슨 의미야 ? 따로 static 메소드는 없는거 같은데
-
미해결스프링 핵심 원리 - 기본편
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.관련 내용이 많아서 질문 검색으로 3~4가지 방식으로 시도해봤는데 gradle만 바꾸는 방식에서 실패했습니다.@Primary 사용, CoreApplicationTests에 따로 classes = AutoConfig.class 옵션넣기 요땐 성공하더라고요유료 intellij 사용하고 있고 자바 21 사용하고 있습니다. 17로 바꿔봐도 별 상관이 없더라고요 java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@65b97f47 testClass = hello.core.CoreApplicationTests, locations = [], classes = [hello.core.CoreApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactoryCaused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\hyukj\Downloads\core\core\build\classes\java\main\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,DiscountPolicyCaused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,DiscountPolicy
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
apiEceptionController에서 센드 에러 호출하면 안되는지?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (안보임)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 남깁니다.말 그대로 apiExceptionController에서 sendErrr를 호출하면 안될까 라는? 생각이 들어서 여쭤봅니다. 해보니 되서 말입니다.일단 코드및 결과값을 공유합니다. 코드들결과 값 코드는 apiExceptionController 에서 HttpServletResponse 를 추가하고 여기에 send Error를 넣고 실행한 화면 입니다.(sendError 에서 나오는 에러는 그냥 던짐) '이렇게 해도 될 것 같은데' 라는 생각이 들어서 코드 및 결과를 공유 하고 물어봅니다.혹 이렇게 하면 안되는 건지? 아니면 이렇게 해도 되는지 궁금해서요. 수정1: 사진 하나더추가(프로퍼티즈 설정) 수정2 결과값에 json이 안되어 있어서 다시 돌림(결과값 변경, 그외 따른 사진 추가 )답변 부탁드립니다.
-
미해결Spring WebFlux + LLM 실전 구현
gemini-flash 기본 모델 업데이트 후 변경사항이 생겼네요
강의 제작해주셨을 때는 gemini flash 기본 모델 버전이 2.0 이었던거 같은데 2.5로 최근에 업데이트가 된 거 같네요. webClient 요청 uri에서도 버전을 2.5로 명시를 해줘야 정상적으로 요청 응답이 오는데 다른 분들 참고하시면 좋을 거 같아 올려봅니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemService
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]8분30초쯤 나오는 ItemService는 ItemServiceV1을 의미하는걸까요?ItemService가 interface인데 JpaItemRepository에 의존하고 있다는건 아닌거 같아서요
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
왜안될까요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 타임아웃시 쿠키 삭제 방법이 없나요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (찾아보았지만 안보임)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (읽긴 함)[질문 내용]안녕하세요. 궁금증이 생겨서 질문을 남깁니다.사용자가 작동(동작)이 없으면 시간이 지난후 세션이 종료한다는것을 프로퍼티즈 를 통해 설정할수 있는 것을 여기에서(강의) 배울 수 있었는데요. 근데 저는 미관상? 세션을 종료하고 쿠키가 남아 있는게 좋지 않다고 생각해서 찾다가 안보여서 여기에 글을 남깁니다. 로그아웃 시에는 JSESSIONID 를 null 로 주어서 쿠키를 삭제하긴 하였는데(expireCokie 메서드를 보고 따라함),server.servlet.session.timeout=60 이걸로는 쿠키가 삭제 안됩니다. (f12로 확인함) 타임아웃시 쿠키를 삭제할 방법을 알고 계시면 가르켜 주시면 감사하겠습니다. 아니면 찾을수 있게 키워드를 주시면 감사하겟습니다. 추가1그리고 타임아웃 최저 길이가 60초 인가요? 30초 해봤는데(되긴 되는데 1분이 지나서 된것 같습니다.) 정확한 시간(30초)에는 안되고 60초넘어서는 되었습니다 추가2이 번역기는 어떤 번역기를 쓰면 되나요?(좋아보여서요)추가3로그 아웃 시 쿠키 삭제 방법 (이게 있어야 된다는 생각이 갑자기 들어서 추가함)logoutV3() 메서드 에서 session.invalidate(); 밑에 3개의 코드 추가Cookie cookie = new Cookie("JSESSIONID", null); cookie.setMaxAge(0); response.addCookie(cookie); 답변 부탁 드립니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
MySQL 창이안ㄴ뜹니다
연결했는데왜 화면처럼 창이안뜨죠sql 입력하는창이안떠요
-
미해결스프링 핵심 원리 - 기본편
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
spring.main.allow-bean-definition-overriding=true07:05~ 부분에서 위 코드를 작성하면 스프링 부트 애플리케이션을 에러가 발생하지 않는 모습을 보여주셨는데요.20:53:29.311 [main] DEBUG o.s.b.d.LoggingFailureAnalysisReporter --Application failed to start due to an exception org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'drj9812.spring.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:192) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1739) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1382) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1221) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:983) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:620) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:765) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:454) at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1374) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) at drj9812.spring.Application.main(Application.java:10) 20:53:29.311 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter -- *************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in drj9812.spring.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined by method 'memberRepository' in class path resource [drj9812/spring/AutoAppConfig.class] - memberRepository: defined by method 'memberRepository' in class path resource [drj9812/spring/AppConfig.class] This may be due to missing parameter name information Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed Ensure that your compiler is configured to use the '-parameters' flag. You may need to update both your build tool settings as well as your IDE. (See https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-6.1-Release-Notes#parameter-name-retention)저의 경우엔 위와 같은 에러가 발생합니다.강사님과 다르게 저는 에러가 발생한 이유가 무엇인가요?로그 내용을 보아 AutoAppConfig과 AppConfig이 충돌이 난 것 같은데, 이미 AutoAppConfig에서 excludeFilters로 AppConfig은 스캔하지 않도록 설정했으니 에러가 발생하지 않아야 되는 거 아닌가요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
포스트맨
포스트맨 깔았는데왜 이거 실행하면 안켜질까요..?
-
미해결실전! 스프링 데이터 JPA
로그가 남지 않는 문제.
강의 막바지에 쿼리 로그를 한눈에 볼 수 있게하기 위한 라이브러리를 추가하고 실행하시는데요.저는 pdf 내용대로 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0'위 라이브러리를 추가하고 실행해보아도 쿼리 실행 로그가 보이지 않아요ㅠ
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
자바 8버전이 선택지에 없는데 어떻게 하죠
첫 프로젝트 생성에서
-
미해결실전! 스프링 데이터 JPA
테스트 라이브러리가 강의는 junit4가 맞나요??
영상에서는 이제 junit5를 의존관계로 가져간다고 나와있고 build.gradle에 있는 exclude가 junit4버전에 대한걸 exclude한다고 하시는데요..그럼 강의가 junit5버전 쓰시는거 아닌가요? pdf는 강의 영상이 junit4 버전을 기준으로 하신다는데 이것 때문에 헷갈려요
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
ExitStatus
킬구형사용자 정의 ExitStatus를 애플리케이션 종료 코드로 활용하기. 이거 커스텀 ExitCodeGenerator까지 만들었으면 jar를 실행하고 나서 $LASTEXITCODE로 조회했을 때 코드 값이 바뀌어 있어야 하는거지?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
Batch6: jobOperator.startNextInstance() throws UnexpectedJobExecutionException
KILL-9형 도와줘,,!!!spring boot 4.0.0, spring batch6, java24 사용중이야 아래 코드를 스케줄러를 통해 "deleteSuspendedJob"을 1분마다 동작하게 하고 싶었어. 그리고 실제로 동작하긴 해. 딱 1번만.... @Configuration class DeleteSuspendedScheduler( private val jdbcTemplate: JdbcTemplate, private val jobOperator: JobOperator, private val jobRepository: JobRepository, private val transactionManager: PlatformTransactionManager, ) { @Scheduled(cron = "0 */1 * * * *") //1분마다 실행되길 기대함 fun runDeleteSuspendedJob() { jobOperator.startNextInstance(deleteSuspendedJob()) } @Bean fun deleteSuspendedJob(): Job = JobBuilder("deleteSuspendedJob", jobRepository) .incrementer(RunIdIncrementer()) .start( deleteSuspendedStep()) .build() @Bean fun deleteSuspendedStep(): Step = StepBuilder("deleteSuspendedStep", jobRepository) .tasklet(DeleteSuspendedTasklet(jdbcTemplate), transactionManager) .build() }아래는 에러 로그야. 2025-12-11T19:37:31.332+09:00 INFO 39640 --- [ main] com.clip.BatchApplicationKt : Started BatchApplicationKt in 6.378 seconds (process running for 6.894) 2025-12-11T19:38:00.017+09:00 INFO 39640 --- [ scheduling-1] o.s.b.c.l.s.TaskExecutorJobOperator : Launching next instance of job: [deleteSuspendedJob] with parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}] 2025-12-11T19:38:00.019+09:00 INFO 39640 --- [ scheduling-1] o.s.b.c.l.s.TaskExecutorJobLauncher : Job: [SimpleJob: [name=deleteSuspendedJob]] launched with the following parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}] 2025-12-11T19:38:00.052+09:00 INFO 39640 --- [ scheduling-1] o.s.batch.core.job.SimpleStepHandler : Executing step: [deleteSuspendedStep] 2025-12-11T19:38:00.065+09:00 INFO 39640 --- [ scheduling-1] c.c.b.b.t.DeleteExpiredBlacklistTasklet : 0개의 기간 만료된 탈퇴 이력(재가입 방지용) 레코드가 삭제되었습니다. 2025-12-11T19:38:00.067+09:00 INFO 39640 --- [ scheduling-1] o.s.batch.core.step.AbstractStep : Step: [deleteSuspendedStep] executed in 14ms 2025-12-11T19:38:00.067+09:00 INFO 39640 --- [ scheduling-1] o.s.b.c.l.s.TaskExecutorJobLauncher : Job: [SimpleJob: [name=deleteSuspendedJob]] completed with the following parameters: [{JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}] and the following status: [COMPLETED] in 15ms 2025-12-11T19:39:00.007+09:00 INFO 39640 --- [ scheduling-1] o.s.b.c.l.s.TaskExecutorJobOperator : Launching next instance of job: [deleteSuspendedJob] with parameters: [{JobParameter{name='run.id', value=2, type=class java.lang.Long, identifying=true}}] 2025-12-11T19:39:00.009+09:00 ERROR 39640 --- [ scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task org.springframework.batch.core.job.UnexpectedJobExecutionException: Illegal state (only happens on a race condition): job instance already complete with name=deleteSuspendedJob and parameters={JobParameter{name='run.id', value=2, type=class java.lang.Long, identifying=true}} at org.springframework.batch.core.launch.support.SimpleJobOperator.startNextInstance(SimpleJobOperator.java:314) ~[spring-batch-core-6.0.0.jar:6.0.0] at org.springframework.batch.core.launch.support.TaskExecutorJobOperator.startNextInstance(TaskExecutorJobOperator.java:133) ~[spring-batch-core-6.0.0.jar:6.0.0] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na] at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-7.0.1.jar:7.0.1] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-7.0.1.jar:7.0.1] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158) ~[spring-aop-7.0.1.jar:7.0.1] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:370) ~[spring-tx-7.0.1.jar:7.0.1] Caused by: org.springframework.batch.core.launch.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for identifying parameters={JobParameter{name='run.id', value=1, type=class java.lang.Long, identifying=true}}. If you want to run this job again, change the parameters. at org.springframework.batch.core.launch.support.TaskExecutorJobLauncher.createJobExecution(TaskExecutorJobLauncher.java:149) ~[spring-batch-core-6.0.0.jar:6.0.0] at org.springframework.batch.core.launch.support.TaskExecutorJobLauncher.run(TaskExecutorJobLauncher.java:108) ~[spring-batch-core-6.0.0.jar:6.0.0] at org.springframework.batch.core.launch.support.SimpleJobOperator.startNextInstance(SimpleJobOperator.java:294) ~[spring-batch-core-6.0.0.jar:6.0.0]원래 Kill9형 강의 보고 잡 런쳐로 정상동작 하도록 만들었던 걸, 이번에 배치6로 올리면서 JobLauncher가 JobOperator로 옮겨졌다는 문서를 보고 바꾼뒤로 퇴근을 못하고 있어,,역시 공식 문서보단 kill9 형 문서를 보고 했어야 했던걸까??오퍼레이터와 스케줄러를 통해 잡을 특정 주기마다 동작하는 방법(위 내 코드)이 뭐가 잘못된건지 알려주면 고맙겠어!!형 제발 도와줘!!!cf.https://github.com/spring-projects/spring-batch/issues/5115
-
미해결실전! 스프링 데이터 JPA
pdf 파일과 차이점이 있는 것같은데 문제 없나요?
위는 강의 pdf 파일에서 캡쳐한 build.gradle 설정 내용입니다.아래는 제가 프로젝트 생성후 캡쳐한 build.gradle의 의존성 사진입니다. pdf 설명대로 JUnit4를 추가했습니다.그런데 pdf 파일에testImplementation(‘org.springframework.boot:spring-boot-starter-test’) { exclude group: ‘org.junit.vintage’, module: ‘junit-vintage-engine’ }가 있던데 이것도 추가해줘야하는 부분인가요?없으면 추후 강의를 진행하는데 문제가 될까요?현재 pdf 파일에 있는 build.gradle 내용과 제가 방금 프로젝트 생성 후의 build.gradle 내용과 조금 다른 것 같아 질문드립니다
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 + 검색조건 관련해서 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)[질문 내용]안녕하세요. 컬렉션 조회 최적화 부분에서 페이징 + 검색 조건 관련해서 궁금한 점이 있어서 질문드립니다.질문) Order 리스트 페이징을 하고 싶은데@BatchSize는 안쓰고 5번처럼 QueryDto직접 쿼리 2번 + map O(0) 방식으로 처리하려고 합니다. 이 때 만약 검색 조건이 toMany 로 맺어진 테이블 (orderItem.quantity, orderItem.item.name 등) 에 있다면 toOne 방향 루트 join fetch 쿼리 할 때 이 조건을 함께 포함시켜면 되는걸까요 (join orderItem .. where .. 같이)예를들어 item.name이 "tesla"인 item을 포함하고 있는 모든 order를 페이징 적용해서 보여주고 싶은 경우에 어떻게 하면 좋을지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
논리 커밋, 물리 커밋 질문드립니다.
강의 19분부터 설명하시는 내용이트랜잭션 매니저에 커밋하는 것이 논리 커밋이라고 하시는데요,실제 DB에 커밋하는 물리 커밋도 코드상에서 트랜잭션 매니저를 통해서 진행되는 것 아닌가요?이건 어떻게 이해해야 할까요?물리 트랜잭션이라는 것이 별개로 존재하는 것이 아니라 논리 트랜잭션이 모여진 개념이라결국 트랜잭션 매니저에 하는 논리 커밋이라는 것이 사실 물리 커밋도 포함하는 개념이라고 이해하여야 하나요?예를들어 외부 내부 트랜잭션이 있을 때 각각은 논리 트랜잭션이지만 하나의 물리 트랜잭션으로 묶이죠.그리고 실제로 코드상에서 외부 트랜잭션에서 커밋을 하여야 물리 커밋이 진행되는데 이때 외부 트랜잭션을 별개로 보면 논리 커밋을 진행 한 것이기도 하지만 물리 커밋이 진행된 것처럼트랜잭션 매니저가 하는 것은 논리 커밋이다 라는 개념도 논리 커밋을 하는 것은 외부 트랜잭션 일 경우 물리 커밋을 포함한다. 이렇게 이해하여야하나요?