25%
57,750원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션이 적용되지 않는 메소드에 대해서 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 accountTransfer 메소드에 @Transactional을 붙여서 트랜잭션 관리가 되도록 했는 데 만약에 같은 클래스에서 @Transactional이 붙어 있지 않는 메소드에서는 트랜잭션 매니저를 거치는 지, 만약 거치지 않는 다면 어떻게 작동하는 지 궁금합니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
JdbcUtils.closeConnection 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]커넥션 풀 안에 있는 커넥션을 획득해서 사용한 후에, JdbcUtils.closeConnection() 메소드를 실행하면 커넥션이 끊길것 같은데, 끊기면 안되지 않나요? 왜냐하면 커넥션 풀 안에 있는 커넥션들은 계속 DB와 연결되어 있어야 한다고 생각해서요!!!
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
ThreadLocal을 사용하는 이유에 대한 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ThreadLocal을 사용하는 이유가 쓰레드는 기본적으로 다른 쓰레드와 리소스를 공유하게 되는데 커넥션을 반환했다가 다시 가져오는 과정에서 혹여나 다른 요청으로 인해 커넥션을 다른 요청이 가져가 버릴까봐 ThreadLocal을 사용하여 하나의 요청에서 계속 사용할 수 있게하기 위해서인가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV3_2에서 PlatformTransactionManager로 주입받는 것
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6분 40초쯤 부분에서 transactionManager를 PlatformTransactionManager 로 받으면 유연성이 더 생긴다고 설명하신 부분에 대한 질문입니다.김영한님께서 주시는 가르침들에 대해서 최대한 세세한 것 까지 흡수하고자 노력하고있습니다.저 부분에서 설명하신 이유에 대해서 조금만 더 자세히 설명해주실 수 있을까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀에 커넥션 생성할 때 모든 커넥션이 별도의 쓰레드에서 만들어지는 것 같지 않아요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]03:20:57.456 [Test worker] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn0: url=jdbc:h2:tcp://localhost/~/test user=SA03:20:57.463 [MyPool connection adder] DEBUG com.zaxxer.hikari.pool.HikariPool - MyPool - Added connection conn1: url=jdbc:h2:tcp://localhost/~/test user=SA커넥션 을 풀에 채워주는 과정에 대한 로그를 확인해보니 제일 첫번째 커넥션인 conn0의 경우 [Test worker] 쓰레드에서 생성이 이루어지는것 같은데 첫번째 커넥션은 항상 메인 쓰레드에서 만들어지고 이후 [MyPool connection adder]로 넘어가는 것인가요?강의 자료와 살짝 달라 질문 드려봅니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
<예외 포함과 스택 트레이스> 강의 중 이해안가는 부분이 있어요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.log.info("ex", ex);이 예의 경우에는 파라미터가 없기 때문에 스택트레이스에 로그를 출력할 수 없다고 하셨는데 위에 코드랑 연결되는건가요? 지금 예외 객체 참조변수명이 e인데 ex라고 해서 존재하지 않는거라 출력이 안되는걸까요? 코드에 있는 log.info("ex", e);의 경우 출력되고log.info("message={}", "message", ex); 도 출력되는데log.info("ex", ex);는 출력이 안된다는 부분이 이해가 잘 안갑니다 ㅠㅠ
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
커넥션 풀에 대해서 질문이 있습니다.
커넥션 풀 없이 사용한다고 한다면public void delete(String memberId) throws SQLException { String sql = "delete from member where member_id = ?"; Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, memberId); pstmt.executeUpdate(); } catch (SQLException e) { log.error("db error", e); throw e; } finally { close(conn,pstmt,null); } }여기서 말하는 커넥션 풀이 getConnection()으로 URL과 아이디와 비밀번호를 넘겨서TCP/IP로 DB와 통신을 유지하는 상태를 끊지 않고반환만 한다고 들었는데요그럼여기서 PreparedStatement,ResultSet은 사용하고close()를 하고 커넥션만 유지한다고 이해하면 될까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
HikariCp 개념 관련 질문입니다.
안녕하세요.2강 커넥션 풀과 데이터소스 이해 파트 수강 중 질문이 있습니다. 커넥션 풀을 사용하는 이유가 매번 database 커넥션을 획득하기 위해 TCP/IP 커넥션을 연결하는 등 여러 과정이 수행되고, 따라서 시간이 많이 소요되기 때문으로 이해했습니다.그렇다면, 커넥션 풀을 DBCP2나 HikariCP 등을 사용해도, db에 접근해서 데이터를 조회하거나 수정하는 등 crud 작업을 수행하는 시간 자체는 기존과 큰 차이가 없는 것인지 궁금합니다. 감사합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberRepositoryV0를 try-with-resources를 사용해 refactoring 해봤습니다..
자바와 관련된 것이라 조금 조심스럽긴 하지만, 해당 클래스를 아래와 같이 try-with-resources를 사용해 refactoring 해 보았습니다.테스트 코드는 잘 돌아가는데, 아래와 같이 변경해도 상관없나해서 질문 남깁니다!감사합니다!package hello.jdbc.repository; import hello.jdbc.connection.DBConnectionUtil; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import java.sql.*; import java.util.NoSuchElementException; /** * JDBC - DriverManager 사용 */ @Slf4j public class MemberRepositoryV0 { // jdbc를 이용해 member 객체 저장 public Member save(Member member) throws SQLException { String sql = "insert into member(member_id, money) values (?,?)"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getMoney()); pstmt.executeUpdate(); return member; } catch (SQLException e) { log.error("db error", e); throw e; } catch (NullPointerException e) { log.info("NPE 발생", e); } return member; } public Member findById(String memberId) throws SQLException { String sql = "select * from member where member_id = ?"; try (Connection conn = getConnection(); PreparedStatement pstmt = createPreparedStatement(sql, conn, memberId); ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { Member member = new Member(); member.setMemberId(rs.getString("member_id")); member.setMoney(rs.getInt("money")); return member; } else { throw new NoSuchElementException("member not found memberId=" + memberId); } } catch (SQLException e) { log.error("db error", e); throw e; } catch (NullPointerException e) { log.info("NPE 발생", e); } return new Member(); } private PreparedStatement createPreparedStatement(String sql, Connection conn, String memberId) throws SQLException { PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, memberId); return pstmt; } public void update(String memberId, int money) throws SQLException { String sql = "update member set money=? where member_id=?"; try (Connection conn = getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, money); pstmt.setString(2, memberId); int resultSize = pstmt.executeUpdate(); log.info("resultSize={}", resultSize); } catch (SQLException e) { log.error("db error", e); throw e; } catch (NullPointerException e) { log.info("NPE 발생", e); } } public void delete(String memberId) throws SQLException { String sql = "delete from member where member_id = ?"; try (Connection connection = getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(sql)) { preparedStatement.setString(1, memberId); int resultSize = preparedStatement.executeUpdate(); log.info("resultSize={}", resultSize); } catch (SQLException e) { log.error("db error", e); throw e; } catch (NullPointerException e) { log.info("NPE 발생", e); } } private static Connection getConnection() { return DBConnectionUtil.getConnection(); } }
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
h2데이터베이스 설정 강의 2분50 초 부분 이해가 안갑니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.~/test.mv.db 파일 생성 확인 이걸 터미널상태에서확인하는 부분이 안되네요.. 이상태에서 즉 터미널에서 h2.bat 실행상태에서 타자를 쳐도 먹지 않는데요.. 강사님은보면..터미널에서 명령어 ll 치고 나서 ls -arlth치는데 전 안되는데 어떻게 하는거에요.. 강사님 터미널은 경로가 갑자기 ~ 로 변해있는것도 이상하고 맥이라 다른가 싶기도 하고...도대체 제터미널 경로는 C:\study\h2\h2\bin>h2.bat 인데...이상태에서 ~/test.mv.db 파일생성확인을 터미널에서 어떻게 하는거에요???
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
UNCHECKED EXCEPTION 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]uncheckedapptest 클래스에서 service class 부분입니다. service.logic()을 실행하면 먼저 repository.call()에서 runtimesqlexception이 발생하게 됩니다. 그럼 이 경우에 아래줄읜 networkclient.call()을 실행 안하고 바로 throw runtimesqlexception을 하게 되나요?이 부분에서 runtimesqlexception.class를 runtimeconnectexception으로 바꿔서 검증하면 에러가 납니다.!결론)1)이 코드가 작동할때는 runtimesqlexception이 발생해서 networkclient.calll()을 실행안하고 throw로 runtimesqlexception만 던지는지2) 그럼 서블릿은 runtimeconnectexception이 발생했다는 것을 인지를 전혀 못하는지 3)마지막 사진에서 runtimesqlexception.class대신 runtimeconnectexception.class로 바꿔 실행하면 왜 초록불이 안들어오는지 궁급합니다!궁금합니다!!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DriverManager 가 Driver 후보들을 가지는 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]안녕하세요. 데이터베이스 연결을 보면서 궁금증이 생겼습니다.DriverManager 는 제공받은 url 을 핸들링할 수 있는 Driver 구현체를 찾는다고 이해했는데요.DriverManager 는 위의 검증 이전에 어떻게 Driver 구현체들을 후보로 리스트로 들고있게되나요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
체크 예외 -> 언체크 예외 전환 시 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 체크 예외를 런타임 예외로 변환하는 과정에서 강의의 예시에서는 ConnectException을 RuntimeConnectException으로, SQLException은 RuntimeSQLException으로 변경해서 throws가 전파되는 것을 막는 모습을 볼 수 있었는데요.이런 상황에 있을 때, SQLException이나, ConnectException같은 경우는 예외가 발생했을 때 애플리케이션 단에서 처리를 못하니, 예외 문서에 작성해두고, 예외를 잡지 말고 발생하게두나요? Controller 사용중이라면 ControllerAdvice를 통해서 해결을 하면 될텐데, Rest API를 사용중이라면 RestControllerAdvice에서 ExceptionHandler를 통해 예외를 잡지 않고 강의에서 말씀하신 것처럼 500으로 던지는 지가 궁금합니다.강의의 초점이 막을 수 없는 체크 예외가 발생했을 때 이를 throws를 통해 전파하기보다 런타임 예외로 바꿔서 예외 문서를 잘 처리해서 깔끔한 코드를 만들자로 이해하면 되는 걸까요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Translator 종류
안녕하세요 스프링의 편한 예외 전환 강의 감사합니다. 궁금한 점이 있습니다.repository에서 sql문법에러든 DuplicateKey 에러든 자동적으로 넘어온다고 했잖아요?그런데 그럴려면 각각 대충 예상하고 Repository 에서 Translator 종류를 다르게 정의해야 하죠?예를 들어 강의에서는선언 private final SQLExceptionTranslator exTranslator; (중략) //생성자에서 this.exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource); (중략) // catch 부분에서 throw exTranslator.translate("save", sql, e);라고 했는데요위와 같은 상황에서는 DuplicateKeyException은 터질 수 없는 것 맞죠?SQLExceptionTranslator 인터페이스를 구현하고 있는 클래스에는 DuplicateKeyException 클래스가 없더라구요 (DuplicateKeyException는 올라가보니 NonTransientDataAccessException 클래스를 상속 받을받음) 그렇다면 변형된 스프링 에러가 넘어오게 하려면(translator) 각각 다른 Translator 인터페이스와 그에 맞는 구현클래스를 사용해야 하는 것 맞을까요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
오타
좋은 강의 감사합니다. pdf 6. 스프링과 문제 해결 - 예외 처리, 반복11페이지에 MemberServiceV4Test 클래스에 @Slf4j 가 필요합니다. 중요친 않지만..좋은 강의 제공해주셔서 감사해서 말씀드립니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
전환 예외시 네이밍 관례
안녕하세요 늘 좋은 강의 감사합니다! 이번 예외편 너무나 잘 들었습니다. 예전부터 너무 궁금했는데 어떤 식으로 해결하는지 한번에 정리가 되네요. 궁금한 점이 있는데요.체크드 예외 -> 런타임 예외로 변경해서 처리하잖아요.1. 네이밍관례는 어떤 식으로 될까요? 물론 회사마다 다르겠지만, SQLExcpetion -> RuntimeSQLExcepton 처럼 "Runtime" + "체크트예외네이밍" 을 붙이는 식으로 변환하는 걸까요? 영한님이 평소에 말씀하시는 "일반적으로" 가 궁금합니다. 메이저IT 기업의 예처럼요. 2.SQLException을 이어받을 예외를 RunTimeSQLException 클래스로 만들었다고 한다면, 그 안에는 보통 (Throwable cause)를 받는 생성자 하나 정도만 만들어 놓고 다른 추가 작업은 필요한 것이 없을까요? 이것도 위처럼 보통 어떤 식으로 처리하는지 궁금합니다. 감사합니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
static class 의 new 생성자
강의에서 중요한 부분은 아닙니다만, CheckedTest 클래스와 UnCheckedTest 클래스 내부 클래스에서 각각 Service, Repository 클래스를 내부 static 으로 선언을 했잖아요? 그런데 static으로 선언되었음에도 두 클래스는, new Service(), new Repository() 로 생성이 되는 것이 이해가 안됩니다. 감사합니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
설정파일 못 찾는 에러
안녕하세요 좋은 강의 감사합니다. ('스프링 부트의 자동 리소스 등록' 강의)강의의 뒷부분에서 application.properties에설정을 다 한 후에 테스트를 돌리면와 같은 에러가 뜹니다.코드는 아래와 같이 재확인했구요.그래서 설정파일을 설정을 변경해봤습니다.우측 상단의 edit configurations.. 에서 원래대로 비워두고 설정한 후에,메인컨테이너는 아래 같이 잘 뜨는데 테스트는 실패합니다.아래 (local) 설정을 하고 설정파일도(application-dev.properties)로 하고 dataSource내용 다 기입후 설정을 아래같이 해도 안됩니다.설정파일을 못 찾아서 dataSource 를 주입 못 받는 것 같습니다.application.properties에 first.name=hi 라고 한 후테스트에서@Value(value = "${first.name}")private String name; 후에 name을 찍어봐도 null로 게속 나옵니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
lock 이 걸리는 시점에 대한 의문
강의를 듣던중 궁금한 점이 생겨 질문드립니다.아래의 코드는 MemberServiceV2의 두 함수 입니다.public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); // ! 트랜잭션 시작 // * 비즈니스 로직 bizLogic(fromId, toId, money, con); con.commit(); // * 성공시 commit } catch (Exception e) { con.rollback(); // ! 실패시 rollback throw new IllegalStateException(e); } finally { release(con); } } private void bizLogic(String fromId, String toId, int money, Connection con) throws SQLException { Member fromMember = memberRepository.findById(toId, con); Member toMember = memberRepository.findById(toId, con); ---<다른 db 커넥션에 의해 침범될 수 있는 구간>--- memberRepository.update(fromId, fromMember.getMoney() - money, con); validation(toMember); memberRepository.update(toId, toMember.getMoney() + money, con); }트랜잭션을 사용하기 위해서 con.setAutoCommit(false) 를 사용하고 있는데,강의를 듣고 이해한 내용에 의하면, accountTransfer에 의해서 db에 요청되는 sql 쿼리는 총 4개입니다.memberRepository.findById -> select 문 (2번)memberRepository.update -> update 문 (2번)그런데, select for update가 아닌 select문은 선택된 row에 대해 lock을 걸지 않기 때문에, 위의 코드에 적어놓은 것 처럼 update문이 수행되기 전에 다른 db 세션에 의해서 동일한 데이터가 수정될 여지가 있는 것 같아 보입니다.(update 문이 수행될 때 lock이 걸리는게 맞다면)그럼, findById 함수 내의 sql문을 select for update로 변경하거나, 코드에 적어놓은 select문과 update 문 사이에 또다른 lock을 설정해주어야하는 건가요? + 만약, 또다른 lock을 설정해야한다면 어떻게 해야하나요? P.Shttps://www.inflearn.com/questions/653523아래의 유사한 질문을 발견했는데, 해당 질문의 답변만으로 충분히 이해가 되지 않아서 추가적으로 질문드린 것입니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
@Autowired
안녕하세요 항상 좋은 강의 감사드립니다. 영한님. MemberServiceV3_3Test 에서 필드 주입을 하잖아요?@Autowire 으로 MemberRepositoryV3, MembrerServiceV3_3 를 주입받는데요. 그런데 정작 MemberRepositoryV3 클래스와MembrerServiceV3_3는 Bean으로 등록되어 있지 않은데(@Component로 등록X) 어떻게 주입을 받아서 사용하는 것인가요? DI 중에서 필드주입(@Autowired)는 생성자 주입과 달리 미리 Bean으로 등록해서 주입을 해주기 때문인가요? (그런데 그렇다 하더라도 일단 @Component로 등록 자체가 안되어 있는데 의문이 듭니다) 미리 감사드립니다.