묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional이 어디에 적용되어 있는지 스프링은 매번 조사하는 건가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Transactional 적용 우선순위가 1. 클래스의 메서드2. 클래스의 타입 3. 인터페이스의 메서드 4. 인터페이스의 타입 이 순서라고 하셨으니 클래스의 메서드에 @Transactional이 없으면 클래스의 타입을 확인하고, 그래도 없으면 인터페이스의 메서드를 확인하고, 그래도 없으면 인터페이스의 타입에 @Transactional이 있는지 없는지 확인하는 거로 이해했는데 스프링 프레임워크를 사용하면 이를 항상 적용하나요?이전에 스프링 핵심 원리 기본 편, MVC 1, 2 강의에서 작성한 코드들엔 @Transactional을 적용하지 않았었는데, @Transactional이 코드 어디에도 없더라도 매번 스프링이 이렇게 @Transactional이 어디에 있는지 조사하나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Import
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 전 강의에서 @Configuration 파일은 하나의 파일에서 대부분 설정 한다고 하셨던거 같은데 @Import 를 사용하면 설정파일도 분리해서 사용 하는경우도 있을까요 ? 예를 들면 DB 부분, 인증부분 등등 .. 좀 큰 프로잭트에서 사용하는 방법인지 궁금합니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
공식 문서 링크가 바뀐 것 같습니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]6. 데이터 접근 기술 - 스프링 데이터 JPA.pdf (v20240526) 4페이지에 나온 두 링크를 눌러도 주소가 바뀌어서 원래 페이지로 이동하지 않습니다. https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html#jpa.query-methods.query-creation https://docs.spring.io/spring-data/jpa/reference/repositories/query-methods-details.html#repositories.limit-query-result 이 링크로 바뀐 것 같습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper가 자동으로 빈으로 등록되는 이유
[질문 내용]ItemMapper가 자동으로 빈으로 등록되는 이유가 뭔가요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
제가 제대로 이해한 건지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Import(JpaConfig.class) @SpringBootApplication(scanBasePackages = "hello.itemservice.web") public class ItemServiceApplication { }스캔 대상을 web 디렉터리로 한정했기 때문에 @Slf4j @Repository @Transactional public class JpaItemRepository implements ItemRepository { private final EntityManager em; public JpaItemRepository(EntityManager em) { this.em = em; } . . }여기에 @Repository가 있다고 하더라도 자동으로 스캔되지 않고, 그래서 생성자에 em이 @Autowired로 주입되는 게 아니라 @Configuration public class JpaConfig { private final EntityManager em; public JpaConfig(EntityManager em) { this.em = em; } @Bean public ItemService itemService() { return new ItemServiceV1(itemRepository()); } @Bean public ItemRepository itemRepository() { return new JpaItemRepository(em); } }JpaConfig의 생성자에서 em을 @Autowired를 통해 자동으로 주입받은 다음, 그 em을 JpaItemRepository에 수동으로 주입했다 이렇게 이해하면 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
테스트 메서드 save()와 쓰기 지연 관련해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]ItemRepositoryTest를 실행하면 updateItem()는 update 쿼리가 실행되지 않지만 save()는 insert 쿼리가 로그로 보이더라고요. JPA PPT에 나와 있는 트랜잭션을 지원하는 쓰기 지연 - INSERT이 내용대로라면 save()를 해도 insert 쿼리가 안 보여야 할 것 같은데, 이건 관련 옵션을 켜야만 적용되는 건가요?쓰기 지연이 안 되는 것이 디폴트이고, 옵션을 켜면 save()도 updateItem()과 마찬가지로 insert 쿼리가 안 보이게 되는 건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
@Transactional 적용되는 접근제어자 관련 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 @Transactional 애노테이션이 붙여있어도 public이 아니면 AOP가 적용이안된다고하고 V1 테스트의 internal에서 public을 지우고 했을때 적용이안된다고하셨는데 저는 public을 지워도 되더라고요 @Test void internalCall(){ callService.internal(); } @Transactional void internal(){ log.info("call internal"); printTxInfo(); } 결과화면 이유를 알고싶습니다.Dependencies관련 build.gradle 버전 plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { useJUnitPlatform() }
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Autowired를 할 때 이 두 가지 방식의 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@Autowired PlatformTransactionManager transactionManager; TransactionStatus status;이 코드와@Autowired PlatformTransactionManager transactionManager; @Autowired TransactionStatus status;이 코드는 다르게 동작하나요? 제가 실수로 두 번째 코드로 썼다가 오류가 났었는데 첫 번째 코드로 하니 정상 동작이 되었습니다.+)아 잠시 헷갈렸습니다..
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트레이드오프시 DI, OCP를 지킨다는말
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]JPA 사용시 중간계층으로 JpaItemRepositovy 를 거쳐서 SpringDataJpaItem의 인터페이스를 구현함으로써 구조가 복잡해지기때문에 중간단계인 JpaItemRepositovy 없이 직접 SpringDataJpaItem를 주입해줌으로써 좀더 간단한 구조가 된다고설명해주셨는데, 단점으로는 DI 와 OCP를 지키지 못한다라고 하셨는데 아래 스크린샷처럼 수업을 듣다가 헷갈려서 찾아봤습니다. DI 와 DIP의 차이를 알아보고 SOLID원칙을 지킨다라는건 DI를 어긴다보단 DIP를 어긴다가 맞는거 같아 이부분에 대한 설명을 DIP를 DI로 추상적으로 설명했다고 이해해야할까요? 정확히는 DIP를 지키기위해 DI를 넣는건데 SpringDataJpaItem를 주입한다고할때 솔직히 이것도 DI로 넣는것도 같고 DIP도 인터페이스(추상화)에 의존하기때문에 지킨거고 오히려 OCP만 어기는 구조가 아닌가해서요 정리하자면DI를 어긴다는말보단 DIP를 어긴다 라고해야되는게 맞는지해당 코드 트레이드오프 설명시 DIP는 지키되 OCP를 지키지 못하는게 아닌지
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
findByItemNameLikeAndPriceLessThanEqual 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 데이터 JPA 적용1 강의에서findByItemNameLikeAndPriceLessThanEqual 라는 쿼리메서드는'select i from Item where i.price<= ?' 라는 JPQL이 실행된다 라고했는데 'select i from Item i where i.itemName like :itemName and i.price <= :price'가 맞는거 아닌가해서요LikeAnd가 붙었는데 기존과 동일하다고 설명되어있길래 질문드려요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
ItemMapper.xml 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ItemMapper.xml에 <insert> 코드가 강사님 코드하고 한 자도 안 틀리고 똑같은데 테스트에서 sql syntax 에러가 나서 강사님 코드를 붙여넣었는데 테스트가 정상으로 작동했습니다. 이상해서 코드를 한 줄씩 Ctrl + C, V 해가면서 테스트가 제대로 작동하는지 확인했는데 그래도 계속 syntax 에러가 났습니다. 코드 전체를 복사하고 붙였더니 테스트가 정상 작동했구요. 이런 경우가 가끔식 있는지 이건 어떤 경우인지 궁금해서 질문 남깁니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
BeanPropertyRowMapper 관련해서 질문 있습니다.
안녕하세요. 모든 필드가 final인 클래스에 BeanPropertyRowMapper는 사용 못하는건가요?? 빈 생성자는 생성하지 못해서 각 필드의 기본값으로 초기화 해주는 생성자를 만들었는데모든 필드가 final이라서 값이 변경이 되지 않아서 그런지 기본값으로 나오더라고요 코드는 아래와 같이 작성했습니다 그냥 RowMapper를 직접 만들어서 사용하는게 최선일까요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 내부 호출 해결 방안에 대해 질문이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예제에서 internal() 메서드를 별도의 클래스로 분리하지 않고, external() 메서드에 @Transactional 어노테이션을 사용하여 미리 트랜잭션을 시작하여 internal()에도 적용되도록 하는 방법은 적절한 해결 방안이 아닐까요?왜 클래스를 별도로 분리하는 것이 더 합리적인 해결 방안인지가 궁금합니다!
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
스프링 부트 3.X 버전으로 바꾸려면
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 내용대로itemservice-db-start를 이름 수정해서 쓰려고 했는데이 코드는 스프링 부트 2.X 버전이더라고요. 이렇게 강의에서 제공하는 코드가 2.X 버전인 경우, 저는 이전 MVC 2편 강의 들을 땐 제가 스프링 이니셜라이저 사이트에 가서 직접 프로젝트를 3.X 버전으로 하나 만들고, 강의에서 제공하는 코드에서 main 폴더랑 test 폴더만 제가 만든 프로젝트 쪽으로 복사 + 붙여넣기 하는 식으로 해결했었습니다. 이번에도 그런 식으로 했고 실행해서 상품 등록이랑 수정해 보니 오류는 딱히 안 나는데 조금 걱정되는 부분이 있어서 질문드립니다. 강의에서 제공하는 코드를 보면modules 폴더나 sql 폴더가 있습니다. 제가 새로 만든 프로젝트엔 없고요. 그래서 위 폴더들도 그대로 복사 붙여넣기 할까 생각도 했는데.. 위 두 개 폴더 말고도 더 있을지도 모르고, 이런 식으로 없는 폴더를 일일이 복사 붙여넣기 해서 무언가 잘못되어서 나중에 가서 오류가 터질까 봐 조금 걱정이 되네요. 조금 안전한 방법으로 스프링 부트 3.X 코드를 쓰고 싶은데, 제가 그동안 했던 방법으론 조금 불안합니다..ㅎㅎ 관련 질문과 답변이 MVC 2편 커뮤니티엔 많은데, DB 2편 커뮤니티엔 없는 것 같아서 질문드립니다.스프링 부트 3.X로 하려면 어떻게 하는 게 좋을까요?그냥 2.X 버전으로 진행해도 아무 문제 안 생긴다면 2.X로 해도 상관은 없습니다. +)그냥 강의에서 제공하는 스프링 부트 2.X 버전 코드에 추가로 https://www.inflearn.com/community/questions/988208/%EC%9E%90%EB%B0%94-17%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EC%A7%84%ED%96%89%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94 이 게시글대로 해 보고, 여기에 추가로plugins { id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' id 'java' }이 부분만 3.3.2랑 1.1.6으로 수정해 봤는데요.(스프링 부트 3 이상으로 바꾸기 위해)이렇게 하니깐 다음 메시지가 뜹니다. 강의 코드를 수정해야 할지, 아니면 제가 새로 프로젝트를 만들어서 수정해야 할지, 그러면 복붙을 어디어디 할지 모르겠네요.. A problem occurred configuring root project 'itemservice-db'.> Could not resolve all artifacts for configuration ':classpath'.> Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.3.2.Required by:project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.3.2> No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.3.2 was found. The consumer was configured to find a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.2' but:- Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares an API of a component and the consumer needed a runtime of a component- Other compatible attribute:- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')- Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 17)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')- Variant 'modernGradleRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component, as well as attribute 'org.gradle.plugin.api-version' with value '8.7' and the consumer needed a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.2'- Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a library compatible with Java 17, packaged as a jar, and its dependencies declared externally:- Incompatible because this component declares a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.5' and the consumer needed a component, as well as attribute 'org.gradle.plugin.api-version' with value '7.2'- Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.3.2 declares a runtime of a component, and its dependencies declared externally:- Incompatible because this component declares documentation and the consumer needed a library- Other compatible attributes:- Doesn't say anything about its target Java version (required compatibility with Java 17)- Doesn't say anything about its elements (required them packaged as a jar)- Doesn't say anything about org.gradle.plugin.api-version (required '7.2')* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
빈 등록 및 의존관계 주입
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 등록 및 의존 관계 주입이 헷갈려서 그러는데 JdbcTemplateItemRepositoryItemService이 두 개는 TemplateConfig에서 직접 빈 등록하고, 등록하면서 의존 관계가 주입되고 DataSource는 properties 파일에서 설정을 통해 스프링이 자동으로 빈으로 등록해주고 web 패키지에 있는 Controller들은 컴포넌트 스캔 + Autowired로 빈을 등록하고 의존 관계가 주입되고 있는 거 맞나요? 이게 맞다면JdbcTemplateItemRepository랑 ItemService에 @Repository, @Service 애노테이션을 사용하지 않고Config로 직접 빈을 등록하고 의존 관계를 주입한 이유가 있을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
H2 testcase 연결 실패
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트를 위해서 윈도우에서 배치파일로 실행하면주소에 key값이 안 나오고 바로 jsessionid가 나와서key값 앞에 localhost로 변경해서 접속을 할 수가 없는데어떻게 연결하나요?그냥 jdbc:h2:~/testcase로 연결하려고 해도Database "C:/Users/user/testcase" not found, either pre-create it or allow remote database creation여전히 이 오류가 나서 testcase로 접속할 수가 없습니다
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 전파 활용1,2 강의 내용 중 질문
강의록에 첨부해주신 그림을 보면 MemberRepository는 con1를 사용하고, LogRepository는 con2를 사용하는데 이게 각각 MemberRepository는 트랜잭션B를 사용하고 LogRepository는 트랜잭션C를 사용한다고 해서 다른 커넥션을 사용하게 되는거죠?? MemberRepository는 con1를 사용하고 커밋하고 난 후에 커넥션 풀에 con1이 반납되고 그 후에 LogRepository가 트랜잭션을 시작하게 되면 con1을 사용하게 되는건 아닌가요?? 이럴때는 서로가 다른 트랜잭션B,C로 구분이 안되어있을때만 이렇게 되는건가요..??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
AOP Self Invocation 해결방법..?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.이 영상에서 나온것처럼 최상단 서비스에서만 @Transactional 걸어주면(예전 영상에서 나온 한 클래스 내부의 2개의 트랜잭션처리[AOP Proxy때문에 this로 인한 Self Invocation]이 일어나는 경우)를 해결할 수 있을까요?레포지토리 내부에서 트랜잭션을 걸지 않고 엔티티매니저로 CRUD하는 작업을 여러개 작성해놓으면 memberRepository 내부에서 내부 메서드를 호출해도 둘 다 트랜잭션 처리가 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 및 커넥션 관련 질문 드립니다.
안녕하세요. 앞서 db1강의에서 트랜잭션 관련 내용을 바탕으로 커넥션 관련해서 제가 이해하는 바가 맞는지 질문드립니다..! 트랜잭션을 시작하고 JdbcTemplate.update() 등등이 호출되면, 먼저 데이터베이스에 접근할 수 있는 커넥션을 얻는다.이때 내부적으로 DataSourceUtils.getConnection()을 호출해서 트랜잭션 동기화 매니저에서 관리하는 커넥션을 가져오거나, 새로운 커넥션을 생성(등록된 dataSource로 부터 커넥션을 생성)한다. 그리고 나서 SQL 쿼리를 실행한다. 이때 커넥션을 통해 데이터베이스와 통신한다.즉, JdbcTemplate을 통해 update 작업을 수행할 때, 커넥션을 사용하여 데이터베이스에 접근하여 SQL 쿼리를 실행하고, 그 결과로 데이터베이스의 내용이 업데이트된다.트랜잭션을 시작하지않고 JdbcTemplate.update() 등등이 호출되면, 이때도 먼저 데이터베이스에 접근할 수 있는 커넥션을 얻는다.이때 내부적으로 DataSourceUtils.getConnection()을 호출해서 트랜잭션 동기화 매니저에서 관리하는 커넥션을 가져오거나, 새로운 커넥션을 생성(등록된 dataSource로 부터 커넥션을 생성)한다. 그리고나서 SQL쿼리를 실행한다. 이때 커넥션을 통해 데이터베이스와 통신한다.마찬가지로, 커넥션을 사용하여 데이터베이스에 접근하여 SQL 쿼리를 실행하고, 그 결과로 데이터베이스의 내용이 업데이트된다.트랜잭션을 사용하지 않고 JdbcTemplate.update()를 호출하면, 커넥션은 기본적으로 자동 커밋 모드로 동작하여, 쿼리가 실행된 후 즉시 데이터베이스에 반영된다.트랜잭션이 있든 없든 JdbcTemplate은 항상 커넥션을 사용하여 데이터베이스에 접근하고, 쿼리를 실행하여 그 결과로 데이터베이스의 내용을 수정하거나 조회하는 작업을 수행한다. 트랜잭션 및 커넥션 관련해서 이렇게 이해하면서 정리해보았는데, 이렇게 이해하면 될까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
제대로 이해했는지 확인하고싶습니다.
가장 처음에 했던 트랜잭션은 각각의 리포지터리에서 @Transactional을 걸어줘서 별도로 커밋, 롤백 되게끔 만들었습니다. 이후, 마지막에는 LogRepository에 @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용해서 트랜잭션 동기화 매니저에서 다른 커넥션을 가져와서 별도로 커밋, 롤백 되게끔 만들었습니다. 여기서 궁금한 점은 처음과 마지막의 트랜잭션의 구성은 다르지만 결과값은 똑같은 게 맞을까요? 다른 점이 있다면 혹시 무엇인지 알려주시면 감사하겠습니다.