728x90

Programming 275

Querydsl - 중급 문법 (1) (프로젝션)

- 프로젝션과 결과 반환 - 기본 - 프로젝션 : select 대상 지정 - 프로젝션 대상이 하나 List result = queryFactory .select(member.username) .from(member) .fetch(); - 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다. - 프로젝션 대상이 둘 이상이면 Tuple이나 DTO로 조회해야 한다. - 튜플 조회 - 프로젝션 대상이 둘 이상일 때 사용한다. @Test public void Tuple() { List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username..

Querydsl - 기본 문법 (3) (조인, 서브 쿼리, Case문, 상수, 문자 더하기)

- 조인 - 기본 조인 /* * 팀 A에 소속된 모든 회원 * */ @Test public void join() { List result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(result) .extracting("username") .containsExactly("member1", "member2"); } - join(member.team, team)을 통해 join을 할 수 있다. join만 작성하게 되면 inner join을 기본으로 한다. - 조인 - ON절 /* * 회원과 팀을 조인하면서, 팀 이름이 teamA인 팀만 조인, 회원은 모두 ..

Querydsl - 기본 문법 (2) (결과 조회, 정렬, 페이징, 집합)

- 결과 조회 1. fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 2. fetchOne() : 단 건 조회 2.1. 결과가 없으면 : null 2.2. 결과가 둘 이상이면 : NonUniqueResultException 예외 발생 3. fetchFirst() : limit(1).fetchOne() 4. fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 5. fetchCount() : count 쿼리로 변경해서 count 수 조회 @Test public void resultFetch() { // List fetch = queryFactory // .selectFrom(member) // .fetch(); // // Member fetchOne = que..

Querydsl - Querydsl 설정

- Querydsl의 경우 설정이 간단하지 않다. - Spring Boot를 통해 프로젝트를 생성한 상태에서 진행한다. - build.gradle plugins { id 'java' id 'org.springframework.boot' version '2.7.14' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } depende..

Spring Data JPA - 새로운 엔티티 구별하기

- JPA의 save() 메서드 1. 새로운 엔티티면 저장(persist) 2. 새로운 엔티티가 아니면 병합(merge) - 새로운 엔티티를 판단하는 기본 전략 1. 식별자가 객체일 때 null 로 판단 2. 식별자가 자바 기본 타입일 때 0 으로 판단 3. Persistable 인터페이스를 구현해서 판단 로직 변경 가능 - Item 엔티티 @Entity @Getter public class Item { @Id @GeneratedValue private Long id; } - Item Repository public interface ItemRepository extends JpaRepository { } - save() 메서드 @Transactional @Override public S save(S e..

Programming/Spring 2023.07.26

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 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩하거나 엔티티 ..

Programming/Spring 2023.07.26

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..

Programming/Spring 2023.07.26

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

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

Programming/Spring 2023.07.26

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..

Programming/Spring 2023.07.26
728x90