묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
레포지토리가 트랙잭션 동기화매니저에서 커넥션을 가져오는 부분에 대한 질문이 있습니다.
레포지토리의 update, find.. 등의 메서드를 실행할 때 getConnection 의 DataSourceUtils 메서드를 통해 커넥션을 가져오는데요. 여기서 트랜잭션 동기화 매니저에 커넥션이 있으면 해당 커넥션을 가져오는 설명을 잘 들었습니다.그런데 트랜잭션 매니저는 DataSourceTransactionManager 의 인스턴스고 DataSourceUtils 는 static util 클래스인데 이 사이에 트랙잭션 동기화 매니저가 어느 위치에 있는지 궁금합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의를 mvc1 까지 듣고 작은 프로잭트를 하는중인데 고민있습니다!
영한님의 강의를 듣고 작은 프로잭트를 하고 있는데 기본적인 내용을 바탕으로 검색해 가면서 하고 있습니다 하는 도중에 하는 김에 조금 이쁘게 만들기 위해서 프론트 쪽 코드는 AI한테 물어보면서 하고 있습니다 아직은 프론트엔드는 모르기때문에 대부분의 코드를 복사 해서 사용중인데 괜찮을까요 ..?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
drop table if exists 쿼리 인텔리제이 에러
drop table member if exists cascade; ',', CASCADE or RESTRICT expected, got 'if' 인텔리제이에서 에러가 나서 찾아보니h2 디비 문법 오류 이더군요실행은 되는데 if exists 순서를 변경해주니까 인텔리에서 에러가 없어졌습니다 혹시나 해서 기록남깁니다 drop table if exists member cascade;
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
테스트 오류 ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] The object is already closed [90007-224]org.h2.jdbc.JdbcSQLNonTransientException: The object is already closed [90007-224] at org.h2.message.DbException.getJdbcSQLException(DbException.java:566) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.message.DbException.get(DbException.java:188) at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1422) at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:511) at hello.jdbc.service.MemberServiceV2.accountTransfer(MemberServiceV2.java:34) at hello.jdbc.service.MemberServiceV2Test.accountTransfer(MemberServiceV2Test.java:65) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)> Task :test FAILEDMemberServiceV2Test > 정상 이체 FAILED org.h2.jdbc.JdbcSQLNonTransientException at MemberServiceV2Test.java:651 test completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/user/Desktop/jdbc/jdbc/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 1s4 actionable tasks: 1 executed, 3 up-to-date 이런식으로 오류가 나는데 구글링해도 도저히 원인을 못찾겠네요ㅠㅠ 도와주세요 ㅠㅠ
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
인텔리제이 업데이트 후 문제 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]인털레제이를 업데이트 한 후 모든 코드에 에러가 생깁니다...
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 동기화 매니저와 커넥션 풀
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]데이터 소스로 HikariDatasource를 사용하면트랜잭션 매니저를 통해 트랜잭션을 시작할 때 커넥션을 획득하게 되는데 이 때 획득하는 커넥션은 커넥션 풀에서 하나 가져와서 트랜잭션 동기화 매니저에 넘겨주는거죠?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
pdf에 이 코드 수정되는 게 나을 것 같습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 스프링과 문제 해결 - 예외 처리, 반복.pdf(v20231127)11페이지의 MemberServiceV4Test 코드에서 이번 강의에서 throws SQLException이 더 이상 필요 없어져서 지우셨는데강의 자료엔 아직 남아 있어서 제보합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
이체 로직 관련 질문이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]계좌 이체 로직 중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); memberRepository.update(toId, toMember.getMoney() + money); } String sql = "UPDATE member SET money = ? WHERE member_id = ?";이렇게 멤버를 db에서 찾아와서 getMoney 하고 이체할 금액만큼 증감해서 update를 수행하도록 한 이유가 무엇인지 궁금합니다. public void accountTransfer(String fromId, String toId, int money) throws SQLException { memberRepository.update(fromId, -money); memberRepository.update(toId, money); } String sql = "UPDATE member SET money = money + ? WHERE member_id = ?" 이런 식으로 update sql문 내에서 현재 금액에서 이체 금액만큼 증감하도록 하고 update문만 호출하는 것이 더 간편하고 안전한 방법이 아닌가 궁금증이 생겨서 질문 글을 올립니다!
-
미해결토비의 스프링 부트 - 이해와 원리
MyOnClassCondition에 있는 matches method의 Invoke 횟수
안녕하세요 토비님, 질문의 앞서, 좋은 강의자료 감사드립니다. 앞으로도 계속 꾸준히 만들어 주세요! ^^ 혹시 MyOnClassCondition에 있는 matches method의 Invoke 횟수를 어떻게 예상하시나요? 저는 두번이라고 생각했는데요. "@ConditionalMyOnClass" annotation이 붙어있는 클래스가 두개 뿐이라서요. 그런데, 실제로 matches 안에서 출력을 해보니, 세번이 출력 되었습니다. 예상대로, TomcatWebServerConfig와 JettyWebConfigServerConfig를 각각 출력 했는데요. 그후에 한번 더 출력하더라구요. 마지막 출력은, 라이브러리에 포함된 것에 대한 config가 출력 됬습니다. 혹시 이유를 아시는지요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
첫번째 테스트 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]test2.mv도 만들고 h2버전 build.gradle에 입력두 해봤는데 해결이 안되네요 ㅠㅠ
-
미해결토비의 스프링 부트 - 이해와 원리
인용구의 출처가 궁금합니다.
안녕하세요. 강의 마지막에 조영호님의 프레임워크에 대한 견해를 소개해주셨는데요. 조영호(프레임워크3부) 라는 설명이 달려있는데프레임워크3부 라는 것이 무엇인지 알 수 있을까요?
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
오타인 것 같습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]5. 자바 예외 이해.pdf (v20231127) 6페이지에MyUncheckedException이라고 써져 있는데 MyCheckedException으로 바꿔야 할 것 같습니다
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 jpa 기반의 Entity가 올라온다면 서비스 계층이 순수하다고 볼 수 있을까요?
안녕하세요? 강의 잘 듣고 있습니다강의 내용을 쭉 들으면서, 결과적으로 서비스계층에 어떻게 하면 순수한 비즈니스 로직을 남겨둘수 있을까? 에 대한 고민을 풀어주셨다고 생각합니다. 그런데 저 개인적으로 드는 의문은, 일반적으로 JPA를 사용한다면 jpa ORM Entity가 서비스계층에 출몰하게 될텐데, 이는 곧 서비스계층이 JPA기반의 스택에 의존하게 된다는 것 아닌가요? 예를 들어 DB를 MYSql -> Mongo로 바꾼다고 했을 때, 서비스계층에서의 코드변화도 필요할 것 같은데, 이러한 부분에 대해서 어떻게 생각하시는지가 궁금합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
이게 데이터베이스 강의인걸로아는데
자바 고급편끝나고 데이터베이스 강의를 따로 내신다고하셔서요 무슨차이가있나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
템플릿 및 콜백패턴에 대해 질문드립니다
안녕하세요. 다름이 아니라 강의를 듣고 구글링을 해보긴했는데,아직 jdbcTemplate이나, 앞서 강의에서 배운 트랜잭션 템플릿에서 람다식의 매개값으로 해당값이 왜 들어가야하는건지, 또는 템플릿의 동작원리라던지.. 이해가 명확하게 되지않아서 이 부분을 그냥 넘어가야하는건지, 아니면 좀 더 알아보고 질문하면서 명확하게 짚고 넘어가야하는건지 질문드립니다..+ 혹시 콜백패턴이나 jdbcTemplate이나, 앞서 강의에서 배운 트랜잭션 템플릿에 대해서는 추후 강의에서 좀더 자세히 설명해주시는 부분이 있을까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
PlatformTransactionManager가 주입되는 이유
제가 알기로는 스프링에서 의존성 주입을 위해서는 @Component등의 어노테이션이 달려 있어 빈으로 등록되어야 컴포넌트 스캔에 의해서 자동으로 주입된다고 알고있는데요PlatformTransactionManager는 클래스를 확인해보아도 그러한 어노테이션이 없는데도 자동 주입되는 이유가 뭔가요? gpt에 물어보니 스프링이 제공하는 트랜잭션 관리 기능의 핵심 인터페이스이므로 빈으로 등록하지 않아도 주입된다고 하는데 맞는말인가요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션을 가져오는 원리
DataSourceUtils.getConnection()가 트랜잭션 동기화 매니저가 관리하는 커넥션이 있으면 해당 커넥션을 가져오는것은 알겠는데요, 어떻게 알고 가져오나요? 예를들어 13분에 나오는 public class MemberServiceV3_1 { private final PlatformTransactionManager transactionManager; private final MemberRepositoryV3 memberRepository; public void accountTransfer(String fromId, String toId, int money) throws SQLException { //트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //비즈니스 로직 bizLogic(fromId, toId, money); transactionManager.commit(status); //성공시 커밋 } catch (Exception e) { transactionManager.rollback(status); //실패시 롤백 throw new IllegalStateException(e); } } private 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); } private void validation(Member toMember) { if (toMember.getMemberId().equals("ex")) { throw new IllegalStateException("이체중 예외 발생"); } } }이 코드에서 bizLogic 부분에는 트랜잭션 매니저와 같은 파라미터를 전달해주지 않는데, 아무리 DataSourceUtils.getConnection()를 쓴다 한들 어떤 트랜잭션 매니저가 시작한 커넥션인지 어떻게 아는거죠?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
스프링 추상화 질문(exTranslator.translate)
안녕하세요 김영한 강사님. 질문 있습니다!질문: JDBC 기술 외에 어떻게 스프링 예외 추상화를 적용시킬 수 있는지. exTranslator.translate를 통해서 스프링 예외로 변환하는 것은 편한 것 같습니다. 그런데 MyBatis나 JPA 같은 기술을 사용할 땐 어떻게 사용해야할 지 감이 안오네요JPA는 제가 잘 모르지만 SQL문을 JDBC 처럼 직접 작성해서 pstmt를 통해 보낼 것 같진 않고, MyBatis는 Mapper.xml를 통해 SQL문을 작성하게 되는데 어떻게 스프링 예외 추상화를 적용 시킬 수 있을지 궁금합니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DriverManagerDataSource import가 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]사진 첨부합니다.
-
미해결토비의 스프링 부트 - 이해와 원리
프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용
강의 도중 AnnotationUtils를 사용하여 애노테이션의 정보를 얻어오는 부분이 있습니다.MyConfigurationProperties annotation = AnnotationUtils .findAnnotation(bean.getClass(), MyConfigurationProperties.class); if (annotation == null) return bean; Map<String, Object> attributes = AnnotationUtils.getAnnotationAttributes(annotation); String prefix = (String) attributes.get("prefix"); return Binder.get(env).bindOrCreate(prefix, bean.getClass()); 여기에서 attributes를 가져오지 않고 annotation.prefix() 를 사용해서 정보를 가지고 올 수도 있다고 생각됩니다만 AnnotationUtils를 사용할 때의 다른 이점이 있는 것인가요??MyConfigurationProperties annotation = AnnotationUtils .findAnnotation(bean.getClass(), MyConfigurationProperties.class); if (annotation == null) return bean; return Binder.get(env).bindOrCreate(annotation.prefix(), bean.getClass());