묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 v3_4와 v4 모두 오류가 발생합니다.
https://drive.google.com/file/d/1n_YIwUiIsidlVs38Oq6rPsBjoO8HgW1T/view?usp=drive_link 강의자료 코드도 복붙해보고 소스파일 올려주신거도 열어봤는데 오류가 발생합니다. h2데이타베이스 내렸다 다시 켜봐도 안됩니다 ㅠ 로그를 보니까 OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended오류가 뜨고 멤버 테이블도 존재하지 않는다고 합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
예외를 전환할떄 기존 예외 포함이 무슨 말인가요?
체크예외에서 런타임 예외로 변경할 때 cause 생성자를 포함 해야한다는 의미인건가요? 그리고 기존 예외가 포함된다는게 어떤 말인지 잘 모르겠습니다. 어떻게 기존 예외가 포함이 되는건가요? 또 예외출력 로그를 보고 어디가 문제인지 어떻게 판단하고 수정을 하는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
중요한 런타임 예외를 안잡아주면 시스템은 어떻게 되나요?
예시로 설명해주신 NetworlClient클래스의RuntimeConnectionEx 예외를 실제 시스템에서 잡지 않고 무시하면 서비스를 이용하는 고객들에게 어떤 문제가 발생하였는지 인지 시켜줄 수 없게되고 고객들은 연결이 안되는 서비스를 무한 로딩한 상태로 대기 하게 되는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
RDBMS 락과 비스니스 로직 전체에 대한 락 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 영한님.항상 좋은 수업 감사합니다. 이번 수업을 통해 MySQL 또는 Postgresql와 같은 대중적인 RDBMS의 경우,서로 다른 세션에서 시작된 서로 다른 트랜잭션에서 동시에 동일 테이블의 동일 row에 대해 write operation을 수행할 때에는,별도의 Pessimistic Lock등을 사용하지 않더라도,RDBMS에서 제공해주는 기본 락이 걸리는 것으로 이해했습니다.그럼에도 불구하고 상품 주문시 상품의 재고를 감소시키는 등의,비즈니스 로직 단위의 레이스 컨디션 문제의 경우,select 후 udpate를 하게 되는데그 select에서 update되기 전 값을 읽어온다면,(read operation에 대해서는 rdbms 기본 lock이 안걸리니깐)여기서 레이스 커디션 문제가 발생하므로,비즈니스 로직 단위의 레이스 컨디션 문제를 막고자 한다면DB 락 or 레디스 등 별도의 솔루션을 적용해야 하는 것으로 이해했는데요,제가 이해한 내용이 맞을지 질문 드립니다. 감사합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외를 처리하는 부분에있어서 질문있습니다!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예외를 던지거나 잡아서 처리한다는 내용에 대해 질문이 있는데요.. 어떻게 예외를 처리해야하는지 그 부분이 현재까지 본 강의로는 조금 추상적이라 이해가 부족한데 혹시 조금더 설명 해주실수 있으실까요? try catch 를 이용해서 예외 발생시 롤백을 하고 어떤 응답값을 리턴한다 같은 처리를 이야기 하는걸까요?만약 그렇다면 @Transactional을 하는 경우는 롤백은 되지만 응답에 대한 처리는 어떻게 할 수 있을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MyBatis나 Jpa를 사용했을 때, 커넥션이 커넥션 풀로 반환되는 시점 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 영한님.이번 강의를 들으면서 실제 MyBatis나 JPA를 사용했을 때커넥션이 커넥션 풀로반환되는 시점이 궁금했습니다.GPT에게 물어본 결과로는,트랜잭션 단위로 커넥션을 커넥션 풀로 반환한다는 답변을 받았습니다.예를들어 트랜잭션 1에서 findById(), findByUsername()을 호출한다면 트랜잭션 1에서 획득한 커넥션 1을 가지고findById()에 의한 select 쿼리를 호출 후커넥션1을 반환하지 않고그대로 유지하다가 findByUsername()으로 두 번째 select 쿼리를 호출한다는 답변을 받았습니다.이부분이 맞는지 질문 드리고 싶습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
람다식이 이해가 안됩니다.
멤버서비스 테스트에서 예외가 발생했을때 사용한 람다식이 해석이 안됩니다. 무슨 의미 인가요?assertThatThrownBy(()-> member service.accountTransfer(members.getMemberId(), memberEx.getMemberId(), 2000) .isInstanceOf(IllegalStatementException.class);위 람다식은 어떻게 해석해야 하나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
데이터베이스 커넥션 및 세션 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님.먼저 항상 좋은강의 잘 듣고 있습니다.최근에 이직을 하게 되면서 여유가 생겨영한님 강의로 다시 학습을 시작하고 있는데요,결론적으로 먼저 데이터베이스에 관한 지식(커넥션 , 세션 뿐만 아니라 성능 튜닝 및 설계) 을 위해 추천해주실만한 책이 있을까요?당연히 영한님 관계형 데이터베이스 강의가 나온다면 너무 좋겠지만,직금은 자바 강의만으로 바쁘신거 같아서요!왜냐하면 저는 springboot 시작 시점에 db connection pool을 채울 때,하나의 db session만을 가지고 여러 db connection을 만들어 connection pool을 채울것이라고 생각했습니다.(db session도 web session처럼 인증을 유지하는 논리적인 연결 개념이라고 이해했고, 어차피 동일한 username password를 사용하니깐요) 그렇지만 검색 후 진짜 영한님 설명처럼각각의 connection은 별도의 db session으로 맺어지는것으로 나와있었습니다.그래서 제가 아직 관계형 데이터베이스 관련 지식이 많이 부족하다는 생각이드는데요,혹시 추천해주실만한 학습 방법(책을 포함한) 이 있으실지 궁금합니다!(혹은 1월 meet up에서 말씀해주신 것 처럼 올해 까진 관계형 데이터베이스 강의가 나올지도 궁금합니다!)감사합니다.!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
풀 방식에 질문이 있습니다.
실제 서비스에서 수백 수천의 사용자가 접속을 하였는데 풀에 등록된 커넥션이 100개밖에 없으면 선착순 100명에 들지 못한 나머지 사람들은 계속 대기 하고 반환된 풀을 가져다 사용하는거로 이해했습니다.관리자 입장에서 사용자 대기를 줄이기 위해 풀의 최대 갯수를 최대로 많이 하면 사용자의 대기 없이 즉각적으로 접근이 가능해서 더 좋은 서비스를 제공이 가능한것 같은데 굳이 기본 풀 갯수를 10개로 설정한 이유가 있나요? 그리고 풀의 최대갯수는 몇까지 가능한가요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
H2데이타 베이스 말고 다른거 사용해도 동일 한가요
MySQL 워크벤치 또는 sqlyog 커뮤니티 버전을 사용해도 수업에 지장이 없는것 인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Spring.io에서 spring web은 다운 받ㅇ르 필요 없나요?
이전 강의에서는 springWeb도 같이 추가해서 다운 받았던거 같은데 이번 강의에서는 없어도 되는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
h2.bat 실행 오류
윈도우용을 설치하고 bin의 h2.bat 을 돌리면 cmd 창에 아래와 같이 뜹니다. 버전은 2.2.224 로 라이브러리에 맞춰서 깔았습니다. 회사 pc에서는 문제가 없었는데, 집 노트북에서 문제가 생기네요.원인과 해결책을 아시면 좀 알려주세요'java'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다.계속하려면 아무 키나 누르십시오 . . .
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 데이터베이스 설정 관련 질물
h2.bat을 실행하면 cmd 창이 계속 떠 있습니다. (cmd 창을 죽이면 콘솔 접속이 안되네요)정상인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
hikari 커넥션 풀 초기화 정보 출력
이런거 저는 안 뜨는데 뭘 어떻게 해야 하나요 [MyPool connection adder] MyPool - Added connection conn0: url=jdbc:h2:.. user=SA[MyPool connection adder] MyPool - Added connection conn1: url=jdbc:h2:.. user=SA[MyPool connection adder] MyPool - Added connection conn2: url=jdbc:h2:.. user=SA[MyPool connection adder] MyPool - Added connection conn3: url=jdbc:h2:.. user=SA[MyPool connection adder] MyPool - Added connection conn4: url=jdbc:h2:.. user=SA...[MyPool connection adder] MyPool - Added connection conn9: url=jdbc:h2:.. user=SA
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DB insert 안됨
window command에서 h2.bat하고 db띄운 후그냥 창x눌러서 껐는데요 그다음 다시 커맨드 열어서 h2.bat하고 insert 쿼리 날렸는데insert가 반영이 안돼요jsessionid 처음 나왔던걸로 해도 안되고새로 나오는 것으로 해도 안되는데창을 새로 띄워도 원래 jsessionid로 해야 하는건가요? test.mv.db 파일도 새로 생성해야 하나요? 파일을 올리고 싶은데 첨부파일 넣는 곳이 없네요 어떻게 해야 하나요?
-
미해결토비의 스프링 부트 - 이해와 원리
섹션6. 자동 구성 정보 파일 분리 강의에서 질문 있습니다
MyAutoConfigImportSelector를 ImportSelector 인터페이스를 구현하시는 강의를 보았습니다. 한가지 궁금한게 직접 스프링 부트 실행시 MyAutoConfigImportSelector가 생성되는 것을 디버깅을 통해 확인을 해보았는데, ConfigurationClassParser 클래스의 processImports 메서드라는 곳에서 일시적으로 ImportSelect 구현 클래스(MyAutoConfigImportSelector)를 인스턴스화 하는 코드를 확인하였고,그 이후, ImportSelect 구현 클래스인 MyAutoConfigImportSelector의 selectImports 메서드를 호출하는 것을 확인하였습니다. (ConfigurationClassParser 566 ~ 582 라인) 그렇다면, MyAutoConfigImportSelector의 생성자에서 classLoader를 의존성 주입 받는 것이 아니라 일시적으로 MyAutoConfigImportSelector를 인스턴스화하여 classLoader를 생성자에서 초기화하고, 그 이후에 selectImports를 호출하는걸로 봐도 될까요?라이브러리 코드를 좀더 깊게 살펴보니, 생성자에서 Environment, ResourceLoader, BeanFactory, ClassLoader 총 4가지 클래스에 대해서만 객체를 설정해주는 것을 확인할 수 있었습니다. 처음엔 classLoader를 스프링 빈 컨테이너가 알아서 의존성 주입으로 classLoader를 주입하는줄 알았는데, 생각을 해보니 의존성 주입은 스프링 빈 컨테이너가 스캔 대상인 빈들 내부에서만 의존성 주입을 하는 것으로 알고 있는데, MyAutoConfigImportSelector 같은 경우는 ApplicationContext 클래스에서 확인해보아도 빈으로 생성되지 않고 있습니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
throws SQLException 관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용]안녕하세요! 강의 8분대에 등장하는public void accountTransfer(String fromId, String toId, int money) throws SQLExcetpion 함수에서 SQLException을 던진다고 나와있는데코드 내부에 try - catch 구문을 보면SQLException을 잡아서 IllegalStateException을 throw 해주고 있습니다. 체크 예외인 SQLException이 발생 시 잡아서 언체크 예외인 IllegalStateException을 던져주는데 메서드에는 왜 throws SQLException으로 작성되어 있는지 모르겠습니다. 설명해주시면 감사드리겠습니다!!
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
check에 controller의 의미?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Test void checked() { Controller controller = new Controller(); assertThatThrownBy(() -> controller.request()) .isInstanceOf(Exception.class); } @Test void checked2() { Service service = new Service(); assertThatThrownBy(() -> service.logic()) .isInstanceOf(Exception.class); }컨트롤러를 만들어서 하지 않고 그냥 서비스에서 테스트해도 되는데, 컨트롤러를 만들어서 하는 이유는 뭔지 궁금합니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
영한님 TransactionTemplate 설명 관련 질문이 있습니다!
안녕하세요! 강의 잘 보고 있는 학생입니다. '트랜잭션 문제 해결 - 트랜잭션 템플릿' 강의 10분 30초를 보면영한님께서 트랜잭션 템플릿의 기본 동작이 "체크 예외가 발생하면 트랜잭션을 롤백하지 않고 커밋한다"라고 말씀하셔서package org.springframework.transaction.support;위 패키지에 있는 TransactionTemplate의 execute코드를 확인하게 되었는데요 예외의 최상위 계층인 Throwable이 catch되면 rollback되는 구조인데, 이렇게 되면 체크 예외여도 롤백이 되는 것 아닌가요??확인한 버전은 SpringBoot 3.x 버전입니다. 현재는 바뀐것인지 아니면, 제가 잘못된 부분을 찾고 있는 것인지 답변 부탁드립니다 감사합니다!
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV4Test.java 테스트 실행하는데 오류가 발생합니다.
package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepository; import hello.jdbc.repository.MemberRepositoryV4_1; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.aop.support.AopUtils; 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 javax.sql.DataSource; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * 예외 누수 문제 해결 * SQLException 제거 * * MemberRepository 인터페이스 의존 */ @Slf4j @SpringBootTest class MemberServiceV4Test { public static final String MEMBER_A = "memberA"; public static final String MEMBER_B = "memberB"; public static final String MEMBER_EX = "ex"; @Autowired private MemberRepository memberRepository; @Autowired private MemberServiceV4 memberService; @TestConfiguration static class TestConfig { private final DataSource dataSource; public TestConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean MemberRepository memberRepository() { return new MemberRepositoryV4_1(dataSource); } @Bean MemberServiceV4 memberServiceV4() { return new MemberServiceV4(memberRepository()); } } @AfterEach void after() { memberRepository.delete(MEMBER_A); memberRepository.delete(MEMBER_B); memberRepository.delete(MEMBER_EX); } @Test void AopCheck() { log.info("memberService class={}", memberService.getClass()); log.info("memberRepository class={}", memberRepository.getClass()); Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); } @Test @DisplayName("정상 이체") void accountTransfer() { //given` Member memberA = new Member(MEMBER_A, 10000); Member memberB = new Member(MEMBER_B, 10000); memberRepository.save(memberA); memberRepository.save(memberB); //when memberService.accountTransfer(memberA.getMemberId(), memberB.getMemberId(), 2000); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberB.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(8000); assertThat(findMemberB.getMoney()).isEqualTo(12000); } @Test @DisplayName("이체중 예외 발생") void accountTransferEx() { //given Member memberA = new Member(MEMBER_A, 10000); Member memberEx = new Member(MEMBER_EX, 10000); memberRepository.save(memberA); memberRepository.save(memberEx); //when assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) .isInstanceOf(IllegalStateException.class); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberEx.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberB.getMoney()).isEqualTo(10000); } }Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended> Task :testMemberServiceV4Test > AopCheck() FAILED org.springframework.jdbc.CannotGetJdbcConnectionException at MemberServiceV4Test.java:64 Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException at MemberServiceV4Test.java:64MemberServiceV4Test > 이체중 예외 발생 FAILED org.springframework.jdbc.CannotGetJdbcConnectionException at MemberServiceV4Test.java:102 Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException at MemberServiceV4Test.java:102MemberServiceV4Test > 정상 이체 FAILED org.springframework.jdbc.CannotGetJdbcConnectionException at MemberServiceV4Test.java:83 Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException at MemberServiceV4Test.java:833 tests completed, 3 failed> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/study/spring-db/jdbc/jdbc/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.7/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 8s4 actionable tasks: 1 executed, 3 up-to-date이런 오류가 발생하는데 어떻게 해결해야 될 지 몰라서 문의 드립니다.