전체 글 썸네일형 리스트형 Querydsl 프로젝션 결과 반환 MemberDto @Data @NoArgsConstructor public class MemberDto { private String username; private int age; public MemberDto(String username, int age) { this.username = username; this.age = age; } } UserDto @Data @NoArgsConstructor public class UserDto { private String name; private int age; } 1.프로젝션 대상이 1개일 때 List result = queryFactory .select(member.username) .from(member) .fetch(); 프로젝션 대상이 1개이면 타입.. 더보기 Querydsl gradle 설정 1. gradle 설정(1) SpringBoot 3.0.0 미만dependencies{ //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" }//자동 생성된 Q클래스 gradle cle.. 더보기 Auditing기능을 이용한 등록일,수정일,등록자,수정자 관리 1.등록일,수정일 관리 @EntityListeners(AuditingEntityListener.class) @MappedSuperclass public class BaseTimeEntity { @CreatedDate @Column(updatable = false) private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime lastModifiedDate; } 2.등록자,수정자 관리 @EntityListeners(AuditingEntityListener.class) @MappedSuperclass public class BaseEntity extends BaseTimeEntity { @CreatedBy @Column(updatable.. 더보기 벌크연산시 주의할 점 벌크성 수정쿼리 test 코드 @Test public void bulkUpdate() { //given memberRepository.save(new Member("member1", 10)); memberRepository.save(new Member("member2", 19)); memberRepository.save(new Member("member3", 20)); memberRepository.save(new Member("member4", 21)); memberRepository.save(new Member("member5", 40)); //when int resultCount = memberRepository.bulkAgePlus(20); Member member = memberRepositor.. 더보기 SpringData JPA를 활용한 페이징 및 정렬 1.반환 타입에 따른 count 쿼리 Page findByAge(@Param("age") int age,Pageable pageable); //count query 사용 Slice findByAge(@Param("age") int age, Pageable pageable); //count query 사용안함 List findByAge(@Param("age") int age, Pageable pageable); //count query 사용안함 List findByAge(@Param("age") int age, Sort sort); //count query 사용안함 2.Page와 Slice의 차이점 (1) Page 조회 쿼리 이후 전체 데이터 개수를 조회하는 카운트 쿼리가 실행된다. 총 데이터 개수가 필요.. 더보기 JPA 컬렉션 조회시 최적화 방법 1.Entity로 조회 시 최적화 방법 (1) 컬렉션 fetch join - 페이징 불가 public List findAllWithItem() { return em.createQuery("select distinct o from Order o " + "join fetch o.member m " + "join fetch o.delivery " + "join fetch o.orderItems oi " + "join fetch oi.item i",Order.class) .getResultList(); } fetch join을 이용하여 SQL이 1번만 실행된다. 일대다 조인시 orderItem의 수에 따라 order과 join 되어 DB의 row수가 증가하게 된다. 이 떄 JPA의 distinct를 사용하면 S.. 더보기 Springdoc을 이용한 swagger3 구현 1.build.gradle implementation 'org.springdoc:springdoc-openapi-ui:1.7.0' 2.application.properties springdoc.swagger-ui.path=/swagger-ui.html #swagger 접속 주소 ex) localhost:8080/swagger-ui.html springdoc.swagger-ui.groups-order=asc #swagger group 정렬 순서 desc,asc springdoc.swagger-ui.operations-sorter= # method순으로 정렬 Reference https://springdoc.org/properties.html Springdoc-openapi Properties springd.. 더보기 Entity를 변경하는 방법(Merge와 변경감지) Merge 동작 방식 1. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다. 1-1. 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고, 1차 캐시에 저장한다. 2. 조회한 영속 엔티티에 member 엔티티의 값을 채워 넣는다. 3. 영속 상태인 mergeMember를 반환한다. 4.트랜젝션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행된다. Merge와 변경감지의 차이점 변경감지를 이용하면 원하는 속성만 선택해서 변경 할 수 있지만 ,병합을 사용하면 모든 속성이 변경되므로 병합시 값이 없으면 null로 업데이트 할 위험이 있다.엔티티를 변경할때는 무조건 변경감지를 이용해야 한다. Entity 변경 시 주의점 (1)컨트롤.. 더보기 이전 1 2 3 4 5 6 7 8 ··· 16 다음