분류 전체보기
-
[Spring] 페이징과 정렬Spring 2021. 12. 31. 20:33
페이징과 정렬 예제 @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } - 파라미터로 Pageable을 받을 수 있다. - Pageable은 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성 요청 파라미터 - 예) /members?page=0&size=3&sort=id,desc&sort=username,desc - page : 현재 페이지, 0부터 시작한다. - size : 한 페이지에 노출할 데이터 건수 - sort : 정렬 조건을 정의한다. 예) 정렬 속성, 정렬 속성.....
-
[Spring] AuditingSpring 2021. 12. 30. 23:00
서비스를 할 때 데이터의 등록일, 수정일을 모든 테이블에 넣어주는 것이 좋고, 테이블에 따라 등록자와 수정자까지 넣어주면 좋다. 스프링 데이터 JPA에서는 그 기능을 편히 사용할 수 있다. 스프링 부트 설정 클래스에 적용 @EnableJpaAuditing @SpringBootApplication public class DataJpaApplication { public static void main(String[] args) { SpringApplication.run(DataJpaApplication.class, args); } } 시간파트 부모엔티티 @EntityListeners(AuditingEntityListener.class) @MappedSuperclass @Getter public class B..
-
[CS] CQS - Command Query SeparationComputer Science 2021. 12. 30. 17:23
Betrand Meyer에 의해 개념이 정리된 Command Query Separation(이하 CQS)는 질의(query)와 명령(command)을 정확히 분리하는 것을 목적으로 한다. - query(질의)는 결과값을 반환하고, 시스템의 상태를 변화시키지 않는다. 즉 부작용에서 자유롭다.(free of side effets) - command(명령)은 결과를 반환하지 않고, 시스템의 상태를 변경한다. 기본적으로 이 원칙을 지켜야지만 상황에 따라 예외를 두어야한다. cqs의 예외 중 하나는 stack의 pop이다. pop함수는 스택의 맨 위의 값을 빼서(command) 반환(query)하는 일까지 병행한다. cqs를 기본적으로 지키되 필요할 때는 예외를 두는 것이 효율적이다. 예를 들어 insert의 경..
-
[Spring] EntityGraphSpring 2021. 12. 29. 17:22
//공통 메서드 오버라이드 @Override @EntityGraph(attributePaths = {"team"}) List findAll(); //JPQL + 엔티티 그래프 @EntityGraph(attributePaths = {"team"}) @Query("select m from Member m") List findMemberEntityGraph(); //메서드 이름으로 쿼리에서 특히 편리하다. @EntityGraph(attributePaths = {"team"}) List findByUsername(String username) 페치 조인(Fetch join)의 간편버전 left outer join사용
-
[Spring] 벌크성 수정 쿼리Spring 2021. 12. 28. 00:49
벌크성 수정이란? 대량의 데이터들을 쿼리를 통해 수정한다는 것이다. 대량 처리를 했을 때는 속도가 빠르지만 한행처리에 있어서 속도가 느리다. jpa를 사용한 벌크성 수정 쿼리 테스트 @Modifying @Query("update Member m set m.age = m.age + 1 where m.age >= :age") int bulkAgePlus(@Param("age") int age); - 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용 - 사용하지 않으면 다음 예외 발생 - 벌크성 쿼리를 실행하고 나서 영속성 컨텍스트 초기화 : @Modifying(clearAutomatically = true) - 이 옵션 없이 회원을 findById로 다시 조회하면 영속성 컨텍스트에 과거 값이 ..
-
[Spring] spring data jpa 페이징과 정렬Spring 2021. 12. 25. 00:31
스프링에는 페이징이 편리하게 할 수 있는 방법이 있다. 페이징과 정렬 파라미터 - org.springframework.data.domain.Sort : 정렬 기능 - org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) 특별한 반환 타입 - org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징 - org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능 (내부적으로 limit + 1 조회) - List(자바 컬렉션) : 추가 count 쿼리 없이 결과만 반환 페이징과 정렬 사용 예제 Page findByUsername(..
-
[Spring] Spring Data JPA 반환타입 정하기Spring 2021. 12. 22. 15:53
스프링 데이터 jpa는 유연한 반환 타입을 지원한다. 참고(Spring Data JPA - Reference Documentation) 스프링 데이터 jpa는 조회결과가 많거나 없을 때 - 컬렉션 - 결과 없음 : 빈 컬렉션 반환 - 단건 조회 - 결과 없음 : null 반환 - 결과가 2건이상 : javax.persistence.NonUniqueResultException 예외 발생 을 한다. 때문에 컬렉션을 쓰는 경우 null체크가 비교적 쉬우니 컬렉션으로 반환하고, 단건 조회를 하는 경우 Optional을 활용해 null체크를 하는 것이 좋다. 출처 : 실전! 스프링 데이터 JPA - 인프런 | 학습 페이지 (inflearn.com)
-
[Spring] @Query, 레포지토리 메소드에 쿼리 정의하기Spring 2021. 12. 22. 15:48
가끔 복잡한 쿼리가 발생했을 경우, 스프링데이터 jpa의 이름정의만으로 구현하기 힘들어질 때가있다. 이 때, 어플리케이션 실행 시점에 문법 오류를 발견할 수 있는 큰 장점을 지니면서 빠르게 구현이 가능한 방법이 있는데 바로 @Query 어노테이션을 활용하는 방법이다. @Query("select m from Member m where m.username= :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); 함수단에서 그냥 jpql을 쓰는 것과 구현방법에서 차이가 없지만 차이가 있다면 바로 어플리케이션 실행시점에서 문법오류를 잡아준다는 점이다. 그래서 쿼리가 복잡해지거나 조건이..