묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
QItem 생성 방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]QItem이 @Entity로 설정된 클래스 정보를 가져와서 동적으로 생성되는 것으로 이해했습니다.QItem이 생성되는 시점이 애플리케이션 실행 시점인 것 같은데,그렇다면 혹시, 새로운 엔티티를 만들었다면 해당 엔티티로 동적 코드를 작성하기 위해선 필히 애플리케이션을 한번 실행해주고 해야하는건가요??QItem을 생성하기 위한 이유로만 애플리케이션을 실행해야하는 그런 동작이 뭐랄까 좀 부자연스러운(?) 느낌이 드는데 혹시 다른 방법이 있을까요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
Config 관련해서 질문잇습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] @Repository public class ItemQueryRepositoryV2 { private final JPAQueryFactory query; public ItemQueryRepositoryV2(EntityManager em) { this.query = new JPAQueryFactory(em); } ..... @Configuration @RequiredArgsConstructor public class V2Config { private final EntityManager em; private final ItemRepositoryV2 itemRepositoryV2; //SpringDataJPA @Bean public ItemService itemService() { return new ItemServiceV2(itemRepositoryV2, itemQueryRepository()); } @Bean public ItemQueryRepositoryV2 itemQueryRepository() { return new ItemQueryRepositoryV2(em); } @Bean public ItemRepository itemRepository() { return new JpaItemRepositoryV3(em); } } 여기서 ItemQueryRepositoryV2가 에노테이션으로 빈 등록이되어있는데 config에서 새롭게 빈을 등록한 이유가 EntityManager를 새롭게 생성해서 주입받는 것을 위해서인가요?이 방식 말고 다른 방식 ItemQueryRepositoryV2 자체적으로@RequiredArgsConstructor를 쓰면 오류가 나는 이유가 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
scanbasepackages 관련 질문입니다.
위 설명에 대한 의문이 들어서 질문드립니다. @SpringBootApplication(scanBasePackages = "hello.itemservice.web")위와 같이 하지 않고@SpringBootApplication이렇게만 해도 실행되는데는 문제가 없는데굳이 넣는 이유가 뭔지 궁금합니다. 혹시 성능과도 연관이 있나요?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
공식 문서 링크 변경된 것 같습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]9. 스프링 트랜잭션 이해.pdf(v20240526) 32페이지에 나온 https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-source-replica-replication-connection.html이 링크는 Page Not Found가 뜹니다.https://dev.mysql.com/doc/connector-j/en/connector-j-source-replica-replication-connection.html이 링크로 바뀐 것 같습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
hibernate.core 버전 변경
안녕하세요 hibernate.core의 버전 변경과 관련되서 질문드립니다.아래 코드와 같이 영한님이 말씀해주신 부분을 추가하고plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' ext["hibernate.versioin"] = "5.6.5.Final" configurations { compileOnly { extendsFrom annotationProcessor } }Gradle을 다시 로드했는데요 여전히 5.6.7 버전으로 구성되어 있습니다.버전이 바뀌지 않는데 어떻게 해야하나요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
Update 쿼리문이 로깅을 해도 보이지 않는 이유
JPA 사용시 테스트 환경이 아닌, 일반 환경에서 update 쿼리문이 보이지 않는 이유가 궁금합니다.제가 생각하는 update 쿼리문이 적용되는 과정은transaction이 커밋이 되고, 더티 체킹을 통해서 기존 스냅샷과 비교해 달라진 값을 기준으로 쿼리문을 작성하고 flush()를 통해서 쿼리문을 DB에 날린다음에 flush()한 쿼리문에 대한 commit()을 통해 db에 최종적으로 저장되는 과정으로 이해하고 있는데, 결국 DB에 쿼리를 날리기때문에 로그를 확인했을때, 확인할 수 있어야 하는거 아닌지에 대해 궁금합니다. insert와 select 쿼리문은 로그가 올바르게 찍히는데 그에 반해 update 쿼리는 로그가 보이지 않습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
JpaRepository에 대한 질문
[질문 내용]JpaRepository 코드를 타고 들어가보니, 코드는 다음과 같았습니다.@NoRepositoryBean public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {분명 JpaRepository는 interface로 선언이 되어있는데, JpaRepository를 상속받은 제가 커스텀한 Repository는 구현을 따로 하지 않고 JpaRepository 인터페이스에 정의된 메서드들을 사용할 수 있는 건가요? 추상 클래스면 이해를 하겠지만 인터페이스에서 어떻게 사용이 가능한지 이해가 잘 되지 않습니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
커넥션을 사용한다는 것
안녕하세요.강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요.이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데,em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요?"LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요?con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다.감사합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
커넥션을 사용한다는 개념
안녕하세요. 강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요.이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데, em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요? "LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요?con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다.감사합니다.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
@Repository를 통해 프록시가 생성되려면
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"@Repository가 붙은 클래스는 예외 변환 AOP의 적용 대상이 된다."는 내용에 대해 더 궁금한 점이 있습니다. 테스트 코드의 @Transactional를 주석 처리하고, @Import로 설정도 수정해서, JPA 대신 MyBatis나 JdbcTemplate을 적용해 봐도log.info("repository = {}", itemRepository.getClass());테스트의 이 코드를 실행하면 itemRepository가 프록시로 생성된다는 것을 확인할 수 있었습니다. JPA가 아니라 해도 @Repository가 적용되면 프록시 객체로 생성되는 것 같습니다. 그런데 이전 스프링 핵심 원리 기본 편 강의에서 사용했던 core 프로젝트에서도 한번 테스트해 봤는데//@Component @Repository public class MemoryMemberRepository implements MemberRepository { . . . } class OrderServiceImplTest { @Test void createOrder() { MemoryMemberRepository memberRepository = new MemoryMemberRepository(); System.out.println(memberRepository.getClass()); . . . } } 이 테스트를 실행해 보면 memoryMemberRepository는 @Repository가 적용되어 있음에도 불구하고 프록시 객체로 생성되지 않는 것 같습니다. 이 이유가 무엇인가요?@Repository를 통해 프록시 객체를 만드는 기능은 JPA 라이브러리가 있어야(JPA를 사용하지 않고 MyBatis를 사용하더라도) 적용되는 건가요? +) 그런데 스프링 DB 1편 강의에서 사용한 프로젝트에서도 테스트해 봤는데, 여기선 JPA 라이브러리를 받지 않았는데도 @Repository를 통해 프록시 객체가 생성되는 것 같습니다. 물론 @Transactional도 주석 처리했습니다.@Slf4j @Repository public class MemberRepositoryV5 implements MemberRepository { private final JdbcTemplate template; . . . } @Test void AopCheck() { log.info("memberService class = {}", memberService.getClass()); log.info("memberRepository class = {}", memberRepository.getClass()); Assertions.assertThat(AopUtils.isAopProxy(memberService)).isTrue(); Assertions.assertThat(AopUtils.isAopProxy(memberRepository)).isFalse(); }@Transactional을 주석 처리했으므로 memberService는 프록시 객체가 아니고,@Repository가 적용된 memberRepository는 CGLIB 관련 내용이 출력됩니다. @Repository를 통해 프록시 객체가 생성되려면 어떤 조건이 필요한지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
외부 내부 트랜잭션 질문
이전 내용은 내부 트랜잭션이 외부 트랜잭션에 종속된다는 내용이였는데, 지금까지 테스트를 트랜잭션 매니저로 직접 생성해서 해주셨습니다.그런데 실무에서는 트랜잭션 어노테이션을 많이 쓰는데 디폴트 트랜잭션은 기존 트랜잭션이 존재하면 그대로 이어 쓰는 걸로 알고 있습니다. 이 경우가 이어 쓰는 것임에도 논리적으로 외부 내부로 구분하는 건지, 아니면 다른 옵션의 예가 따로 있는 건지 궁금합니다. 정리하자면 기존 트랜잭션을 이어 쓰는 REQUIRED 옵션이 이제까지 설명해주신 내부가 외부에 종속되는 트랜잭션인지 아니면 다른 옵션이 있는 건지 궁금합니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트랜잭션 질문드립니다.
안녕하세요. 앞서 전파기본 강의와 전파예제 강의를 듣고나서 이해가 되지않는 부분이 몇가지 있어서 질문드립니다. 1. 강의 자료중에,트랜잭션매니저에 커밋하는것이 논리적인 커밋이라면, 실제커넥션에 커밋하는것을 물리 커밋이라고 할수있다= 내부트랜잭션인 txManager.commit(inner)을 하는것이 논리적인 커밋이고, 외부트랜잭션인 txManager.commit(outer)을 하는것이 물리커밋이다.= 트랜잭션 매니저를 통해 txManager.commit(inner)를 하는것이 논리적인 커밋이고, 트랜잭션 매니저를 통해 txManager.commit(outer)를 하는것이 물리커밋이다.이렇게 생각하는게 맞을까요??2. 1번 질문에 더해서, 트랜잭션 매니저를 통해서 txManager.commit()을 하는것이 논리적인 커밋이라면, 물리적인 커밋은 코드상 어떤것인가요? 외부트랜잭션도 txManager.commit()을 통해 커밋하는거같은데, 이렇게 외부트랜잭션을 커밋하는것이 논리적인 커밋임과 동시에 물리커밋인것인가요??3. 외부트랜잭션도 논리트랜잭션이고 내부트랜잭션도 논리트랜잭션인가요? 그래서 이 두가지를 묶어서 물리트랜잭션이라고 하는것인가요?? + 위 질문에 대해서 계속 찾아보면서 생각해봤는데, 이렇게 이해하면 될까요?1. 내부트랜잭션이 트랜잭션 매니저를 통해서 커밋하는것이 논리적인 커밋이고, 외부트랜잭션이 트랜잭션매니저를 통해서 커밋하는것은 실제 DB커넥션에 커밋하는것이다. 외부트랜잭션의 커밋은 논리적커밋임과 동시에 물리커밋이다.2. 외부트랜잭션을 커밋하는것은 논리적 커밋임과 동시에 물리커밋이다.3. 외부트랜잭션과 내부트랜잭션 모두 논리트랜잭션이고, 논리트랜잭션을 묶어서 물리트랜잭션이라고한다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
트렌젝션 질문입니다
트렌젝션을 서비스 클래스에 걸면 이런 문제가 없을 거 같은데, 실무에서는 트렌젝션을 메서드 단위로 거나요??저 같은 경우 서비스 클래스에 트랜젝션 readonly를 걸고create, update, delete 등이 필요한 로직에 트렌젝션을 따로 거는 편입니다.
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
외부, 내부, 논리, 물리 개념에 대해서 질문드립니다.
안녕하세요. 앞서 전파기본 강의와 전파예제 강의를 듣고나서 이해가 되지않는 부분이 몇가지 있어서 질문드립니다. 1. 강의 자료중에, 트랜잭션매니저에 커밋하는것이 논리적인 커밋이라면, 실제커넥션에 커밋하는것을 물리 커밋이라고 할수있다= 내부트랜잭션인 txManager.commit(inner)을 하는것이 논리적인 커밋이고, 외부트랜잭션인 txManager.commit(outer)을 하는것이 물리커밋이다.= 트랜잭션 매니저를 통해 txManager.commit(inner)를 하는것이 논리적인 커밋이고, 트랜잭션 매니저를 통해 txManager.commit(outer)를 하는것이 물리커밋이다.이렇게 생각하는게 맞을까요??2. 1번 질문에 더해서, 트랜잭션 매니저를 통해서 txManager.commit()을 하는것이 논리적인 커밋이라면, 물리적인 커밋은 코드상 어떤것인가요? 외부트랜잭션도 txManager.commit()을 통해 커밋하는거같은데, 이렇게 외부트랜잭션을 커밋하는것이 논리적인 커밋임과 동시에 물리커밋인것인가요??3. 외부트랜잭션도 논리트랜잭션이고 내부트랜잭션도 논리트랜잭션인가요? 그래서 이 두가지를 묶어서 물리트랜잭션이라고 하는것인가요??
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
REQUIRES_NEW를 호출한 트랜잭션의 롤백
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 김영한님 !REQUIRES_NEW는 완전히 물리적으로 트랜잭션이 분리되어REQUIRED(A 메서드)에서 REQUIRES_NEW(B 메서드)를호출 했을 때 B 메서드에 발생한 예외가 A 메서드에 전파되지 않는다고 이해했습니다.실제 확인을 위해 아래 코드를 구성해@Service @RequiredArgsConstructor public class MeetingService { private final MeetingRepository meetingRepository; private final MemberService memberService; @Transactional public void save() { meetingRepository.save(new Meeting("스터디 모임", LocalDate.now(), LocalTime.now(), "AB3AS2EG")); memberService.save(); } @Transactional(readOnly = true) public List<Meeting> findAll() { return meetingRepository.findAll(); } } @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; @Transactional(propagation = Propagation.REQUIRES_NEW) public void save() { memberRepository.save(new Member("김철수")); throw new IllegalArgumentException(); } @Transactional(readOnly = true) public List<Member> findAll() { return memberRepository.findAll(); } }아래 테스트 코드로 테스트를 진행했습니다.@Test void test() { assertThatThrownBy(() -> meetingService.save()) .isInstanceOf(IllegalArgumentException.class); // 롤백 여부 확인 List<Meeting> meetings = meetingService.findAll(); List<Member> members = memberService2.findAll(); assertThat(meetings).isEmpty(); assertThat(members).isEmpty(); }결과를 로그로 분석해보니 MemberService의 트랜잭션은 독립적으로 롤백 발생한 예외가 MeetingService로 전파 전파된 예외로 인해 MeetingService의 트랜잭션도 롤백이런식으로 흐름이 진행됐습니다. 제가 추측하기로는 물리적으로 분리는 되어 있지만 하나의 스레드에서 생긴 커넥션이고 자바의 예외 전파 메커니즘에 따라A 메서드에서 호출한 B 메서드의 예외가 A 메서드에 전파된 것이 아닌가 생각을 했는데요REQUIRES_NEW 사용 시 예외가 전파 되지 않는다. 라고 이해를 했어서 제가 실험한 결과가 맞는지 간과한 부분이 있었던 것인지 궁금합니다 !
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
HashMap에서 stream과 filter를 거처 List가 될 때 정렬순서
강의 4:33 의 코드입니다. @Test void findItems() { //given Item item1 = new Item("itemA-1", 10000, 10); Item item2 = new Item("itemA-2", 20000, 20); Item item3 = new Item("itemB-1", 30000, 30); log.info("repository={}", itemRepository.getClass()); itemRepository.save(item1); itemRepository.save(item2); itemRepository.save(item3); //둘 다 없음 검증 test(null, null, item1, item2, item3); test("", null, item1, item2, item3); //itemName 검증 test("itemA", null, item1, item2); test("temA", null, item1, item2); test("itemB", null, item3); //maxPrice 검증 test(null, 10000, item1); //둘 다 있음 검증 test("itemA", 10000, item1); } void test(String itemName, Integer maxPrice, Item... items) { List<Item> result = itemRepository.findAll(new ItemSearchCond(itemName, maxPrice)); assertThat(result).containsExactly(items); } MemoryRepository의 HashMap은 순서를 보장하지 않는데, 강의에서 실습을 할 때는itemRepository.save(itemOO) 순으로 넣은대로 List로 변환되는것 같습니다. test(null, null, item1, item2, item3);이 테스트는 매번 일관되게 나와야하는데 항상 item1, item2, item3 순으로 잘 통과되는 이유가 궁금합니다.
-
해결됨스프링 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가 자동으로 빈으로 등록되는 이유가 뭔가요?