평소 열심히 강의를 듣고 있는 일반적인 대학생입니다. 트랜잭션 동기화 매니저에 대해 의문사항이 많아 직접 찾아보다가 강의와 다른점이 있어 질문드립니다. 아직 부족한 학생인만큼 어느정도의 뇌피셜은 들어있습니다.. (물론 코드에 기반한) 질문은 가독성을 위해 음슴체를 사용한점 양해부탁드립니다.. 결론 트랜잭션 rollback-only 은 트랜잭션 status에 있으며 해당 사실 확인은 TransactionManager에 의해 밝혀진다. 따라서, rollback-only 표시가 동기화 매니저에 있다는 설명은 수정이 필요한 것 같습니다.. -> 트랜잭션 동기화 매니저는 관련이 없는 것 아닌가 라는 생각이 듭니다.. 그 이유는 아래와 같습니다. 강의제공 내용 내부 롤백이 일어나면 Rollback-only 표시가 됨 외부 커밋은 해당 표시를 보고 true라면 롤백 해당 표시는 트랜잭션 동기화 매니저에 있음 (08:18 쯤) 고민하다가 의문이 든 내용 트랜잭션 동기화 매니저는 쓰레드(요청)마다 적절한 트랜잭션을 찾아 주는 역할이라고 생각함 -> 트랜잭션의 상태를 관리하도록 하진 않을 것 같다는 생각이 듦 (뇌피셜) 트랜잭션 매니저를 보다보니 getTransaction 을 호출하면 Status를 반환함 -> 가만 생각해보면 트랜잭션 commit rollback을 트랜잭션 매니저가 하는데 상태관리도 트랜잭션 매니저가 하는게 맞지 않을까? (rollback-only 표시도 트랜잭션 매니저가 하는게 맞지 않을까?)라는 생각을 하게됨 코드를 까보니 실제로 해당 메서드로 추정되는 메서드가 있음 실제 코드 JpaTransactionManger protected void doSetRollbackOnly(DefaultTransactionStatus status) { JpaTransactionObject txObject = (JpaTransactionObject)status.getTransaction(); if (status.isDebug()) { this.logger.debug("Setting JPA transaction on EntityManager [" + txObject.getEntityManagerHolder().getEntityManager() + "] rollback-only"); } txObject.setRollbackOnly(); } 위의 코드는 내부적으로 사용하는 코드인 것 같음 (뇌피셜, 이 코드가 동작하는 것이 아닌가) 또한 아래와 같은 메서드도 존재함 public void setRollbackOnly() { EntityTransaction tx = this.getEntityManagerHolder().getEntityManager().getTransaction(); if (tx.isActive()) { tx.setRollbackOnly(); } if (this.hasConnectionHolder()) { this.getConnectionHolder().setRollbackOnly(); } } public boolean isRollbackOnly() { EntityTransaction tx = this.getEntityManagerHolder().getEntityManager().getTransaction(); return tx.getRollbackOnly(); } 아마 전자가 실제로 TransactionManager가 활용하는 코드인 것 같음 (protected라서), 후자는 외부에서 임의로 rollback-only를 설정할 때 사용하는 메서드인 것 같음 (EntityTransaction은 더 들어가보니 hibernate에서 트랜잭션을 관리하는 클래스인 것 같음) DataSourceTransactionManager 해당 매니저에도 비슷한 메서드가 존재함 public void setRollbackOnly() { getConnectionHolder().setRollbackOnly(); } @Override public boolean isRollbackOnly() { return getConnectionHolder().isRollbackOnly(); } 런타임 디버깅을 돌려보며 정확히 어떤 메서드가 동작하는 지 확인해봄. 아마도 aop로 프록시 객체가 사용되는 것 같은데 aop 부분은 아직 학습하지 않아서 모르겠음.. AbstractPlatformTransactionManager -> datasourceTransactionManger의 doSetRollbackOnly 호출 위와 같은 코드를 보았을 때, rollback-only와 같은 트랜잭션의 상태는 트랜잭션 매니저에 의해 관리 되는 것 같고 트랜잭션 동기화 매니저는 관련이 없는 것 아닌가라는 생각이 듭니다..
build.gradle에 추가했고 properties에 추가했는데 안됩니다....! ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.
build.gradle랑 다 추가하고 업데이트해서 적용되게 했는데 오류가 나는데 어떻게 해야되나요? ㅜ ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.
[질문 내용] 따로 주석 설명을 달긴 하였지만, Order 엔티티에서 OrderItem 엔티티를 영속성 전이 ALL로 설정을 해놓았으면 굳이 em.persist(orderItem)을 생략해도 잘 동작되는 거죠? 추가 질문) 위 2개 이미지에서 보시면 첫번째 사진은 em.persist(orderItem)을 생략했을때 나온 쿼리문이고 두번째 사진은 생략하지 않을 때 나오는 쿼리문인데 왜 update 쿼리가 나가는 건지 잘 이해가 안돼서 여쭈어 봅니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] HomeController.java 와 home.html을 다 작성하고 localhost:8080으로 실행하려고 하니 HomeController.java가 실행이 안됩니다. 인터넷에는 src를 리소스 루트로 지정하고 하면 된다고 해서 리소스 루트로 src를 지정하고 첫 번째 사진과 같이 파일 위치를 지정하는 부분에서 계속 없다고 뜨는데 어떻게 해야하나요?
int arr[3][3] 은 3x3 행렬이라 이렇게 그려지는 것은 이해했습니다. int arr [3][3] arr[0] = [1, 2, 3] arr[1] = [4, 5, 6] arr[2] = [7, 8, 9] 여기에서 arr[0] 을 100번지 주소, arr[1]을 200번지 주소, arr[3]을 300번지 주소라고 가정을 해보겠습니다. 이때 int parr[2]가 강사님께서 말씀하신게 포인터 두개를 담은 배열이라고 하셨는데 이 부분이 잘 이해가 안가서요. 포인터 두개를 담은 배열이라고 하신다면 int parr[2]에는 arr[1] 이라는 200번지 주소, arr[2] 이라는 300번지 주소가 담긴거고, 이때 parr을 행렬로 만들게 되어서 parr은 다음과 같이 되어서 정답을 유도하게 되는건가요? int parr [2][3] parr[0] = [4, 5, 6] parr[1] = [7, 8, 9]
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 해당 강의처럼 인터셉터 두개를 사용하여 요청을 했더니 인터셉터가 계속 호출되는 오류가 발생하였습니다. 오류의 원인은 LoginCheckInterceptor의 exclude pattern에 /login 경로를 추가하지 않아 발생한 것이었습니다. 교안과 비교하며 주먹구구식으로 해결하였지만 능동적으로 해결하기 위해서는 어떤 과정을 거쳐야 하나요? 처음에는 두 인터셉터에 브레이크포인트를 찍어 디버깅 하려 했지만 여러 복잡한 코드들을 마주하게 되더라구요.. 어떻게 이런 오류를 해결해야 하나요?
학습하는 분들 께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 콘솔창에 warn이 뜨지 않습니다. 스프링을 먼저 실행한 후에 http://localhost:8080/hello-mvc 에 들어가서 오류가 나와도 콘솔창에 warn이 나오지 않습니다. 어떻게 해야할까요?
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 안녕하세요~! 10.Pub -Sub모델을 이용한 실시간 알림 (WebSocket, STOMP 이용) part 1 해당 자료가 다운이 되지 않습니다!
[질문 내용] 즉시 로딩과 지연 로딩 영상에서 문득 지난 강의 과정에서 연관관계의 주인인 필드 객체는 @JoinColumn 에 name으로 TEAM_ID로 외래키로 지정하여 연관관계를 매핑시키는걸로 알고있는데 1분 3초 쯤에 김영한 강사님의 코드에서는 그냥 @JoinColumn만 되어있고 따로 name은 부여하지 않은걸로 보였습니다. 굳이 name을 따로 지정하지 않아도 상관없는 건가요?
안녕하세요 초기 egov에서 받을 때 최신인 5.3.6버전을 받아서 그런지 초기 DataSourceTest에서 @RunWith는 jUnit4버전을 가리키고 저는 5.3.6버전의 spring을 이용했어서인지 SpringJunit4ClassRunner.class가 import 되지 않아 난항을 겪던 중 pom.xml의 버전을 강사님처럼 5.0.7 RELEASE 버전으로 수정하면서 chat gpt의 도움을 받아 DataSourceTest의 테스트를 실행할 수 있었습니다. 그러나 console에서 연결이 되었다는 메세지도 없으며 이를 이상하게 여기고 root-context.xml에 기입된 비밀번호를 강사님처럼 일부러 틀리게 한 후 실패를 기대한 상태로 run을 돌렸지만, jUnit에 Failures가 뜨지도 않습니다.. 혹시 이런 경우에도 방법이 있을까 하여 코드도 함께 첨부합니다.. (pom.xml은 다른 글에 올려주신 참고 블로그의 것을 인용했습니다.) [pom.xml] => 10000자를 올릴 수 없다하며 노션 링크를 첨부하겠습니다! https://devfighting.notion.site/18410212999180b5b0a9cd4ada3a6a58?pvs=4 [console결과, jUnit 결과] [maven dependencies]
안녕하세요 수강중에 놓친 내용이 있는 것 같아서 질문 드립니다 @Configuration public class DataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .build(); } @Bean public PlatformTransactionManager transactionManager(DataSource emf) { return new DataSourceTransactionManager(emf); } } componentScan 패키지 영역 내에서는 Bean Context에 등록된 Bean 객체면 Parameter로 전달받아서 사용할 수 있는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] @PostMapping("/logout") public String logout(HttpServletResponse response){ expireCookie(response, "memberId"); return "redirect:/"; } 로그아웃 구현시 expireCookie메소드를 생성 후 두번째 인자로 들어가는 memberId를 어떻게 가져오는건지 궁금합니다. logout메소드 생성시 인자로 추가한것도 아닌데 .. 스프링컨테이너가 클라이언트에서 요청시 쿠키정보에 memberId라는 쿠키이름이 있으면 가져오게 되어있는건가요?
테스트 코드 작성중 Assertions에 org.assertj.core.api가 안보입니다 어떻게 해야되나요? ㅜ ㅜ ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.