java 84

[JAVA] 벌크성 수정 쿼리와 @EntityGraph

Bulk 벌크(bulk) 연산은 중간에 update 쿼리를 날려버린다.( 영속성 컨텍스트 모르게 ) , 따라서 벌크연산을 진행하면 DB에는 반영이 되어있지만 영속성 컨텍스트에는 반영이 되어있지 X 그래서 벌크연산 후 영속성 컨텍스트를 clear 해주지 않으면 업데이트 되지 않은 값이 출력된다. → 매우 불편!! 이때 매번 clear를 해줄 수 없으니까 annotation을 사용해보자! → @Modifying 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용한다. 사용하지 않으면 예외 발생(Not supported for DML operations....) 벌크연산을 사용해도 fetch와 똑같이 한방쿼리가 실행됨 // 벌크연산 사용 @Modifying @Query("update Member ..

JAVA 2022.02.23

[JAVA] Spring data JPA 페이징과 정렬

페이징과 정렬 파라미터 Sort : 정렬 기능 Pageable : 페이징 기능( 내부 Sort 포함 ) 특별한 반환 타입 1. Page : 추가 count 쿼리 결과를 포함하는 페이징 → 일반적인 페이징 2. Slice : 추가 count 쿼리 없이 다음 페이지만 확인가능 → 스크롤 내리다 더보기 버튼 생성 하는 페이징 3. List : 추가 count 쿼리 없이 결과만 반환한다. ※ 여기서 count는 total count를 의미 Page findByAge(int age, Pageable pageable); @Test public void paging() throws Exception{ //given memberRepository.save(new Member("member1", 10)); memberR..

JAVA 2022.02.17

[JAVA] return type(Optional)

spring jpa는 유연한 반환 타입을 지원한다. 1. Collection(List)로 반환 : List 및 Collection은 데이터가 없어도 절대 null 이 뜨지 않는다. empty 컬렉션이 반환이 된다. → size 0으로 찍힘(null 처리 따로 안해줘도됨) List findListByUsername(String username); // 컬렉션 /*-------------------------------------------------------*/ // Test Code @Test public void returnType() throws Exception{ //given Member m1 = new Member("AAA", 10); Member m2 = new Member("BBB", 20..

JAVA 2022.02.16

[JAVA] @Query에서 DTO로 조회하기

repository에서 dto로 조회하려면 new operation을 사용해야한다. 1. 일단 내가 필요한 데이터 들을 뽑아 Dto로 생성 package study.datajpa.dto; import lombok.Data; @Data // getter, setter 다 쓰임 웬만하면 사용 X public class MemberDto { private Long id; private String username; private String teamName; public MemberDto(Long id, String username, String teamName) { this.id = id; this.username = username; this.teamName = teamName; } } 2. @Query와..

JAVA 2022.02.15

[JAVA] @NamedQuery 와 @Query

@NamedQuery - 장점 NamedQuery는 애플리케이션 로딩 시점에 버그를 잡을 수 있다는 장점이 있지만 실무에서 잘 사용하지 않는다. - 단점 파싱이 안된다. 기능을 호출 하기 전까지는 버그를 잡을 수 없다. @Query 애플리케이션 로딩 전에 쿼리를 다 sql로 파싱해서 만들어 둔다. → 그렇다면 애플리케이션 실행 전에 버그를 잡을 수 있다. @Query("select m from Member m where m.username = :username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); @Query("select m.username from Member m") Lis..

JAVA 2022.02.15

[JAVA] 변경감지와 병합(merge)

준영속 엔티티 영속성 컨텍스트가 더이상 관리하지 않는 엔티티 준영속 엔티티를 수정하는 방법 변경감지 기능 사용(Dirty Checking) 병합(merge) 사용 변경감지기능 사용(itemService에서 작성) /** * 변경감지 */ @Transactional public void updateItem(Long itemId, Book param){ Item findItem = itemRepository.findOne(itemId); findItem.setName(param.getName()); findItem.setPrice(param.getPrice()); findItem.setStockQuantity(param.getStockQuantity()); } 여기서 itemRepository.save 를 ..

JAVA 2022.02.10

[JAVA] AllArgsConstructor vs RequiredArgsConstructor

@AllArgsConstructor Autowired로 repository를 바로 주입하면 변경이 불가능하다 따라서 아래 처럼 메소드가 필요 private final MemberRepository memberRepository; // 생성자 인젝션을 주입함 -> autowired 를 지워도 spring에서 자동으로 주입해줌 // 이게 AllArgsConstructor를 주입하는것과 같음 @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } 위처럼 생성자 인젝션을 쓰면 한번 생성될때 모든게 완성되서 나중에 누군가 set 할 수 없다. 또한 테스트 케이스를 작성..

JAVA 2022.02.10

[JAVA] 쿼리 파라미터 남기기

쿼리 파라미터란? 콘솔에 뜨는 SQL 구문들에 들어가는 파라미터들이 ? 로 찍히는 부분을 말한다. 이 물음표에 들어가는 값들을 실시간으로 콘솔에서 확인하고 싶으면 아래의 경우를 참고하자! 1. 설정파일 logging에 다음을 추가하기 org.hibernate.type: SQL 실행 파라미터를 로그로 남긴다 2. 외부 라이브러리 추가 https://github.com/gavlyukovskiy/spring-boot-data-source-decorator GitHub - gavlyukovskiy/spring-boot-data-source-decorator: Spring Boot integration with p6spy, datasource-proxy, flexy-pool and s Spring Boot int..

JAVA 2022.01.20

[JAVA] fetch join

실무에서 너무 자주쓰임 중요! SQL 조인의 종류가 아님 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회( 한방 쿼리 ) join fetch 명령어 사용 회원을 조회하면서 연관된 팀도 함께 조회(SQL 한번에) SQL을 보면 회원 뿐만 아니라 팀(T.*) 도 함께 select 함 예시 ) 회원 1, 2는 팀 A / 회원3은 팀B 라고 가정한다. 1. 일반 조인을 사용했을 시 String query = "select m from Member m join m.team t"; List findMember = em.createQuery(query, Member.class).getResultList(); // 이때의 결과값은 프록시 데이터 이때 회원리스트를 뽑아 콘..

JAVA 2022.01.18

[JAVA] JPA 조인과 서브쿼리

1. 내부조인 select m from Member m inner join m.team t 2. 외부조인 select m from Member m left join m.team t 3. 세타조인 select count(m) from Member m, Team t where m.username=t.name 서브쿼리 - JPA 서브쿼리의 한계 JPA는 where, having 절에서만 서브 쿼리 사용 가능 select 절도 가능(하이버네이트 지원) from 절의 서브 쿼리는 현재 jpql에서 불가능: 조인으로 풀어서 사용할 수 있으면 해결

JAVA 2022.01.18