30%
53,900원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
.getClass() -> 프록시 객체
16:06 질문입니다.void AopCheck() { log.info("memberService class={}", memberService.getClass());이 부분은 프록시가 나오는걸 이해했는데 빈으로등록한 이부분@Bean MemberServiceV3_3 memberServiceV3_3(){ return new MemberServiceV3_3(memberRepositoryV3()); }이것은 왜 프록시가 아닌 본 객체가 출력되나요 ?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV3_3Test 코드중 질문
MemberServiceV3_3Test 테스트중@Transactional 어노테이션을 쓰기위해@SpringBootTest 어노테이션을 추가 시키는것 까지 이해는 했는데(06:30 참고)그 이후 이전 코드의 @BeforeEach 코드를 지우셨습니다.(직접 주입)그이후에 @TestConfiguration 을 추가해주셨는데 왜 꼭이렇게 빈을 주입해야 하나요 ?( [MemberRepositoryV3, MemberServiceV3_3] << 이 두 객체를 @Autowired하지않고 이전 @BeforeEach로 사용했지만 안됌) - DataSource, PlatformTransactionManager 두 객체는 @Bean 설정 그 이후 테스트 실패. 결론적으로 MemberRepositoryV3,MemberServiceV3_3 이 둘 클래스도 왜 @TestConfiguration로 빈으로 주입해야 정상작동 하나요 ?? 실패한 코드===================================@BeforeEach void before(){ memberRepository = new MemberRepositoryV3(TestConfig.dataSource()); memberService = new MemberServiceV3_3(memberRepository); } @TestConfiguration static class TestConfig{ @Bean static DataSource dataSource(){ return new DriverManagerDataSource(URL, USERNAME, PASSWORD); } @Bean PlatformTransactionManager transactionManager(){ return new DataSourceTransactionManager(dataSource()); } }
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 템플릿 사용 로직
txTemplate.executeWithoutResult((status) -> {try {//비즈니스 로직bizLogic(fromId, toId, money);} catch (SQLException e) {throw new IllegalStateException(e);} });위의 로직에서 파라미터로 status를 받는데이 status는 어디에서 받아오는건가요?이전 MemberServiceV3_1 에서는//트랜잭션 시작TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());이렇게 status를 받아와서 커밋과 롤백에 status를 사용했는데MemberServiceV3_2 에서는여러번 반복해 돌려보아도 저 status 에 대한 설명이 없어서답변 부탁드립니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC와 Connection 인터페이스 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 모두 다르기 때문에 JDBC 인터페이스가 등장하였다고 하셨습니다.Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 이 부분을 통해서는 라이브러리에 등록된 DB 드라이버 목록에서 커넥션을 지원하는 드라이버에서 커넥션을 얻을 수 있다고 하셨습니다. 커넥션 또한 인터페이스이기에, 지원하는 드라이버로부터 실제 구현된 커넥션을 얻을 수 있는 것으로 이해했습니다.Connection, Statement, ResultSet 모두 속성을 확인해보니, 모두 다 인터페이스였습니다.그렇다면 JDBC는 Connection 인터페이스, Statement 인터페이스, ResultSet 인터페이스가 있는 인터페이스의 모음이라고 생각하면 될까요?DriverManager.getConnection(URL, USERNAME, PASSWORD); 로부터 데이터베이스 드라이버를 받는데, 그렇다면 이 코드를 통해서 JDBC 드라이버를 받는 것이라고도 할 수 있나요? (JDBC의 구현 드라이버를 받는 과정도 이 과정에서 이뤄지는지 궁금합니다.)
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션질문
맨 처음 "최초" 커넥션을 연결할때디폴트 10개의 커넥션 풀을 생성한다고 생각하면 되나요 ?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 예외 및 translate() 질문
translate() 메서드의 첫번째 파라미터는 읽을 수 있는 설명이고, 두번째는 실행한 sql, 마지막은 발생된 SQLException 을 전달하면 된다. 이 부분에서 어떤 파라미터가 DB의 Error Code를 전달받게되나요?그리고 스프링이 자체제공하는 추상화된 예외는 DB접근 예외 말고 다른 종류의 예외들은 없나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DataSourceUtils.releaseConnection 질문
DataSourceUtils.releaseConnection() 을 사용하면 커넥션을 바로 닫는 것이 아니다.트랜잭션을 사용하기 위해 동기화된 커넥션은 커넥션을 닫지 않고 그대로 유지해준다.트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 해당 커넥션을 닫는다. 라고 이전 강의에서 말씀 하셨는데 그러면 releaseConnection는 트랜잭션만 종료시키고 커넥션은 살리는것을 뜻하나요? 만약 맞다면 트랜잭션의 종료는 커밋이나 롤백을 통해 이루어지는데 releaseConnection를 사용하여 트랜잭션만 종료시키면 커밋이나 롤백을 사용할수 없지않나요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
MemberRepositoryV1
MemberRepositoryV1에서 DataSource를 주입 받았는데 이는 어디서 빈으로 등록 된 건가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
findById에서 select 할때 for update해야 하는건 아닌지 궁금합니다
안녕하세요 ! 너무나 바쁘신줄 알지만 제가 틀리게 이해하고 있는지도 모르겠는데 너무 궁금해서 질문남깁니다.MemberServiceV2의 bizLogic에서 findById를 호출할때 그냥 select하게 되어있는거 같은데 이렇게 되면 락을 획득하는게 아니라서 update를 호출 하기 전에 다른 커넥션? 에서 수정을 위해 select 또는 그사이에 update를 해버리면 현재의 커넥션?(쓰레드?)엉뚱한 값을 update 하게 될 수 있지 않을까요 ? 예를 들어 두개의 커넥션에서 동시에 findById를 호출하고 bizLogic을 수행한다면 하나의 row 에 대해 한쪽에서는 더하기를 다른쪽에서는빼기를 실행해도 최초의 값에서 더하기 혹은 빼기 둘중 하나만을 실행한 결과가 update되지 않을까 하는 생각입니다.제가 글로 설명을 잘 못하겠는데... 멀티쓰레드에서 동기화 문제와 비슷한 문제가 발생하는건 아닐지 생각이 듭니다.혹시 제가 제대로 이해못하고 멍청한 질문을 하는거라면 정말 죄송합니다 ㅠㅠ 바쁘신 와중에 긴글 읽어주셔서 감사합니다그리고 강의 정말 잘보고있습니다 !!!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
클라이언트에대한 질문
일반적으로 클라이언트는 각 브라우저를 이용하는 컴퓨터라고 알고있는데 1분50초 정도에서 DB드라이버 입장에서 애플리케이션 로직이 클라이언트다 라는말이 잘 이해가 가지않습니다 정확한 클라이언트 정의 기준이 있을까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Connection Pool 질문
좋은 강의 잘 들었습니다!혹시 maxConnectionPoolSize 는 왠마하면 10으로 설정하라고 말씀하셨는데 multi dataSource환경에서10개가 넘은 dataSource 각각을 10으로 설정해도 괜찮을 까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
객체 생성을 막아야하는 이유
https://www.inflearn.com/questions/643569 안녕하세요 ConnectionConst abstract Class 관련해서 위의 질문글에 추가적인 질문인데 왜 외부로부터 객체생성을 막고자 하는 것일까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Primary Key를 member_id가 아닌 auto_incremental인 bigint id로할때 repository 추상화를 어떻게 할지?
저희 강의에서 사용하는 H2 sql schema를 그대로 복붙해왔습니다. 다음과 같습니다.drop table member if exists cascade;create table member (member_id varchar(10),money integer not null default 0,primary key (member_id));저희 강의에서는 member_id varchar(10).즉, String 타입의 ID를 PK로 사용하고 있습니다.하지만 다음 링크를 보시면 실무에서는 String 타입의 ID를 PK로 사용하지 않는다고 답변해주셨습니다.https://onduway.tistory.com/80 그래서, String member_id가 아닌 auto_incremental인 Long id를 pk로 쓰면. 다음과 같을것 같습니다.create table member (id bigint auto_incremental,member_id varchar(10),money integer not null default 0,primary key (id)); 그렇다면 member_id를 pk로 쓸때 사용하던 메소드인public Member findById(String memberId);는 변화 없이 그대로 사용해야 할까요?예를들어 member_address 테이블을 상상해보겠습니다.member테이블의 Long Id(pk)를 외래키로 member의 주소를 갖는 테이블입니다.create table member_address (id bigint auto_incremental,member_id bigint(10),money integer not null default 0,primary key (id));member_address를 탐색할때는 String meber_id가 아닌 Long member_id(member의 pk)가 필요합니다. 그렇다면 repository의 메소드가 추가되어야하지 않을까요? 다음과 같이말이죠public Member findByMemberId(String memberId);public Member findById(Long Id);그러니 맨 처음 최초 로그인할때만 findByMemberId 메소드를 사용해서 PK를 받아오고. 그 이후의 모든 작업은 PK를 사용하는 findById 메소드를 사용해야 합당한 db설계일것같습니다. 질문을 요약하면 다음과 같습니다."String 타입의 ID를 PK로 사용하지 않고.auto_incremental인 Long Id를 PK로 사용할때.Repository의 탐색메소드 설계를 어떻게 해야 좋을까?" 최대한 스스로 정리해서 질문하려고 노력해보았습니다. 두서없는 질문글 읽어주셔서 감사합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 실행 시 문제
테스트 실행 시 아래와 같은 오류가 나는데 어떻게 해결할 수 있을까요..? java.lang.IllegalStateException: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다: localhost" [90067-214] at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:21) at hello.jdbc.connection.DBConnectionUtilTest.connection(DBConnectionUtilTest.java:14) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다: localhost" [90067-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:212) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:437) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:325) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.Driver.connect(Driver.java:59) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229) at hello.jdbc.connection.DBConnectionUtil.getConnection(DBConnectionUtil.java:17) ... 70 moreCaused by: java.net.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다 at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:244) at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:263) at java.base/java.io.DataInputStream.readInt(DataInputStream.java:393) at org.h2.value.Transfer.readInt(Transfer.java:270) at org.h2.engine.SessionRemote.done(SessionRemote.java:603) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:163) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) ... 76 moreProcess finished with exit code -1
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
객체 생성을 막기위한 abstract 클래스 선언
안녕하세요 영한님! JDBC 이해 강의를 듣던 중 사소한 거지만 궁금한 점이 생겨서 질문드리게 되었습니다.ConnectionConst 객체의 경우, static 멤버만을 저장하는 객체이기 때문에 의도치 않은 외부로 부터의 객체 생성을 막고자 abstract 추상 객체로 선언해 주셨다고 이해하였는데요.public abstract class ConnectionConst { public static final String URL = ... .... }단순히 객체 생성만을 막고자 한다면 abstract이 아닌 private 생성자를 선언해주는 방법도 있을것 같습니다.혹시 두 방식의 장단점이나 차이점이 있을까 해서 질문 드려봅니다!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
런타임 에러는 내부적으로 어떻게 동작하나요?
런타임 오류도 체크 오류처럼 호출한 클래스로 계속해서 던져지는 것 같은데, 그럼 런타임 에러는 내부적으로 throw를 사용한다고 생각해도 괜찮을까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
프록시는 어떻게 서비스 계층을 호출하나요?
트랜잭션이 필요한 부분에 @Transaction 애너테이션만 붙여놓으면 알아서 프록시가 생성되고, 서비스 계층 대신 프록시를 호출하는 방식으로 작동하는데..내부적으로 어떻게 동작하는지 모르겠습니다.프록시가 어떻게 구성돼있길래 트랜잭션을 시작할 수 있고, 실제 서비스 계층을 호출할 수 있는지..일단은 AOP가 다 해주는구나~ 하고 넘어가는게 좋을까요?추후 이 부분을 다루는 강의가 있을까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀에 대해 질문드립니다.
커넥션 풀에 커넥션을 반환할 때 커넥션이 살아 있는 상태로 반환하면, 일정 시간 이후 커넥션이 끊기게 될 때 내부적으로 커넥션을 다시 받아오나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀에 있는 커넥션이 데이터를 얻는 과정에 대한 질문입니다.
커넥션 풀에 있는 커넥션들은 서버가 올라갈 때 데이터베이스와 연결되는 것 같은데..각각의 커넥션들이 연결을 얻을 때는 데이터베이스 드라이버를 통해 획득 가능한 커넥션을 조회하고, 드라이버에서 TCP/IP 커넥션을 연결하고, 데이터베이스에서는 내부 인증을 하고... 이런 과정을 거쳐야 하나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
유효하지 않는 값 2만 나와서 이해가 안됩니다
h2에 값은 들어오는데 2만원으로 수정이 안된상태로 들어와update()에서 어디가 잘못 됐는지 모르겠습니다.