30%
53,900원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
[h2 DB] test.mv.db 파일 생성 에러 해결법 공유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용][H2 데이터베이스 설정] 강의의 2분30초~3분00초 강사님 매뉴얼대로 따라하면h2 DB 기본 생성에 에러가 발생하여 고생했습니다..콘솔에서 /~test로 먼저 연결해도 test.mv.db가 만들어지지 않았습니다.버전이 2.1.xxx대로 가면서 콘솔에선 db 자동 생성이 안 되는 이슈이므로, 수동 생성을 진행해야 했습니다. 제가 2시간 걸려서 해결한 과정 정리해봤습니다.링크 올립니다.https://blog.naver.com/jtcjtc/223117129981
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
데이터 접근 기술 별 예외와 DB 종류별 에러코드 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래처럼 기술이 바뀔때마다 데이터 접근 계층에서 올라오는 예외가 다르다고 하셨고JDBC - SQLExceptionHibernate - HibernateExceptionJPA - PersistentException또 같은 에러여도 DB마다 에러코드가 다르다고 하셨는데그렇다면 Exception 종류는 DB접근 기술마다 다르고에러코드는 DB 종류마다 다른건가요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
클래스 @Transactional
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 클레스에 @Transactional를 넣을 수 있다고 하였는데 그럼 그 클래스 내부에 있는 모든 메서드에 @Transactional가 붙는건가요? 아니면 특정 몇몇 메서드에만 붙는건가요? 만약 특정 몇몇 메서드에 붙는다고 한다면 그 조건이 무엇인가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
accountTransferEX 에서 assertThatThrownBy 사용하는 이유
accountTransferEX 에서 assertThatThrownBy를 주석처리하고 @Test @DisplayName("이체중 예외 발생") void accountTransferEX() throws SQLException { Member memberA = new Member(MEMBER_A, 10000); Member memberEx = new Member(MEMBER_EX, 10000); memberRepository.save(memberA); memberRepository.save(memberEx); // assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) // .isInstanceOf(IllegalStateException.class); memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000); Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberEx.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberB.getMoney()).isEqualTo(10000); } }accountTransfer 에서 throw new IllegalStateException(e)를 주석처리했습니다.public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try{ con.setAutoCommit(false); bizLogic(con, fromId, toId, money); con.commit(); }catch (Exception e){ con.rollback(); //throw new IllegalStateException(e); } finally{ release(con); } }제가 생각했을 때는 어차피 예외가 터지면 롤백할거니까 예외(IllegalStateException)를 걍 먹고(?) 끝내버리면 된다고 생각하는데 assertThatThrownBy를 이용하는 이유는 예외가 발생할 수 있는 코드가 있다는 것을 인지하기 위해서인가요??답변 주시면 정말 감사하겠습니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
낙관적락 테스트 코드 작성시 질문입니다.
안녕하세요. 항상 강의 잘 듣고 있습니다.낙관적 락에 대해서 직접 테스트 코드를 통해 동작 방식을 살펴보고자 하는데 생각대로 동작하지 않아서 질문남깁니다. 우선 테스트 코드 시 스프링 IOC 컨테이너를 사용하기 위해 @SpringBootTest를 선언한 상황이고, 아래는 테스트 코드 내용입니다.스레드 1(트랜잭션1)에서 낙관적 락을 사용한 조회를 하도록 했고 커밋 되기 전, 스레드 2(르랜잭션2)에서 해당 데이터를 변경하도록 했습니다. 예상 대로라면 예외가 발생해야되는 데 정상 종료가 되어서 질문드립니다. ㅠㅠ로그를 찍어보았는데, 예상대로 각 스레드 별로 독립적인 트랜잭션이 실행되고, 낙관적 락을 통해 마지막에 version 확인 쿼리까지 발행하는데 왜 오류가 발생하지 않는지 궁금합니다. 잘못된 점이 있으면 알려주시면 감사하겠습니다!!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀 진행과정
@Test void dataSourceConnectionPool() throws SQLException, InterruptedException { //커넥션 풀림 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); dataSource.setPoolName("MyPool"); useDataSource(dataSource); Thread.sleep(1000); } private void useDataSource(DataSource dataSource) throws SQLException{ Connection con1 = dataSource.getConnection(); Connection con2 = dataSource.getConnection(); log.info("connection={}, class={}",con1,con1.getClass()); log.info("connection={}, class={}",con2,con2.getClass()); } } DriverManager.getConnection을 하면 라이브러리에서 해당 커넥션을 처리할 수 있는 DB 드라이버를 찾는 시간이 걸리고 또 커넥션을 반환하는 시간까지 걸렸습니다.애플리캐이션로직 => jdbc인터페이스 => DB드라이버 => 해당 DB 그러면 코드의 HikariCP 커넥션 풀에서 dataSource.getConnection()을 하면 커넥션 풀을 통해 이미 생성되어 있는 커넥션을 객체 참조로 쓰니까 커넥션풀에서 DB드라이버를 조회합니다.어플리케이션 로직 ⇒ 데이터소스 ⇒ 커넥션 풀 ⇒ JDBC 인터페이스 =>DB드라이버 => 해당 DB이런 식으로 진행되어서 커넥션 풀에서 커넥션(이미 DB와 연결된)을 조회,반환하는 시간이 걸린다고 이해했는데 맞게 이해했는 지 궁금합니다. 답변주시면 정말 감사하겠습니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
isEqualTo()질문
isEqualTo()가 대상의 내용자체를 비교한다라고 알고 있었는데 수업시간에 isEqualTo() 내부에 equals()를 포함한다고 배웠습니다.그럼 만약 Object.equals()라면 isEqualTo()가 객체의 주소를 비교하고 , String.equals()라면 isEqualTo()가 객체의 값을 비교하나요??
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
히카리 커넥션 풀 생성할 때 로그가 좌르르르 나오지 않습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]>> 환경스프링부트 3.1.0히카리: 5.0.1커넥션 풀 10개 지정하고 나서 테스트 코드 돌려볼 때, 영한님 화면에서는 Config 로그가 주르르 나오는데, 저는 나오질 않습니다. 혹시라도 application.properties에서 누락한 게 있는지 소스를 다운받아 보았지만 아니었습니다.application.properties에 로그 관련 넣을 수 있는 설정이 있길래 다음과 같은 값을 넣어봤지만 로그 내용이 달라지지 않습니다.logging.level.com.zaxxer.hikari=TRACElogging.level.com.zaxxer.hikari.HikariConfig=DEBUG로그는 하기 이미지처럼 나오는 게 전부입니다.예제도 똑같이 따라하고 있는데 버전이 달라지면서 달라진 기능상의 차이일까요.@Test void dataSourceConnectionPool() throws SQLException, InterruptedException { // 커넥션 풀링 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); // 10 is default dataSource.setPoolName("YourPool"); useDataSource(dataSource); Thread.sleep(1000); } private void useDataSource(DataSource dataSource) throws SQLException { Connection connection1 = dataSource.getConnection(); Connection connection2 = dataSource.getConnection(); log.info("connection={}, class={}", connection1, connection1.getClass()); log.info("connection={}, class={}", connection2, connection2.getClass()); } +추가DataSourceDriverManager를 사용할 때도 관련한 로그가 안 뜹니다..새로운 커넥션을 생성했다는 로그요..(Creating new jdbc DriverManager Connectino to)
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
equals()가 비교하는 것이 뭔가요??
Member의 @Data를 아래와 같이 바꿨습니다.//@Data @Getter @Setter @ToString public class Member { private String memberId; private int money; public Member() { } public Member(String memberId, int money) { this.memberId = memberId; this.money = money; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Member member = (Member) o; return money == member.money && Objects.equals(memberId, member.memberId); } @Override public int hashCode() { return Objects.hash(memberId, money); } }그리고 MemberRepositoryV0Test에서 equals()에서 일어나는 일을 생각해보았습니다.//findById Member findMember = repository.findById(member.getMemberId()); log.info("findMember.equals(member) = {}",findMember.equals(member)); 1. 첫번째 질문제가 생각했을 때는 Member의 hashCode()에서findMember와 memer가 (memberId, money)가 같으면 같은 hash값을 줍니다.그다음 equals()에서 hash값이 같으면 True를 반환하고 hash값이 없어도 (memberId, money)를 비교하여 같으면 True를 반환해줍니다.제가 정리한게 맞는 지 궁금합니다. 2. 두번째 질문Member에서 equals()를 오버라이딩 안하고 MemberRepositoryV0Test에서 equals를 하면findMember.equals(member) = false가 나오는 이유는 Object.equals()는 내부적으로 ==연산을 취하기 때문이다라고 생각했는 데 이게 맞을까요?? 3. 세번째 질문 저는 isEqualTo()가 대상의 내용자체를 비교한다라고 알고 있었는데 수업시간에 isEqualTo() 내부에 equals()를 포함한다고 배웠습니다.그럼 만약 Object.equals()라면 객체의 주소를 비교 하나요?? 답변주시면 정말 감사하겠습니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
datasource
datasource는 커넥션을 획득하는 방법을 추상화한 인터페이스라고 학습했습니다. 근데 이번 장에서 Datasource TransactionManager는 JDBC 트랜잭션 관리라고 하셨는데 datasource라는 것은 JDBC에 국한되는 것이 아니라 JPA, hibernate에서도 쓰일 수 있는 것 아닌가요? 전에는 DB마다 커넥션을 얻는 방법, sql전달 방법등이 달라서 이걸 편하게 해주기 위해 나온 것이 JDBC이고 DriverManager를 통해서 url,id,pw를 넘겨서 해당 dbDriver를 얻어서 커넥션을 얻었는데 이제는 DriverManager를 사용하지 않고 Datasource만을 사용해서 DB에 접근하는데 그렇다면 Datasource가 DriverManager가 하는 역할까지 수행하기때문에 가능한 것인가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의에서, con 객체가 언제 null이 될 수 있는지 문의드립니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용](질문 요약)질문을 요약하자면, dataSource.getConnection()이 언제 null값을 반환하는지 문의드립니다. (질문을 하게 된 배경)질문을 나름대로 해결하기 위해, 아래 사진에서(=강의 코드 캡쳐), 파란색 부분, 녹색 부분을 살펴보았습니다.여기서, 파란색 박스가 필요한 이유를 알아보고자 아래의 과정을 실험해보았습니다.=> con 객체에 강제로 null을 할당=> 녹색 박스를 거쳐서 파란색 박스로 도착하는 과정을 발견 이제, 맨 첫 번째 녹색박스에서, con객체에 언제 null이 할당되는지 파악해보려고 했는데요=> 그런데 dataSource.getConnection() 은 아래 2가지 경우만 있는 것으로 생각됩니다. (제가 실험했을 때는! 혹시 이 부분 틀렸으면 지적 부탁드립니다!!)연결 정보 등을 아예 잘못 입력하여, 연결이 안 되어서 예외를 발생Connection이 정상적으로 되어서, Connection 객체가 반환 null이 발생되는 경우는, con 객체에 강제로 null을 할당하는 것 말고는 딱히 떠오르지가 않아서..... "질문 요약" 과 같이 문의드립니다!
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션이 왜 10개가 만들어지는 것인가요?
영상에서 커넥션이 10개 만들어지는 것을 보여주셨는데 반복해서 코드를 실행하지 않았는데 왜 10개가 만들어지는 건가요?datasource.setMeximumPoolSize(10);은 커넥션에 풀의 최대 크기를 10개로 지정하는 것 아닌가요? 이 코드만으로 최대 크기도 지정하면서 커넥션 10개 생성까지 할 수 있는 건가요?실무에서도 보통 10개를 쓰신다고 말씀하셨는데 메이저 웹이나 어플일 경우 사용자 수가 기본 만 단위는 넘어갈텐데 10개로 다 커버가 가능한가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 반복 문제 해결 - JdbcTemplate에서 이거도 결국 AOP기술인가요?
마지막에 리포지토리까지 깔끔하게 만들었는데 이거도 서비스 로직에서 AOP사용하는 거처럼 같은 원리인거도 같은데 MemberServiceV4Test에서 @Test void AopCheck() { log.info("memberService clas={}", memberService.getClass()); log.info("memberRepository clas={}", memberRepository.getClass()); Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); }얘는 잘 작동하더라구요Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); 로요JdbcTemplate는 프록시객체 만들어서 넣어주는 방식이 아닌가여? 사실 앞으로 고급편까지 듣긴할건데 그때 나오겠죠?..
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
transactionManager.commit() 호출 시 커넥션 정리
transactionManager.commt() 또는 transactionManager.rollback()이 호출되면 트랜잭션 매니저가 자동으로 커넥션을 커넥션 풀에 반납해주는 것이 맞나요? 이때, con.setAutoCommit(true); 코드도 자동으로 실행되나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
HikariProxyConnection 에 wrapping되는 커넥션
커넥션 풀에서 커넥션을 조회할 때 HikariProxyConnection 객체로 커넥션을 wrapping해서 조회한다는 것은 알겠습니다.여기에서 wrapping되는 커넥션은 (H2 DB를 사용하는 경우) JdbcConnection 객체, (MySQL DB를 사용하는 경우) MySqlConnection 객체를 의미하는 것이 맞을까요?그니까 JDBC 드라이버가 DB와 커넥션을 맺은 후 반환하는 Connection 객체를 의미하는 것이 맞을까요?찾아보니 HikariProxyConnection이 Connection 인터페이스를 구현하고 있어 헷갈려서 질문드리게 되었습니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
CGLIB이 정상작동하지 않는 것 같습니다
MemberServiceV3_4Test의 AopCheck이 잘 실행이 되지 않습니다. Transactional 애노테이션이 잘 되지 않는 거 같아요. 같은 이유로 이체 중 오류 발생 시 테스트도 원하는 결과가 나오지 않네요.. 아래는 오류 내용입니다. > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :compileTestJava UP-TO-DATE > Task :processTestResources NO-SOURCE > Task :testClasses UP-TO-DATE > Task :test FAILED 03:18:12.756 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Neither @ContextConfiguration nor @ContextHierarchy found for test class [MemberServiceV3_4Test]: using SpringBootContextLoader 03:18:12.759 [Test worker] DEBUG org.springframework.test.context.support.AbstractContextLoader -- Could not detect default resource locations for test class [hello.jdbc.service.MemberServiceV3_4Test]: no resource found for suffixes {-context.xml, Context.groovy}. 03:18:12.780 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Using ContextCustomizers for test class [MemberServiceV3_4Test]: [DisableObservabilityContextCustomizer, PropertyMappingContextCustomizer, Customizer, ExcludeFilterContextCustomizer, DuplicateJsonObjectContextCustomizer, MockitoContextCustomizer, TestRestTemplateContextCustomizer] 03:18:12.833 [Test worker] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider -- Identified candidate component class: file [C:\Users\TheperZ\Desktop\Spring\Spring DB\jdbc\build\classes\java\main\hello\jdbc\JdbcApplication.class] 03:18:12.834 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration hello.jdbc.JdbcApplication for test class hello.jdbc.service.MemberServiceV3_4Test 03:18:12.902 [Test worker] DEBUG org.springframework.test.context.util.TestContextSpringFactoriesUtils -- Skipping candidate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] due to a missing dependency. Specify custom TestExecutionListener classes or make the default TestExecutionListener classes and their required dependencies available. Offending class: [jakarta/servlet/ServletContext] 03:18:12.910 [Test worker] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Using TestExecutionListeners for test class [MemberServiceV3_4Test]: [DirtiesContextBeforeModesTestExecutionListener, ApplicationEventsTestExecutionListener, MockitoTestExecutionListener, DependencyInjectionTestExecutionListener, DirtiesContextTestExecutionListener, TransactionalTestExecutionListener, SqlScriptsTestExecutionListener, EventPublishingTestExecutionListener, RestDocsTestExecutionListener, MockRestServiceServerResetTestExecutionListener, MockMvcPrintOnlyOnFailureTestExecutionListener, WebDriverTestExecutionListener, MockWebServiceServerTestExecutionListener, ResetMocksTestExecutionListener] 03:18:12.911 [Test worker] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener -- Before test class: class [MemberServiceV3_4Test], class annotated with @DirtiesContext [false] with mode [null] 03:18:12.919 [Test worker] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener -- Performing dependency injection for test class hello.jdbc.service.MemberServiceV3_4Test . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.6) 2023-05-05T03:18:13.104+09:00 INFO 4320 --- [ Test worker] h.jdbc.service.MemberServiceV3_4Test : Starting MemberServiceV3_4Test using Java 17 with PID 4320 (started by TheperZ in C:\Users\TheperZ\Desktop\Spring\Spring DB\jdbc) 2023-05-05T03:18:13.105+09:00 INFO 4320 --- [ Test worker] h.jdbc.service.MemberServiceV3_4Test : No active profile set, falling back to 1 default profile: "default" 2023-05-05T03:18:13.569+09:00 INFO 4320 --- [ Test worker] h.jdbc.service.MemberServiceV3_4Test : Started MemberServiceV3_4Test in 0.626 seconds (process running for 1.404) 2023-05-05T03:18:13.856+09:00 INFO 4320 --- [ Test worker] h.jdbc.service.MemberServiceV3_4Test : memberService class=class hello.jdbc.service.MemberServiceV3_3$$SpringCGLIB$$0 2023-05-05T03:18:13.858+09:00 INFO 4320 --- [ Test worker] h.jdbc.service.MemberServiceV3_4Test : memberRepository class=class hello.jdbc.repository.MemberRepositoryV3 2023-05-05T03:18:13.898+09:00 INFO 4320 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2023-05-05T03:18:13.950+09:00 INFO 4320 --- [ Test worker] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:tcp://localhost/~/test user=SA 2023-05-05T03:18:13.952+09:00 INFO 4320 --- [ Test worker] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2023-05-05T03:18:13.953+09:00 INFO 4320 --- [ Test worker] h.jdbc.repository.MemberRepositoryV3 : get connection=HikariProxyConnection@424743902 wrapping conn0: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class com.zaxxer.hikari.pool.HikariProxyConnection 2023-05-05T03:18:13.957+09:00 INFO 4320 --- [ Test worker] hello.jdbc.connection.DBConnectionUtil : getConnection=conn1: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class org.h2.jdbc.JdbcConnection 2023-05-05T03:18:13.963+09:00 INFO 4320 --- [ Test worker] h.jdbc.repository.MemberRepositoryV3 : get connection=HikariProxyConnection@1728266914 wrapping conn2: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class com.zaxxer.hikari.pool.HikariProxyConnection 2023-05-05T03:18:13.964+09:00 INFO 4320 --- [ Test worker] hello.jdbc.connection.DBConnectionUtil : getConnection=conn3: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class org.h2.jdbc.JdbcConnection 2023-05-05T03:18:13.984+09:00 INFO 4320 --- [ Test worker] h.jdbc.repository.MemberRepositoryV3 : get connection=HikariProxyConnection@2000856156 wrapping conn4: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class com.zaxxer.hikari.pool.HikariProxyConnection 2023-05-05T03:18:13.985+09:00 INFO 4320 --- [ Test worker] hello.jdbc.connection.DBConnectionUtil : getConnection=conn5: url=jdbc:h2:tcp://localhost/~/test user=SA, class=class org.h2.jdbc.JdbcConnection Expecting value to be true but was false org.opentest4j.AssertionFailedError: Expecting value to be true but was false at java.base@17/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base@17/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base@17/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base@17/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at app//hello.jdbc.service.MemberServiceV3_4Test.AopCheck(MemberServiceV3_4Test.java:75) at java.base@17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17/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/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/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 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 org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base@17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17/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) MemberServiceV3_4Test > AopCheck() FAILED org.opentest4j.AssertionFailedError at MemberServiceV3_4Test.java:75 2023-05-05T03:18:14.004+09:00 INFO 4320 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-05-05T03:18:14.015+09:00 INFO 4320 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 1 test completed, 1 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/TheperZ/Desktop/Spring/Spring%20DB/jdbc/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 2s 4 actionable tasks: 1 executed, 3 up-to-date
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 관련 질문 드립니다
커넥션 풀을 이용하여 커넥션을 사용해서 반납하고 다음 커넥션을 가져올 때 conn0이라고 같은 커넥션만 가져오는 것을 볼 수 있는데 커넥션풀이 어떤 커넥션을 주는지 알고리즘이 따로 있는 걸까요? 어떤 기준으로 커넥션을 주는지 궁금합니다
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
체크예외와 런타임예외의 차이점
수업과 직접적으로 관련있다고 보긴 어려운 질문이지만, 체크예외와 런타임예외에 대해서 궁금증이 생겨서 질문 남깁니다!아래 코드는 잘 실행됩니다. 그리고 IllegalStateException 오류가 잡히고 로그가 남습니다. @Test void b(){ try { ex2(); }catch (IllegalStateException e) { log.error("message",e); } } private void ex2() throws RuntimeException{ RuntimeException ex = new IllegalStateException(); throw ex; } 그러나 아래 코드는 오류를 제공합니다.@Test void a(){ try { ex1(); }catch (SQLNonTransientException e) { log.error("message",e); } } private void ex1() throws SQLException{ SQLException ex = new SQLNonTransientException(); throw ex; } ex1()에서 java.sql.SQLException 오류가 발생합니다.첫 번째 코드가 성공하고 IllegalStateException 오류가 잡히고 로그가 남으므로 두 번째 코드도 성공해야 한다고 생각합니다.SQLNonTransientException은 SQLException의 하위 예외이므로 IllegalStateException은 RuntimeException의 하위 클래스이기 때문입니다.런타임 에러일 때 에러가 발생하면 지정된 하위 에러로 잡을 수 있는데 Check예외인 SQLException의 경우에는 적용되지 않는 이유를 알고 싶습니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2 동작방식을 제가 이해하고있는지 확인해주세요
h2 애플리케이션은 jdbc:h2:tcp://localhost/~/test 즉, tcp통신을 통해 test.mv.db 파일에 데이터를 저장한다. h2.sh 애플리케이션을 실행하면 os에 org.h2.driver가 등록된다. jdbc가 제공하는 DriverManager는 os에 등록된 org.h2.driver를 관리하는 객체이다. 제가 이해한 내용이 맞을까요? 확인해주시면 감사합니다!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
jpa와 jdbc를 같은 트랙젝션 안에서 처리하는 방법문의
public class JpaServicde { ........... @Transactional public void jpaMethod() { ExEntity exEntity = jpaRepository.save(); if (exEntity .getNo() == 1) { jdbcService.jdbcMethod(); } ................ }}public class JdbcServicde { ........... public void jdbcMethod() { ExEntity2 exEntity2 = jdbcRepository.save(); }}위와같이 JPATransaction 안에서 JDBC서비스의 메소드를 호출했는데, jdbcMethod에서 트랜젝션이 적용되지 않습니다.무엇이 잘못된 건가요?* 최대한 이해하기 쉽게 예제를 짜려고 필요한 부분만 코딩했습니다.