묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
readonly 트랜잭션에 update를 수행하는 분리된 트랜잭션 메서드를 호출 할 때 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]안녕하세요 영한님이번에 트랜잭션 적용하면서 @Transactional(readOnly = true) 가 붙은 조회 메서드 내부에 @Transactional(propagation = Propagation.REQUIRES_NEW)가 붙은 외부 클래스의 메서드가 사용 될 때물리 트랜잭션이 분리되었고 각각 다른 트랜잭션임에도변경감지가 적용안되는 부분이 궁금했습니다.아래는 궁금한 부분에 대한 테스트를 진행한 코드입니다. @Service @RequiredArgsConstructor public class TeamService { private final TeamRepository teamRepository; private final TeamExternalService externalService; @Transactional(readOnly = true) public Team findTeamWithNameChangeExternal(Team team, String name) { Team findTeam = teamRepository.findByName(team.getName()); externalService.changeName(findTeam, name); return findTeam; } } @Service @RequiredArgsConstructor public class TeamExternalService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void changeName(Team findTeam, String name) { findTeam.setName(name); } } @Test void findTeamWithNameChangeExternal() { Team team = new Team("team"); Team savedTeam = teamRepository.save(team); teamService.findTeamWithNameChangeExternal(savedTeam, "changeName"); Team findTeam = teamRepository.findByName("changeName"); assertThat(findTeam.getName()).isEqualTo("changeName"); }같은 클래스에서 내부 호출 할 경우에는 REQUIRES_NEW를 적용하더라도 같은 프록시 객체로 해당 메서드가 호출된 상위 트랜잭션의 옵션을 그대로 따라 가기 때문에 변경 감지가 적용안된다고 생각했어요 하지만 이와 다른 외부 클래스의 분리된 트랜잭션에서는 변경 감지가 일어나는 것이 정상이라고 생각했는데왜 변경 감지가 일어나지 않는 것일 까요 ..? 아래는 궁금해서 디버그를 찍어봤어요보니가 두 트랜잭션의 번호가 Transaction@13592로 같고 REQUIRES_NEW가 적용된 트랜잭션의 경우에는 oldTrasactionInfo 이라는 정보를 갖고 해당 메서드를 실행하는 @Transactional(readOnly = true)옵션이 적혀있더라구요 ??그렇다면 내부 호출이 아닌 외부 호출이라도readOnly = true로 조회 성능을 챙기면서 변경 감지를 사용할 순 없는 것인가요 ??
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 최적화 테스트 중 트랜잭션에 관하여 질문
지금 주문 조회 최적화 테스트에서 @트랜잭션 어노테이션을 안붙히고 사용 중인데조회 최적화만 해서 안붙힌건가요? 만약에 insert 나 update 테스트를 했더라면 commit을 해줘야 하기 때문에 @트랙잭션을붙혀야 되는거죠.?
-
미해결
트랜잭션 전파 속성 REQUIRES_NEW 관련 질문
안녕하세요 트랜잭션 관련해서 질문이 있어서 글을 남깁니다.트랜잭션매니저 2개(Jpatxmanager, datasourcetxamanger)를 만들어서 테스트 중입니다. 1개는 전반적인 일반 비지니스 로직에 적용되는 트랜잭션 매니저이고, 다른 1개는 API 호출시 관련 데이터를 DB에 저장하는 로직에 사용되는 트랜잭션 매니저입니다.파일에 다음과 같이 선언 되어있습니다. //로그 저장 하는 메소드 호출시 관리하는 트랜잭션매니저 <bean id="logTxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="egov.dataSource"/> </bean> <tx:advice id="logTxAdvice" transaction-manager="logTxManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRES_NEW" rollback-for="Exception"/> </tx:attributes> </tx:advice> ... aop config 생략 //JPA트랜잭션매니저를 커스터마이징 한 트랜잭션매니저 <bean id="nbpmTxManager" class="com.nkia.itg.nbpm.common.NbpmTransactionManager" /> <tx:advice id="nbpmTxAdvice" transaction-manager="nbpmTxManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" /> </tx:attributes> </tx:advice> 실행 순서는 다음과 같습니다.1. A라는 비지니스 로직이 실행된다(A 트랜잭션매니저, 트랜잭션 전파 : REQUIRES)2. B라는 로직(API 관련 데이터 저장)이 실행된다(B 트랜잭션매니저, 트랜잭션 전파 : REQUIRES_NEW)제가 기대한 바로는 API 데이터 저장 메소드가 호출되면 새로운 db 커넥션을 획득해서 별도의 트랜잭션으로 관리 되는 것이었는데, 테스트를 해보니까 같은 커넥션을 공유하는것같습니다. A라는 비지니스 로직이 실패해서 예외가 발생해도 API관련 데이터 저장 로직에 영향을 주지 않기 위해서 별도로 분리하려고합니다.제가 한 테스트 결과는, A 비지니스 로직(특정 테이블에 데이터 INSERT) 호출 하고 B라는 비지니스 로직(API 데이터 INSERT) 호출 후 B 메소드가 종료되고 COMMIT을 하면 A 로직에서 INSERT한 데이터도 COMMIT이 됩니다. 즉, REQUIRES_NEW 전파속성이 실행되지않는것같습니다.예시)finally { B();}원인은 도저히 모르겠습니다 .. 답변 부탁드립니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
DatasourceManager와 JpaTransactionManager 혼용
안녕하세요 강의를 듣다가 궁금한것이 생겨서 질문 남깁니다.강의 중간에 영한님께서, DatasourceManager와 JpaTransactionManager 를 함께 사용 하는 경우, JpaTransactionManager를 등록한다고 하셨고 그 이유에 대해서는 JpaTransactionManager가 DatasourceTransactionManager가 제공하는 기능의 대부분을 지원한다고 하셨습니다.현재 개발 중인 프로젝트에서 myBatis와 JPA 두 가지를 사용하고 있어서 위 두 개의 트랜잭션 매니저를 사용 하고 있는데, 각 다른 트랜잭션 이 서로 호출하게 되면 Transaction Conflict 라는 에러가 발생해서 현재 말씀하셨던것 처럼 JpaTransactionManager 하나로 사용하려 합니다.영한님께서는 대부분의 기능을 지원 한다고 하셨는데, 그렇다면 혹시 그 일부 지원하지 않는 기능에는 예를 들어 어떤 것들이 있을 수 있고, 혹시 발생 가능성이 있는 잠재적인 이슈가 있는지 궁금해서 질문을 남깁니다.감사합니다
-
미해결
Datasource와 JPA를 같이 사용 할 경우 트랜잭션매니저
안녕하세요 스프링 데이터 접근 기본 1편 에 강의 내용 중 JpaTransactionManager와 DatasourceTransactionManager를 같이 사용할 경우 JpaTransactionManager 를 사용하면 된다고 하셨는데 관련해서 궁금한 것이있습니다. Jpa와 myBatis를 같이 사용 할 경우 반드시 JpaTransactionManager를 사용해야 하는지 궁금합니다. 현재 JBPM 이라는 오픈소스를 근간으로 하는 솔루션을 개발 중인데 해당 오픈소스 엔진영역은 JPA를 사용하고 나머지 Service class에는 myBatis를 사용 중입니다. 현재 직면하고있는 문제는 일반 서비스 클래스에서 DatasourceTransactionManager로 트랜잭션이 이어지는 중에 JpaTransactionManager를 사용하고 있는 클래스를 호출 하게 되면 JpaTransactionManager 의 getTransaction() 메서드에서 unable to begin transaction 이라는 에러가 발생합니다. 현재 AOP 로 일괄적으로 2개의 트랜잭션매니저를 사용 하고 있는데, AOP DatasourceTransactionManager 를 주석 처리 하니까 에러가 발생하지 않습니다. 2개의 트랜잭션매니저를 사용해서 발생하는 문제 일까요? 그렇다면 JpaTransactionManager 하나만 사용하면 될까요 ?영한님 께서 트랜잭션이 시작되면 TransactionManager에서 커넥션을 생성하고 쓰레드로컬에 해당 커넥션을 저장한다고 하셨는데, 2개의 트랜잭션 매니저를 사용해서, A 라는 트랜잭션매니저를 사용하고있는 메서드에서 B라는 트랜잭션매니저를 사용하는 메서드를 호출하면, 2개의 커넥션이 생성되는 것인가요 ?
-
미해결스프링 핵심 원리 - 기본편
@Transactional 안에서 외부 서비스 api call 관련 질문있습니다.
@tranactional 이 붙은 메소드 안에서 외부 서비스 api를 call 해야하는 상황이 있는데컨트롤러 단에서 로직 분리가 힘든 상황입니다. @tranactional 이 붙은 메소드 안에서 아래와 같이 TransactionSynchronizationManager를 선언하고 override한 aftercommit 내부에서 호출하게 될 경우마찬가지로 외부 서비스 api에 장애가 발생했을 때도 본 서비스에 장애로 이어질 수 있을까요?? TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { // 여기서 외부서비스 api 호출 } });
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
강의의 롤백 커밋 기준에 대해 추가로 궁금한 점이 있습니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이전 강의 예외와 트랜잭션 커밋, 롤백 - 기본에서 예외 발생시 트랜잭션 내부에서 예외를 처리하지 못하고, 트랜잭션 범위 밖으로 예외를 던지면,스프링은 기본적으로언체크 예외 = 롤백체크 예외 = 커밋 한다고 배웠습니다.그리고 본 강의 활용에서 체크 예외와 언체크 예외를 통해 커밋과 롤백이 되는 것을 확인할 수 있었는데요.여기서 제가 궁금한 것은 일단 언체크 예외도 명시적으로 던지지 않아도 catch 해서 처리할 수 있다고 알고 있습니다.그러면 스프링이 언체크 예외를 롤백시키는 기준이 트랜잭션 내에서 언체크 예외를 처리하지 못하고 범위 밖으로 던졌을 때에만 롤백하는 것인가요?즉, 해당 트랜잭션 내에서 언체크 예외를 잡아서 처리하면 트랜잭션 범위 밖으로 언체크 예외가 던져졌기 않았기 때문에 해당 트랜잭션이 롤백되지 않고 커밋 되나요?예를 들어 아래의 코드와 같이 트랜잭션은 OrderService의 order() 메서드에서 실행되고, couponService를 통해 주문한 고객에게 쿠폰을 1개 우선 발행한 뒤에, 해당 트랜잭션 내에서 orderRepository.save 를 통해 DB에 주문이 저장됩니다.(주문을 먼저 완료하고 쿠폰을 발행 해야겠지만 제 질문 상황의 명확성을 위해 예시를 이렇게 했습니다.)하지만 orderRepository.save()메서드 실행 도중 DB에 문제가 생겨 Order가 DB에 정상적으로 저장이 되지 않아 Exception이 발생하였고 (언체크 예외) 해당 예외를 잡아서 처리했습니다. 그러면 해당 트랜잭션 밖으로 던져지는 예외는 존재하지 않으며 정상흐름대로 동작합니다. 이 경우 해당 트랜잭션은 롤백되는 것인가요 아니면 커밋되는 것인가요? 1번 질문에서 정상 흐름으로 바뀌었기 때문에 커밋이 된다고 하면,만약 RuntimeException을 잡아 체크 예외로 변경해서 해당 트랜잭션 범위 밖으로 던질 경우도 동일하게 커밋이 되는건가요?@Transactional public void order(Order order) { couponService.giveCoupon(order.getUserId)); try { orderRepository.save(order); } catch (RuntimeException e) { // Exception을 잡아서 처리하는 로직 } }
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
트랜잭션에 관한 질문드립니다!
안녕하세요. 강의를 다시 보던 중 궁금한 점이 있어 질문드립니다! await getConnection().createQueryRunner()는 네스트 패턴이 아니라서 private connection:Connection을 써야한다고 말씀하셨는데 전자를 사용을 해도 상관은 없는 것인지 궁금합니다.(typeorm이 0.3 밑 버전입니다!) queryRunner.connect();가 없어도 정상적으로 코드가 작동하고 있는데 위 코드는 없어도 되는것인지, 써야한다면 무슨 동작을 하고 있는 것인지 궁금합니다!
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 전파 시 체크 예외를 활용한 복구 처리 관련 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지 되어야 한다." 이 요구사항을 만족하기 위한 방법1.2 이외에 체크 예외를 활용하는 방법3 관련 문의입니다.방법1. REQUIRES_NEW로 선언해서 물리 트랜잭션 분리방법2. MemberFacade 구조를 사용하여 물리 트랜잭션 분리방법3. 체크 예외를 던져서 오류 관련 내용 커밋(9.스프링 트랜잭 션 이해 / 예외와 트랜잭션 커밋, 롤백 - 활용)질문. 체크예외를 활용하면 코드에 명시적으로 오류 상황에 대 한 처리를 할 수 있어서 개발자가 오류를 코드 레벨에서 인지할 수도 있고 오류를 받을 때 로그 상태를 저장할 수 도 있다는 장점 이 있을 것 같은데 비즈니스 적으로 의미가 있는 경우에는 체크예외를 사용하고 그 외에는 방법1,2를 선택하면 되는지 궁금합니 다. (오류 처리로 서비스 코드를 지저분하게 만들게 하고 싶지 않 는 경우 방법1,2를 사용하는지?)참고) 아래는 위 내용을 테스트 할 때 작성한 코드 입니다.체크예외를 사용하는 서비스 메소드 내용@Transactional public void joinV3(String username) throws Exception { Member member = new Member(username); Log logMessage = new Log(username); log.info("== memberRepository 호출 시작 =="); memberRepository.save(member); log.info("== memberRepository 호출 종료 =="); log.info("== logRepository 호출 시작 =="); try { logRepository.saveV2(logMessage); } catch (Exception e) { log.info("log 로그 저장에 실패했습니다. logMessage={}", logMessage.getMessage()); logRepository.saveV2(new Log("체크예외발생!!")); log.info("joinV3: 체크 예외가 발생하였습니다!!!"); } log.info("== logRepository 호출 종료 =="); }체크예외를 던지는 logRepository.saveV2 내용@Transactional public void saveV2(Log logMessage) throws Exception { log.info("log 저장"); if (logMessage.getMessage().contains("로그예외")) { log.info("log 저장시 예외 발생"); throw new Exception("예외 발생"); } em.persist(logMessage); }회원가입요청 서비스를 테스트하는 코드 내용/** * MemberService @Transactional: ON * MemberRepository @Transactional: ON * LogRepository @Transactional Checked Exception */ @Test void recoverCheckedException_success() throws Exception { // given String username = "로그예외_outerTxOn_fail"; String errorUsername = "체크예외발생!!"; // when memberService.joinV3(username); // then: member 저장, log 오류내용 저장 assertTrue(memberRepository.find(username).isPresent()); assertTrue(logRepository.find(errorUsername).isPresent()); }
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Controller, Service, Repository 구조에서 Transaction 관련 질문
안녕하세요? 강의 내용 중 질문이 있어서 글 남깁니다. 아직 전체 강좌를 본 건 아니지만 말씀하신 Controller, Service, Repository 구조에서 Service 구조가 단순 Repository 에 위임하는 기능만 있는 경우, Controller 에서 직접 Repository 를 호출하는 것도 괜찮다고 하셨는데 이 경우에 Transactional 은 어느쪽에서 관리하는 게 좋을까요? Controller or Repository 둘 중 어느 곳에서 관리하는게 좋을지? 얼핏 생각하면 Controller 에서 관리하는 게 좋을 것도 같은데 간단한 구조라면 Repository 에서 관리해도 될 것 같아서요. 그리고, 혹시 Controller 에서 Transactional 을 처리하는 경우, 예전에 문제가 생길 수 있다고 들었던 것도 같아서 질문 납깁니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
요청, 트랜잭션, 영속성컨택스트의 관계
고객의 요청당 엔티티매니저(영속성컨텍스트)가 생성된다고 설명해주셨습니다. 아래 두가지 중에 어떤 개념이 올바른 것인지 헷깔립니다. 고객의 요청을 한 개의 단일 트랜잭션으로 생각하고 요청한개당 영속성컨텍스트가 1개가 생성되는 것으로 이해하면, 생성과 소멸한번만 하고 이 과정을 요청마다 반복하는 것으로 이해할 수 있을까요?. 반면, 요청하나에 여러개의 트랜잭션을 갖는다면 요청 하나에 여러번의 영속성컨택스트 생성소멸이 반복되는 것으로 해석할 수 있는 것인지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
서비스 계층에 트랜잭션 추가 하는 이유
서비스 계층에 @Transactional 을 추가하셨는데 이유가 궁금하고 그 역할이 궁금합니다! Test클래스의 메서드 위에 붙인거랑은 어떤차이가 있는건가요??
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
레포지토리 바로 조회 시 트랜잭션 동작 방식에 대한 질문
강의명: 실전! 스프링 부트와 JPA 활용 1 해당 강의: 주문 목록 검색, 취소 안녕하세요 초보개발자 명아주입니다. 이번 강의를 들으면서 궁금증이 있어서 질문드립니다! orderList를 조회하는 로직을 orderService에서 orderRepository로 변경하는 방식을 선호하신다고 해서 저도 시도해봤습니다. 사실 이걸 시도하면서 JPA는 트랜잭션 안에서 처리가 되야 되기 때문에 레포지토리를 바로 타면 어떤 트랜잭션 처리를 하지 않았기 떄문에 에러가 나길 기대했습니다. 그런데 실제 결과는 정상 동작이었습니다. 조회 동작이니 트랜잭션에 덜 민감할 것이라고 생각은 드는데 그렇다하더라도 JPA는 무조건 트랜잭션 안에서 동작하는 것으로 알고 있는데 어떻게 이것이 동작하는지 궁금하더라구요. 일단, 이렇게 가져온 값을 뭔가 컨트롤러에서 변경해도 준영속 상태기 때문에 반영은 안될 것 같지만, 가져오는 것 자체가 트랜잭션을 안탔는데 왜 가능한지? 알고 싶습니다! 감사합니다. 명아주 드림
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
TypeORM 트랜잭션 질문드립니다.
안녕하세요 윤상석 강사님. TypeORM의 트랜잭션 관련으로 질문이 있습니다.TypeORM에서 트랜잭션을 다루는 방법은 이전 질문글에 답변해주셨듯이 크게 3가지인 것으로 알고 있습니다.1. QueryRunner2. getConnection, getManager3. @Transactional개인적으로는 @Transactional() 데코레이터를 사용하는것이 편리하여 사용하고 있었는데요.NestJS 공식문서에서 데코레이터를 이용하는 것을 권장하지 않고 있고,구글링을 해보아도 유닛 테스트에 어려움이 있어 권장하지 않는 분들이 많은 것을 알게되었습니다.여기서 첫 번째 질문이 있습니다.Q1. "유닛 테스트에 어려움이 있다"는 이야기가 구체적으로 무슨 의미인지 궁금합니다. 모킹이 어렵다. 내 마음대로 제어가 불가능하다 등의 이야기가 이해는 가는데 와닿지는 않아서 질문드립니다.----QueryRunner 방식을 이용하게 되면 try-catch-finally 코드가 강제가 되는 것 같아보입니다.여기서 두 번째 질문이 있습니다.Q2. 모든 에러를 감지하는 Filter를 적용해두었다면 QueryRunner를 사용하는 try-catch-finally 구문에서 에러 처리를 해버려 필터가 작동하지 않을 것 같은데 맞을까요?맞다면, 만약 Filter에서 요청이 실패하였을 때의 로깅기능이 있다고 가정한다면 로깅기능이 작동하지 않을 것 같습니다.그렇다면 catch 문에서 따로 Filter에서 구현한 로깅을 다시 구현해주어야 할까요?----트랜잭션 처리를 도와주는 typeorm-transactional-cls-hooked 패키지를 발견하였습니다.여기서 마지막 세 번째 질문이 있습니다.Q3. 해당 패키지는 유닛 테스를 할 때 트랜잭션 기능이 작동하지 않도록 모킹기능도 제공해주는 것 같습니다. QuerryRunner 보다 안 좋은점이 있다면 어떤 점이 있을까요?----질문이 너무 많은 것 같아 죄송합니다.좋은 강의와 답변해주셔서 항상 감사합니다.
-
미해결20번 넘게 면접 본 네카라쿠배 개발자의 이직 기술면접 기출 강의
안녕하세요! 질문이 있습니다.
안녕하세요! 강의를 듣다가 궁금한 사항이 생겨 질문 드립니다. 해당 강의의 약 6분50초 경에 다루는 이야기인데요. 먼저 맨처음 팬텀리드에 대해 설명해주셨을때, 트랜잭션1에서 DB로 유저를 조회할 때는 유저가 조회가 안된다고 말씀해주셨는데. 이후, 트랜잭션1에서 유저를 업데이트 한 이후에는 유저가 조회된다고 말씀해주셨습니다. 그렇다면, 트랜잭션1에서 원래 업데이트 되지 않던 유저가 이후에 없던 유저를 업데이트 한 이후 다시 조회해보니 조회가 된다라고 이해하면 되는 건가요? 다시말해, 업데이트를 했기 때문에 조회를 할 수 있게됐다?? 라고 이해하면 되는 건가요? 뭔가, 해당 내용을 이해하려면 준비하신 슬라이드에서 트랜잭션2에서 유저를 insert하는 장표와 트랜잭션1에서 유저를 조회하는 장표의 순서를 바꿔야 더 상황에 맞을거 같다는 생각이 들어서요.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션과 영속성 컨텍스트
안녕하세요 선생님! 선생님의 강의를 듣고 프로젝트를 하다가 의문점이 생겨서 질문을 드립니다. 예를들어 하나의 컨트롤러에서 여러개의 서비스 계층의 트랜잭션을 사용할 경우 컨트롤러에서 사용되는 트랜잭션은 하나의 영속성 컨텍스트에서 관리 되나요? 즉, 컨트롤러 계층에서 생성되는 트랜잭션은 view에 넘어가기 전까지 같은 영속성 컨텍스트에 존재하는가요? 아니면 컨트롤러에서 영속성 컨텍스트는 트랜잭션과 1:1 인가요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
트랜잭션
안녕하세요 영한님! 트랜잭션 범위에 질문이 있습니다. @PutMapping("/api/v2/members/{id}")public UpdateMemberResponse updateMemberV2(@PathVariable Long id, @Valid @RequestBody UpdateMemberRequest request) { memberService.update(id, request.getName()); Member member = memberService.findOne(id); return new UpdateMemberResponse(id, member.getName());} 위와 같이 코드를 작성 후 수정을 진행하게 되면 서비스 계층의 update 메서드를 통해 두번의 sql문인 select, update 쿼리가 나가는 것을 확인 했습니다. 하지만 밑의 findOne 메서드를 통해 조회를 할 때 조회 sql문이 나가지 않는 것을 확인했습니다. 제가 알고 있는 바로는 트랜잭션이 다르기 때문에 데이터베이스에서 조회 후 영속성 컨텍스트에 저장하는걸로 알고 있습니다. 그래서 제가 잘못 이해하고 있나 질문드립니다. 또한 Member member = memberService.findOne(id); 에서 member 객체는 준영속 상태인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: 데이터베이스
트랜잭션에 대해서 질문이 있습니다.
프로그래밍적으로 트랜잭션은 객체를 생성할 때와 객체의 상태를 변경할 때와 객체를 삭제할 때 함께 영향을 받는 것들을 묶어 주라는 걸로 이해하면 되는 걸까요 ?