묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
close()에 관해 궁금한점이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Connection 객체의 경우에는 해당 커넥션이 만들어지고 close하지않으면 네트워크 리소스 소모때문에 close를 해야하는것으로 이해했습니다.그렇다면 preparedStatement와 ResultSet객체의 경우에는 해당 데이터베이스로 SQL문을 전송및 전달받는 객체인걸로 보이는데 왜 close로 명시적으로 닫아야하는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
예외처리 질문
try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } 이 코드를 실행하면 왜 밑에있는 출력문이 10개가 나오는지 궁금합니다 HikariPool-1 connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool -- HikariPool-1 - Added connection conn1: url=jdbc:h2:tcp://localhost/~/test user=SA
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
rs.next()의 동작 방식이 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ResultSet에서 데이터를 얻어오기 위해 rs.next()를 계속 수행하며 진행하는데 여기에서 궁금한게ResultSet은 첫 쿼리로 모든 데이터를 받아온 뒤에 단순히 메모리에서 커서를 이동하는 건가요?아니면 rs.next()가 호출될때마다 DB에서 새로 데이터를 받아오는건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
get connection 로그가 6개 나오는 이유가 궁금해요
여기 로그를보면 get connection 로그가 6개가나오는데요 save ,findById, update, delete 4번을해서 로그가 4번이 나올줄알았는데 왜 커넥션로그가 6번 나왔는지 궁금해요
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
ConnectException이 잡히지 않는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]checked() 테스트에서 아래와 같이 isInstanceOf(SQLException.class)를 ConnectException.class로 변경하면 왜 테스트가 통과되지 않는지 궁금합니다 ! @Test void checked() { Controller controller = new Controller(); Assertions.assertThatThrownBy(() -> controller.logic()) .isInstanceOf(ConnectException.class); }public void logic() throws SQLException, ConnectException { service.logic(); } service.logic()에서 두 예외가 다 밖으로 던져졌으니 테스트에서도 ConnectException가 발생하는게 아닌가요?
-
해결됨토비의 스프링 부트 - 이해와 원리
4섹션 스프링컨테이너로 통합 재생이 안됩니다.
계속 무한 로딩만 뜨고 재생이 안됩니다. ㅠ+같은 섹션 'SpringBootApplication' 도 재생이 안되고 있습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
TransactionSynchronizationMaganger 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요~ repository은 TransactionSynchronizationMaganger를 통해 트랜잭션이 적용되어 기존의 커넥션이 존재하면 그 커넥션을, 트랜잭션이 적용되어 있지 않아 기존의 커넥션이 없으면 새로운 커넥션을 받아올텐데요. 트랜잭션이 적용되어 기존의 커넥션이 존재할 때, 그 기존의 커넥션을 식별할 수 있는 방법은 무엇인가요? 즉, TransactionSynchronizationMaganger는 각 서비스에서 사용중인 커넥션들을 어떻게 식별해서 각 서비스에 전달하는지 궁금합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
어노테이션매핑정보 - 404 오류 문의드립니다
안녕하세요. 어노테이션 매핑정보 사용 강의 보고 궁금한점이 생겨 문의 남겼습니다.지금까지 강의에 나온것과 똑같이 코드를 작성했습니다. 그런데 실행하면 예상했던 값이 나오지 않고 404 오류가 떠요.실행창에는 아래와 같은 메세지가 나옵니다.16:09:26.879 [http-nio-8080-exec-1] WARN org.springframework.web.servlet.PageNotFound -- No mapping for GET /hello16:09:26.886 [http-nio-8080-exec-1] WARN org.springframework.web.servlet.PageNotFound -- No endpoint GET /hello. 그래서 HelloController 클래스위에 @RequestMapping을 지우고 대신 @Controller을 추가해봤더니 그제서야 강의와 같은 결과가 나옵니다.제 스프링 버전은 3.x, jdk17인데 이것과 관련이 있을까요? 같은 코드인데 왜 저는 404가 나오는지 궁금합니다...
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 동작 원리 정리
트랜잭션의 동작 원리에 대해서 정리해봤습니다.제대로 이해했는지 확인 부탁드립니다! 혹시 잘못 이해하고 있는 부분이 있다면 말씀 부탁드립니다. 서비스 클래스의 메소드에 @Transactional 이 있으면 스프링은 해당 비즈니스 로직을 상속한 AOP 프록시 객체를 생성한 후, 이를 스프링 빈에 등록한다.클라이언트가 해당 프록시를 호출한다. (비즈니스 로직 자체를 호출하지 않는다)스프링은 스프링 컨테이너에 등록된 트랜잭션 매니저를 획득한다.트랜잭션 매니저의 transactionManager.getTransaction()을 호출하여 트랜잭션을 시작한다.트랜잭션 매니저는 스프링 컨테이너에 등록된 데이터 소스를 이용하여 커넥션을 생성한다.커넥션의 con.setAutoCommit(false) 호출로 수동 커밋 모드로 변환한다.생성하고 설정을 끝낸 커넥션을 트랜잭션 동기화 매니저에 보관한다.실제 서비스를 호출하면, 서비스의 비즈니스 로직과 리포지토리의 데이터 접근 로직이 수행된다.리포지토리의 데이터 접근 로직은 트랜잭션 동기화 매니저에 보관된 커넥션을 획득한 후 DB에 접근하여 SQL을 수행한다.비즈니스 로직이 끝나면서 AOP 프록시에서 커밋 또는 롤백을 통해 트랜잭션을 종료한다.트랜잭션을 종료함으로써 커넥션은 커넥션 풀에 반납된다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
프록시 객체 생성은 @Transactional 메소드 단위인가요?
프록시에 대해서 잘 모르는 상태로 질문드립니다.앞으로 다른 강의에서 나올 수 있는 내용이지만, 일단 큰 그림을 잡을 수 있게 간단하게 질문드립니다. 이번 강의에서 메소드에 @Transactional을 붙이면 프록시 객체가 만들어진다고 배웠습니다.그렇다면 @Transactional가 붙어있는 메소드 단위로 프록시 객체가 만들어지는 건지, 아니면 Service 클래스 단위로 프록시 객체가 만들어지는 건지 궁금합니다.예를 들어, Service 클래스에 3개의 메소드가 있다고 가정했을 때, @Transactional 메소드가 2개, 일반 메소드가 1개 있다면, 프록시 객체는 2개가 만들어지는 건가요? 아니면 한 개의 프록시 객체에 두 개의 메소드가 등록되는 건가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
이체중 예외 발생 테스트에서 롤백이 안되는 것 같아요
프로젝트 코드 : https://drive.google.com/file/d/11CCB36D9oTLIXMvT4LUcGoXfyXB9Pk0E/view?usp=sharing MemberSerivceV3_1Test, MemberSerivceV3_2Test 에서 이체중 예외 발생 테스트가 통과가 안됩니다.기대하는 바는 롤백이 적용되어야 하는데, 실제 값은 롤백이 적용되지 않는 8000원이 저장됩니다.PlatformTransactionManager을 적용한 코드에서 문제가 발생하는 것 같습니다.딱히 놓친 부분이나 잘못한 부분을 발견하기 힘들어서 도움을 요청드리고자 질문 올립니다. ㅠㅠ 감사합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
@JdbcTest 관련 질문
안녕하세요. 섹션 10. 스프링 부트 자세히 살펴보기에서스프링 부트의 자동 구성과 테스트로 전환하는 부분 보다가 궁금증이 생겨서 질문남깁니다. @HellobootTest를 @JdbcTest 또는 @SpringBootTest로 전환하는 부분에서 @JdbcTest같은 경우는 내장된 테스트용 db로 교체를 한다. 라고 설명을 해주셨습니다. 그리고 이전 강의에서 테스트를 위해 인메모리 db인 h2를 사용하도록 application.properties에 설정을 하고 테스트를 진행했었습니다. 여기서 질문은 @JdbcTest를 사용하면 교체된다고 하는 db가 기존에 사용했던 h2 DB가 아닌 또 다른 DB로 전환된다는 말씀인건지가 헷갈려서 질문드립니다. 구체적으로 JdbcTemplateTest class가 jdbcTemplate을 테스트하기 위해 hello table을 db에 생성하고 insert하는 작업을 할 때, @HellobootTest 일 때는 h2 db를 사용하고 @JdbcTest로 교체했을 때는 다른 embedded db를 사용하는건가요? 감사합니다!
-
미해결토비의 스프링 부트 - 이해와 원리
Environment Abstraction 의 우선순위
섹션8의 Environment 추상화와 프로퍼티 제목의 강의의 막바지 부분에서 Environment Abstraction 의 우선순위에 대한 내용이 나옵니다. 강의 내용을 요약해보자면 ServletConfig Parameter < ServletContext Parameters < JNDI < System Properties < System Environment Variables < @PropertySource < application.properties, xml, yml 대로 오른쪽으로 갈 수록 우선순위가 높다라고 이해를 했습니다. 우선 저는 System Properties가 jvm 옵션을 말하는건가? 라는 생각을 가지고 들었고 그렇게 생각하고 위의 내용을 보니 jvm option의 우선순위가 os의 환경 변수보다 높아야 되는거 아닌가? 라는 궁금증이 생겼습니다. 제목 그대로 우선순위에 대한 내용에 오류는 없는것인지 궁금합니다.++ 질문 수정"자동 구성에 Environment 프로퍼티 적용" 강의를 들어보니 우선순위를 제가 반대로 이해한것 같습니다. 여기서 추가적으로 궁금증이 생겼습니다.저는 application level의 설정이 더 우선해야 되는 것 아닌가? 라는 생각에application property > jvm property > os level property 라고 생각을 했습니다. 하지만 스프링에서는jvm property > os level property > application property의 우선순위를 가지게 한 것 같은데 그 이유가 무엇일까요?이것에 대한 생각이 어떠신지 궁금합니다.그리고 우선순위의 변경을 원한다면 바꿀 수 있도록 스프링이 제공하는지도 궁금합니다! 감사합니다.=======================제가 강의 내용을 끝까지 안듣고 궁금한것을 적었는데..질문을 남기고 나머지 강의를 들어보니 궁금했던 내용이 해소가 됐네요. 자문 자답하자면, application의 설정을 default로 하되, 어떤 환경에서 어떤 사용자가 사용하냐에 따라 설정이 달라질 수 있어야 하기 때문에 jvm, os level의 property보다 우선순위가 낮아야 할 것입니다. 이왕 글을 남긴거 삭제하기 뭐해서 남겨두겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
AutoConfigure 시 등록되는 Bean 에 대해 질문있습니다.
안녕하세요 강사님. 덕분에 1년사이에 실력이 늘은것이 체감이 많이 듭니다. 다름이 아니라, 해당 강의에서 강사님께서 자동구성때 등록되는 DataSource 는 HikariDataSource 라고 하셨고TransactionManager 는 사용하는 라이브러리에 따라 달라진다고 하셨습니다. 그래서 스프링 부트가 AutoConfigure 할 때 등록되는 Bean 들을 찾아보았습니다. DataSource 는 HikariDataSource 가 잘 잡히는 것 같구요 TransactionManger 는 JDBC 를 사용하기때문에 DataSourceTransactionManager 가 잡히는 것을 확인할 수 있습니다. 제가 찾은것이 맞을까요? 근데 왜 첫번째 사진에서 HikariDataSource 를 리턴할때 null 을 리턴할까요? ㅠㅠ 이것을 모르겠습니다. 단순히 properties 나 yml 에 spring.datatsource.hikari 를 설정하지 않아서일까요? 좋은 하루 보내세요
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 이니셜라이저 사용 제보입니다
며칠 전부터 자바 11기반의 2.7.X 버전이 이니셜라이저에 안 뜨길래공식 사이트를 찾아보니 11월 24일 부로 지원이 종료되었다고 뜨네요 이제는 강의 내용처럼 자바 11을 쓰려면build.gradle에 구버전 의존성들을 직접 작성해야 하는 건가요?? 일단은 자바 17, 스프링부트 3.2.0으로 진행 중인 상태입니다
-
미해결토비의 스프링 부트 - 이해와 원리
proxyBeanMethods=false 와 관련해서 질문이 있습니다.
proxyBeanMethods=false 을 사용하면 Bean 오브젝트가 싱글톤 빈처럼 같은 오브젝트가 리턴되는 것이 아니라 매번 새로운 오브젝트가 생성된다고 하셨는데 이렇게 굳이 새로운 오브젝트를 매번 생성하는 이유가 있을까요?새로운 오브젝트를 생성하는 비용보다 프록시 생성을 해서 싱글톤 방식으로 같은 오브젝트를 리턴하는 비용이 더 크기 때문일까요?왜 그렇게 설정을 하는 것인지 궁금합니다.
-
해결됨토비의 스프링 부트 - 이해와 원리
@Configuration 과 @ComponentScan
@Configuration @ComponentScan public class HelloApplication { public static void main(String[] args) { AnnotationConfigServletWebApplicationContext applicationContext = new AnnotationConfigServletWebApplicationContext(){ @Override protected void onRefresh() { super.onRefresh(); ServletWebServerFactory webServerFactory = new TomcatServletWebServerFactory(); WebServer webServer = webServerFactory.getWebServer( servletContext -> { servletContext.addServlet("dispatcherServlet", new DispatcherServlet(this) ).addMapping("/*"); } ); webServer.start(); } }; // applicationContext.register(HelloController.class); // applicationContext.register(SimpleHelloService.class); applicationContext.register(HelloApplication.class); applicationContext.refresh(); } }강사님 안녕하세요, 강의를 복습하다보니 @ComponentScan을 사용할 때 @Configuration이 필요한지 의문이 들더라구요 처음에 @Configuration javaDoc를 보면 @ConponentScan 부분에 @Configuration 클래스는 구성 요소 스캐닝(component scanning)을 통해 부트스트랩될 뿐만 아니라, @ComponentScan 주석을 사용하여 스스로 구성 요소 스캐닝을 설정할 수도 있습니다.라고 작성이 되었더라구요 @ComponentScan public class HelloApplication {}이 상태로 register에 등록을 해도 컴포넌트 스캔이 동작합니다. Creating shared instance of singleton bean 'helloApplication' Creating shared instance of singleton bean 'helloController' Creating shared instance of singleton bean 'simpleHelloService'@Configuration이 없어도 직접 register에 등록하면 애노테이션을 읽어서 컴포넌트 스캔이 동작합니다. 그러면 register에 @Configuration을 붙이지 않고 직접 등록한다면 @ComponentScan만 있어도 되는데 붙이는 이유가 궁금합니다.
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Exception 질문
체크 예외를 throws Exception으로 던지면 다른 체크 예외를 체크할 수 있는 기능이 무효화 된다고 하셨습니다.if문으로 필요로 하는 체크 예외를 따로 처리하면 될 것 같은데 안되나요??
-
미해결토비의 스프링 부트 - 이해와 원리
스프링 로그인 제어 문의드립니다
안녕하세요 토비님제가 테더링이 제한되서 부득이 하게첨부이미지로 질문드립니다수고하세요,,
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Test에서 NullpointerException이 떠요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의중 커넥션풀을 이용해 Test를 해보는 부분입니다.(강의에선 V1 로 사용하지만 저는 V0이라고 이름만 다르게했습니다)강의에선 이렇게 코드를 작성하시는데, 저는 똑같이 해서 test해보면 아래 crud메서드의 repository.save(member); 부분에서 nullpointerException이 발생합니다. 혹시 beforeEach 메서드 내의 초기화부분이 잘못된건가 해서이런식으로 초기화부분을 crud 메서드 안으로 가져온뒤 실행하면 테스트에 성공합니다.어디에 문제가 있는지를 잘 모르겠습니다.