30%
53,900원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
Controller 안에서 @Transaction 설정이 다른 2개의 method 호출
@Slf4j @RestController public class AController { @Autowired AService aService; @Autowired BService bService; @PostMapping("/api/v2/aaaa") public ResponseEntity<ResponseDto> postA( @RequestBody @Valid PostADto postADto, HttpServletRequest request) throws Exception { A a = aService.getA(request); HashMap<String, Object> result = bService.createB(postADto, a); .... }위 와 같이 컨트롤러에서 aService.getA(request); 와 bService.createB(postADto, user); 메서드를 호출합니다.각 메서드는 아래와 같이 선언돼있습니다.@Transactional(readOnly = true) public A getA(HttpServletRequest request) { .... return aRepository.findById(id).orElse(null); }@Transactional public HashMap<String, Object> createB(PostADto postADto, A a) { ...... bRepository.save(postADto.toB()); ...... return ...; }getA 메서드안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly(); log 출력했을때 readonly = true로 나오고 readDB로 잘 연결됩니다. 하지만 createB 메서드안에서 TransactionSynchronizationManager.isCurrentTransactionReadOnly(); log 출력했을때 readonly = false로 나오는데 실제로는 readDB로 연결되고 query를 발생시켜 아래와 같은 오류가 발생합니다.Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) Caused by: java.sql.SQLException: The MySQL server is running with the --read-only option so it cannot execute this statement 컨트롤러에 @transactional 을 선언하지 않았기 때문에 각 메서드에서 트랜잭션이 수행되어 getA 메서드에서는 readDB로 createB 메서드에서는 writeDB로 요청이 된다고 알고 있었는데 그런 방식으로 동작이 안되 혼란스럽습니다. 어떤 이유로 이런 문제가 발생하는지 궁금합니다. 그리고 왜 이렇게 동작하는지 어느 부분을 학습하면 좋은지 궁금합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Transactional 내부에서 트랜젝션 템플릿이 사용되나요
@Transactional 내부에서도 결국 트랜젝션 템플릿을 사용해서 트랜젝션 처리를 하는지 궁금합니다!
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
14:18에서 AopCheck() 테스트하는 부분 질문드립니다
@Test void AopCheck() { log.info("memberService.class={}", memberService.getClass()); log.info("memberRepository.class={}", memberRepository.getClass()); }테스트를 실행하면 memberService.getClass()에 해당하는 부분만 CGLIB~~이 적용된, 즉 AOP가 적용된 인스턴스라는 것을 확인할 수 있었습니다. memberRepository.getClass()는 평범한 인스턴스이고 memberService.getClass()만 AOP가 적용된 인스턴스인 이유는 추측건대 @Transactional // proxy가 비즈니스 로직 대신 호출. 성공하면 commit, 런타임 예외가 터지면 rollback public void accountTransfer(String fromId, String toId, int money) throws SQLException { bizLogic(fromId, toId, money); }MemberService내의 메서드에 @Transactional이 붙어서인 것 같습니다. 클래스 레벨에 @Transactional을 붙이지도 않았는데도 클래스 정보를 가져오는 메서드인 getClass()를 통해 AOP가 적용된 인스턴스로 확인되는 이유가 궁금합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
강의 4:50에서 커넥션 풀 고려하는 부분 질문드립니다
리소스 정리에 관련해서 질문드립니다. con.close()의 경우, 커넥션 풀을 사용하는 커넥션일 때 close()시에 커넥션 종료가 아닌 커넥션 풀로 다시 반환된다는 것으로 이해했습니다. 그런데 con.setAutoCommit(true)로 되돌릴 때 커넥션 풀을 고려해야한다는 부분이 이해가 가지 않아서 질문드립니다. 커넥션 풀과 상관없이 오토커밋은 true로 바꿔야하는 것 아닌가 해서요. +추가 질문: 개발자가 트랜젝션 매니저를 이용한 트랜젝션을 구현한다면 따로 위의 두가지 코드를 작성해줄 필요가 없는 것 맞는가해서 질문드립니다.(ServiceV2에서의 finally 구문을 ServiceV3_1에서는 생략한 것과 같은 맥락으로) 친절한 답변 항상 감사드립니다
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
AopCheck() 로그가 강의와 다릅니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. memberService 부분의 로그가강의에 나온 'EnhancerBySpringCGLIB..'부분으로 나오지않고 SpringCGLIB로만 나옵니다. 오류가 나지는 않는데 강의와 동일하게 적용이 되고 있는지 궁금합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
리소스 동기화 == 트랜젝션 동기화 인가요?
트랜젝션 매니저 설명해주시는 부분의 PDF 내용을 보다보니 리소스 동기화와 트랜젝션 동기화라는 용어가 같은 내용(같은 트랜젝션 내에서 커넥션을 동일하게 유지)을 지칭하는 것 같아서 질문드립니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DELETE문 테스트 하는 부분 질문드립니다.
항상 강의 잘 듣고 있습니다 🙂다름이 아니라 이번 강의에서는 이전에 배웠던 assertThrows를 사용하시지 않고 assertThatThrownBy를 사용하셨는데 이 둘은 결국 하는 일이 같은 것이 아닌가 해서 질문드립니다. 강사님께서 강의 중 작성하신 코드와 제가 작성한 기존의 assertThrows를 이용한 코드가 정확히 같은 것이 맞는가해서 질문드립니다.// 강사님 (assertThatThrownBy) assertThatThrownBy(() -> repository.findById(member.getMemberId())).isInstanceOf(NoSuchElementException.class); // AssertThrows (내 버전) assertThrows(NoSuchElementException.class, () -> repository.findById(member.getMemberId()));
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
SQLException 질문
Service코드가 JDBC에 의존적이라 스프링이 제공하는 PlatformTransactionManager 인터페이스에 의존하게 바꿨는데 그러면 SQLException 예외도 없어도 되나요 ?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
connection total 개수에 대한 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @Testvoid dataSourceConnectionPool() throws SQLException, InterruptedException {//커넥션 풀링 : 히카리 풀 사용 HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(URL); dataSource.setUsername(USERNAME); dataSource.setPassword(PASSWORD); dataSource.setMaximumPoolSize(10); //pool사이즈 최대 지정 dataSource.setPoolName("MyPool"); //pool이름 설정 useDataSource(dataSource); Thread.sleep(1000); //pool에 추가하는 것까지 log로 확인하기 위해서 지연시간 추가} 다음과 같이 코드를 작성하였는데 My Pool의 개수가 강의에서와 다르게 설정됩니다.setMaximumPoolSize을 10으로 맞췄는데도 다른 이유가 무엇인가요? Thread.sleep(1000);을 1000 -> 10000으로 늘리니 활성화되는 커넥션이 늘어나던데 이 시간과 관련있는건가요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
Checked, Unchecked 예외 변환 질문드립니다.
안녕하세요. 복습 도중 개념적으로 혼동이 와서 질문드립니다.Checked Exception - 체크를 하라고 만든 예외Unchecked Exception(Runtime Exception) - 체크를 하지 말라고 만든 예외예를 들어서 NullPointerException 같은 경우, 개발자가 예외를 잡아서 처리하지 않습니다.런타임 예외는 원래 처리하지 않기 때문에 당연하다고 생각합니다.그런데 체크를 하라고 만든 예외를 체크를 하지 말라고 만든 예외로 변환을 하는 것이 개념적으로 이해가 잘 가지 않습니다.Checked 예외를 Unchecked 예외로 변환함으로써Unchecked는 체크를 하는게 아닌데, 마치 Checked 처럼 핸들링 하는 느낌이 듭니다.물론 강의에서 설명해 주신 변환을 함으로써의 이점은 이해가 잘 갑니다!throws SQLException → throws JPAException반복적인 throws 을 변경하지 않아도 되고, 특정 기술에 의존하지 않아도 됨다만, 이는 커스텀 Checked 예외를 사용해도 해결할 수 있다고 생각합니다.public class MyCustomCheckedException extends Exception { ... }Checked 예외를 커스텀 Checked 예외로 변환 이 경우에는 반복적인 throws 작성은 피할 수 없긴 합니다.코틀린 등의 언어에서 이런 개념적 혼동을 막기 위해 Checked/Unchecked를 나누지 않는 것인지..제가 무언가 잘못 이해하고 있는것이 있을까요?
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 시작 및 종료 관련 질문 있습니다!
안녕하세요 강의 듣다가 제가 이해한 게 맞는지 확인 차 질문 드립니다!시작 : 서비스 계층에서 getTransaction()을 통해 트랜잭션을 시작하면 트랜잭션 매니저에서 커넥션을 생성하여 DB 트랜잭션을 시작한다.종료 : 서비스 계층에서 commit() 혹은 rollback()을 통해 트랜잭션을 종료하면 동기화 매니저에서 커넥션을 꺼내와 DB 트랜잭션을 커밋 혹은 롤백한다.라고 설명해 주셨는데, 여기서 트랜잭션 매니저의 getTransaction(), commit(), rollback()은 DB에 직접 영향을 미치지 않고, 커넥션을 트랜잭션 용으로 동기화 혹은 종료시키는 역할인가요? 그렇다면 실질적으로 DB 상에서 트랜잭션을 시작하고, 커밋이나 롤백을 수행하여 반영하는 로직은 DataSourceTransactionManager 내부에 있나요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DataSourceUtils.releaseConnection이 하는 역할에 대해 질문있습니다.
V2까지는 release(con)을 통해 autocommit=true를 진행해줬는데 V3부터는 이 역할을 DataSourceUtils.releaseConnection이 커넥션을 반환하는 것과 동시에 autocommit=true를 담당하는 것이 맞는지 궁금합니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
V0 -> V1으로 전환되는 과정에서 궁금한 점이 생겼습니다.
MemberRepositoryV0에서 직접 만든 DBConnectionUtil을 getConnection을 통해 Connection정보를 가져오는 것인데, 이를 V1에서는 직접 만든 DBConnectionUtil을 dataSource로 변경하고 실제 테스트에서 BeforeEach를 통해 Connection 정보를 주입하는 것인가요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 DB 테스트 코드 실행시 무한 로딩 연결 안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.테스트 코드 실행시 무한 로딩 미해결 3일차 해결 방법이 필요합니다.package hello.jdbc.connection; public abstract class ConnectionConst { public static final String URL = "jdbc:h2:tcp://localhost/~/study/test"; public static final String USERNAME = "sa"; public static final String PASSWORD = "1318!"; }
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
TestConfig{ public TestConfig(DataSource datasource)}
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예@TestConfigurationstatic class TestConfig {private final DataSource dataSource;public TestConfig(DataSource dataSource) {this.dataSource = dataSource;}자동화부분에서 static 클래스인 TestConfig를 생성자로 다시 호출하는데 이렇게 하는 이유와 되는 알고리즘이 무엇인지 궁금합니다.
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Test void connection() { Connection connection = DBConnectionUtil.getConnection(); assertThat(connection).isNotNull(); }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.H2 DB 연결확인후 테스트 코드 package hello.jdbc.connection; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.Connection; import static org.assertj.core.api.Assertions.assertThat; @Slf4j class DBConnectionUtilTest { @Test void connection() { Connection connection = DBConnectionUtil.getConnection(); assertThat(connection).isNotNull(); } }실행시.무한 러닝 응답없음 터미널 창 상태mone@moneui-MacBookAir bin % ./h2.sh [14.589s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 2048k, guardsize: 16k, detached.[14.590s][warning][os,thread] Failed to start the native thread for java.lang.Thread "H2 TCP Server (tcp://localhost:9092) thread-2006"Exception in thread "H2 TCP Server (tcp://localhost:9092)" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reachedat java.base/java.lang.Thread.start0(Native Method)at java.base/java.lang.Thread.start(Thread.java:798)at org.h2.server.TcpServer.listen(TcpServer.java:273)at org.h2.tools.Server.run(Server.java:647)at java.base/java.lang.Thread.run(Thread.java:829)6시간 삽집...
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2 설치과정 시작 부터 막혀서 몇일째 진도가 막혔습니다....
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.답답합니다.... 원격 지원 이런게 있으면 좋겠습니다..일과 다 마치고 강의 시간 쪼개서 겨우 보려는데 올드버전 강의를 계속 판매하고 있지만 그에 비해 좀 영상제작 당시 버전과 많이 다른 부분을 찾아 헤매는 수강생들이 자주 보이고 영상 10분을 보려고 설정 안 되는 걸 찾아 2~3시간 낭비 할 때가 가장 아쉽네요... 다만 강의 내용은 만족스럽습니다. 여전히 해결이 안되고 있어 그냥 의견을 올려봅니다..
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 궁금증
@Transactional public void writeDelete(int id) { writeRepository.deleteById(id); } //위에는 서비스 계층입니다 아래는 데이터 접근 계층입니다 public void deleteById(int id) { try { String sql = "delete table member where id=?"; template.update(sql, id); sql="aaaa"; template.update(sql); } catch (DataAccessException e) { throw new RuntimeException(e); } }Q. 이상태에서 실행해봤는데 왜 롤백이 안될까요?? 테스트 코드에서 실행한건 아닙니다.
- 해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
ThreadLocal 관련해서 궁금한사항이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]커넥션풀 사용 상황에선쓰레드 로컬을 사용해서 커넥션을 동기화 해준다고 했는데 그러면 생성하게되면 일반적으로 쓰레드 갯수와 커넥션 갯수가 일치하거나 혹은 쓰레드갯수가 더많다 라고 이해하면될까요?
- 미해결스프링 DB 1편 - 데이터 접근 핵심 원리
트랜잭션 매니저 관련해서 궁금한사항이있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]만약에 트랜잭션 매니저를 본인이 직접만든다고했을때엔 빈 스코프 단위를 웹스코프 단위로 보통 설정하나요?