728x90

개발/Spring Data JPA(KYH) 8

Spring Data JPA - Web 확장 (도메인 클래스 컨버터, 페이징과 정렬)

- 도메인 클래스 컨버터 - 도메인 클래스 컨버터 사용 전 @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); - 도메인 클래스 컨버터 사용 후 @GetMapping("/members2/{id}") public String findMember(@PathVariable("id") Member member) { return member.getUsername(); } - 위와 같이 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩하거나 엔티티 ..

Spring Data JPA - Auditing

- Auditing은 데이터베이스 테이블의 생성, 수정, 삭제와 같은 작업들에 대한 변경 이력을 추적하는 기능을 제공하는 방법이다. - JPA를 이용한 방법 @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updateDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createdDate = now; updateDate = now; } @PreUpdate public void preUpdate() { upd..

Spring Data JPA - 사용자 정의 리포지토리

- 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성한다. - 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다. - 스프링 데이터 JPA 인터페이스의 메서드를 직접 구현하고 싶다면 사용자 정의 인터페이스를 사용해야 한다. - JPA 직접 사용(EntityManager) - 스프링 JDBC Template 사용 - MyBatis 사용 - 데이터베이스 커넥션 직접 사용 등등... - Querydsl - 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } - 사용자 정의 인터페이스 구현 클래스 @RequiredArgsConstructor..

Spring Data JPA - @EntityGraph

- ManyToOne의 관계에서 One의 관계에 있는 엔티티가 LAZY일 경우 One의 데이터를 조회할 때마다 쿼리가 실행된다. @Test public void findMemberLazy() { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 10, teamA); memberRepository.save..

Spring Data JPA - (벌크성 수정 쿼리)

- JPA에서 벌크 연산은 executeUpdate()를 통해 JPQL에 update, delete를 지원하였다. - 또한 벌크 연산은 DB에 직접 쿼리를 날리기 때문에 영속성 컨텍스트에 영향을 주지 않았다. - JPA를 이용한 벌크 수정 쿼리 public int bulkAgePlus(int age) { int resultCount = em.createQuery( "update Member m set m.age = m.age +1" + " where m.age >= :age") .setParameter("age", age) .executeUpdate(); return resultCount; } - 벌크 연산과, 파라미터 바인딩을 통해 JPQL에 update 쿼리를 작성하였다. - Test 코드 @Test..

Spring Data JPA - 페이징과 정렬

- JPA 페이징 - Repository 코드 // 페이징 설정 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } // 카운트 설정 public long totalCount(int age) { return em.createQuery("select count(m) from Member m where m.age = :age", Lon..

Spring Data JPA - 쿼리 메소드 (메소드 이름으로 쿼리 생성, @Query)

- 쿼리 메소드 기능 3가지 1. 메소드 이름으로 쿼리 생성 2. 메소드 이름으로 JPA NamedQuery 호출 3. @Query 어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의 - 메소드 이름으로 쿼리 생성 - 순수 JPA Repository public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } ..

Spring Data JPA - 공통 인터페이스 기능

- Member (Entity) @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //매개변수가 없는 생성자 생성과 동시에 접근 지정자를 PROTECTED로 설정한다. @ToString(of = {"id", "username", "age"}) //ToString에 범위를 지정해주지 않으면 양방향 연관관계에 의해 //무한 루프가 발생할 수 있기 때문에 필요한 정보만 입력한다. public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(..

728x90