본문 바로가기
728x90
반응형

SpringBoot25

batch insert하기 Spring Data JPA saveAll() vs 네이티브 쿼리 두 방식의 가장 큰 차이는 영속성 컨텍스트 사용 유무(메모리)와 동작 방식.  Spring Data JPA에서 saveAll(Iterable)은 내부적으로 하나하나 save()를 호출하는 구조.for문 돌면서 persist(insert) 또는 merge(update)를 반복.  ??? : saveAll 안쓰고 네이티브 쿼리 써도 @Transactional 을 쓰기 때문에 jdbc 버퍼에 저장되니까 메모리 쓰는건 똑같지않아?  List list = createMillionEntities(); // 100만 개 생성myRepository.saveAll(list); saveAll()은 단순히 SQL만 실행하는 게 아니라 다음을 함1. 엔티티 객체 생성2. 모두 영속성 컨텍스트에 등록3. 변경 여부 추적(더티 .. 2025. 4. 4.
JPA 영속성 컨텍스트, Dirty Checking, 쓰기 지연, Spring Data JPA, Hibernate, JDBC JPA의 영속성 컨텍스트(Persistence Context) - JPA가 관리하는 엔티티 객체들이 저장되는 메모리 공간(캐시)  - JPA에서 엔티티를 persist(), find(), merge() 등을 하면 영속성 컨텍스트가 이를 관리 - 즉시 DB에 반영되지 않고 영속성 컨텍스트에 저장되었다가 트랜잭션이 commit()될 때 변경 사항을 한 번에 DB에 반영 (flush() 발생) : 쓰기 지연 (Write-Behind)  - @Entity 가 붙은 클래스만 관리함!! - @Query 나 네이티브쿼리로 가져온 임의의 결과는 관리하지 않음  엔티티 생명주기 (4가지 상태)상태설명코드 예제비영속 (New) JPA가 관리하지 않는 상태Member member = new Member();영속 (Manag.. 2025. 4. 3.
@GroovyASTTransformation 컴파일타임 조작, 어노테이션 동적 적용 목차build.gradle 추가한 내용구현하고 싶은 것, 그 이유AST 란?AST Transformation 메인 코드보기CompilePhaseAST Transformation 종류Local AST TransformationGlobal AST TransformationAST 로 어노테이션, 메소드 추가하기xxxApiTest.groovy Spock 테스트코드AST Transformation 풀코드   groovy 4.0spock 2.3사용했습니다.  🎈 build.gradle 추가한 내용 pluginsid 'groovy' allprojectsapply plugin: 'groovy' dependencies// groovytestImplementation 'org.apache.groovy:groovy-all.. 2025. 2. 24.
호출 순서 TestBootstrapInitializer, TestExecutionListener, setupSpec, ApplicationContextInitializer @SpringBootTest 를 쓰는 경우 컴파일타임 - Annotation Processor 동작 - 소스를 AST(Abstract Syntax Tree, 추상 구문 트리)로 변환 - (groovy의 경우) @GroovyASTTransformation 동작 - AST를 확인하여 바이트코드(.class 파일) 생성 런타임 - @ExtendWith 확인만. 테스트 클래스에 선언된 Extension을(메소드들) 미리 스캔하여 등록만 함.  - TestContext 초기화 시작 - TestContext 초기화 중간(순서대로)       -  TestBootstrapInitializer 동작       - TestExecutionListener 의 beforeTestClass() 메소드 동작       - (s.. 2025. 1. 10.
삽질. groovy, spock 통합테스트 적용 spock 통합테스트를 하려는 과정이다. 나는 특정 조건에 따라 테스트 클래스에 @SpringBootTest, @DataJpaTest 둘 중에 하나를 적용하고 싶었다. @Conditional 은 스프링 컨텍스트가 확인하는 것이기 때문에 스프링 컨텍스트가 생성된 이후에 동작한다. @SpringBootTest, @DataJpaTest 이것들이 스프링 컨텍스트를 만드는 어노테이션인데 스프링 컨텍스트가 없는 시점에 이걸 조건적으로 적용하고 싶은거니까 애초에 @Conditional 은 못쓴다. 컴파일타임에 어노테이션이 고정된다(소스코드가 정해진다)junit의 @ExtendWith 으로 조건적으로 액티브 프로필을 적용할 순 있다.@ExtendWith(ConditionalTestExtension.class) 으로 .. 2024. 12. 19.
728x90
반응형