묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 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이런 오류가 발생하는데 어떻게 해결해야 될 지 몰라서 문의 드립니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
member.get 함수
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 중 아래 부분에서 의문이 들어 질문 남깁니다.pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney());. 이 부분에서 저희가 만든 member클래스에는 get 함수를 넣지 않았는 데 get 함수를 어떻게 쓸 수 있는 걸까요??
-
미해결토비의 스프링 부트 - 이해와 원리
단위 테스트 구성 시 다른 오브젝트를 직접 구성해주는 과정의 용어가 궁금합니다.
안녕하세요.강의 중에 HelloControllerTest를 구현 중 HelloService를 직접 구성해주는 과정을 teststop이라고 부른 것인가요?강의 정말 유익하게 듣고 있습니다. 감사합니다. :)
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션에 관한 질문 드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네[질문 내용]안녕하세요 커넥션과 관련된 질문을 드리고 싶습니다.해당 강의에서 커넥션이 여러번 반복되어 나오는데커넥션 개념이 정리가 잘 되지 않습니다.애플리케이션 로직이 커넥션을 조회하면 DB 드라이버에서DB와 TCP/IP 커넥션 연결을 한다고 나옵니다.그 후 다다음 단계에서 커넥션이 생성 완료되었다고 나오는데커넥션을 연결하는 것과 커넥션이 생성되는 것이 모호하게 이해가 잘 되질 않습니다. 이 부분에 대한 추가적인 설명을 부탁드려도 될까요? 그 후 DB드라이버는 커넥션을 반환한다고 나오는데 이것은 커넥션 객체를 말하는 것일까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
PPT에 오타가 존재하는 것 같습니다.
2강 커넥션 풀과 데이터 소스 챕터에서11 페이지의 상단에 이부분... 쓰레드 풀이 아니라 커넥션 풀 아닌가요?쓰레드 풀은 지금 내용이 아닌거 같아요
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
공통 예외처리 질문 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예외를 던질 때 cause 예외를 함께 넘기니까공통 예외처리하는 부분에서는 Exception으로 예외를 잡아서 로그를 남기나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
질문이 있습니다...
[질문 내용]궁금한점이 몇가지 있습니다 ...
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Transactional은 수동커밋으로 변경되나요 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제목이 곧 내용입니다
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
이체중 예외발생 로그
[질문 내용]테스트를 돌렸을때 이런 깨지는현상은 어떻게 변경할수있을까요? 세팅에서 UTF-8로 변경해보았지만 변경이 안되네요 ㅠㅠ.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
진행과정중 로그 표시
김영한 선생님과는 다르게 너무 로그가 간단하게 나오고 좌측에 Test Results도 열어봐도 아무것도 없다고 나옵니다 왜그럴까요? ㅠㅠ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
8분쯤 나오는 첫번째테스트 오류
[질문 내용]다음과 같은 오류가 발생하는데 이유를 모르겠네요 ㅠㅠ
-
미해결토비의 스프링 부트 - 이해와 원리
web.xml -> dispatcherServlet 질문
안녕하세요.강의에서 조금 벗어난 주제일 수도 있는데, 기존 레거시 프로젝트를 스프링부트로 전환하는 작업을 하고 있는데, web.xml의 .do를 spring boot에서 어떻게 사용할 수 있는지 너무너무 궁금합니다.현재 아래와 같이 변경해 봤는데 전혀 작동을 안 합니다 ㅠㅠ @Configuration @RequiredArgsConstructor public class ServletConfig { private final DispatcherServlet dispatcherServlet; @PostConstruct public void init() { dispatcherServlet.setThreadContextInheritable(true); } @Bean public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() { ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(dispatcherServlet, "/", "*.do"); registration.setLoadOnStartup(-1); registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME); return registration; } @Bean public DispatcherServletPath dispatcherServletPath() { return () -> "/"; } } spring 4 버전의 web.xml 에서 url-mapping을 / , *.do 로 설정 해 놨는데, 프로젝트에서 @RequestMapping을 사용할땐 .do를 따로 적지 않아도 .do 요청을 알아서 매핑해 주던데, 이 부분도 정확히 어떤 원리로 동작하는지 모르겠습니다 ㅠㅠex) login.do --> @RequestMapping("/login").do 설정을 2주째 보고 있는데 진척이 없네요 .....
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Transactional 위치와 적용에 대하여
[질문 내용] @Transactional public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); } public void bizLogic(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(toId, toMember.getMoney() + money); }안녕하세요. 강의 코드와 같이 accountTransfer을 실행했을때 트랜잭션이 잘 작동되어 오류가 발생했을때 롤백이 실행됩니다. @Transactional public void accountTransfer(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(toId, toMember.getMoney() + money); }이 코드 또한 그렇습니다. public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); } @Transactional public void bizLogic(String fromId, String toId, int money) throws SQLException { Member fromMember = memberRepository.findById(fromId); Member toMember = memberRepository.findById(toId); memberRepository.update(fromId, fromMember.getMoney() - money); validation(toMember); memberRepository.update(toId, toMember.getMoney() + money); }하지만 이 코드에서 accountTransfer을 실행했을때 트랜잭션이 작동하지 않습니다.이유가 무엇일까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
스프링이 제공하는 기능과 스프링 빈의 관계
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링이 제공하는 트렌잭션 AOP를 사용하면 스프링 부트에서 관련된 로직을 자동으로 스프링 빈으로 등록한다는 설명에서 궁금한 점이 생겼습니다. 개발자들이 직접 컴포넌트 스캔이나 @Controller 와 같은 애너테이션을 사용해서 등록하는 빈들과 별개로 트렌젝션과 같은 부가 가능또한 빈으로서 관리가 되어야 사용할 수 있는 것인 걸까요? 어떻게 보면 당연히 등록되어야지! 라는 생각도 들지만, 스프링 빈으로 등록이 되어야하는 객체에 기준이 있는건지 궁금합니다. 예상하는 기준은 다음과 같습니다.1. 개발자가 서비스 로직을 만들기 위해 개발되는 모든 것은 스프링 빈으로 등록하여 싱글톤으로 용이하게 관리하며 자동의존 주입을 받는다. 2. 데이터 접근 기술이나 트랜잭션 같이 스프링에서 편리하게 관리할 수 있게 만들어 놓은 것을 사용하려면 스프링 빈으로 등록해서 사용해야한다. 2-1. 다만 스프링에서 제공하는 기능적인 기술은 스프링 부트를 사용시 자동으로 등록해준다.