JAVA 81

[TEST] 예외 발생 테스트

만약 예외가 발생하는 코드를 테스트 할때 회원가입 중복 확인 테스트 진행 시 IllegalStateException (이미 존재하는 회원) 을 처리해주지 않으면 테스트 코드 실행 시 실패로 뜸 Test 어노테이션 옆에 excepted를 지정해주면 해당 exception 발생시에는 그냥 넘어갈 수 있다 @Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception{ //given Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); //when memberService.joi..

JAVA 2022.03.08

[JAVA] Q-Type

Q-Type class는 Querydsl을 설정을 진행을 완료하면 @Entity가 붙은 클래스를 찾아 자동으로 생성된다. 예 ) @Entity가 붙은 User.java 의 QUser.java 클래스 파일이 자동으로 생성됨 이러한 Q-Type의 class들은 Querydsl을 사용할 때 우리가 만든 도메인 클래스의 구조를 설명해주는 역할을 한다. Q class 인스턴스를 사용하는 방법은 2가지가 있다. 1. 별칭 직접 지정 QMember qMember = new QMember("m"); 2. 기본 인스턴스 사용 QMember qMember = QMember.member; 이걸 더 줄여서 사용하기 위해 static import와 함께 사용한다. 아래 처럼 선언하면 굳이 선언을 해주지 않아도 사용 할 수 있다..

JAVA 2022.03.07

[TEST] 날짜 자동 생성 테스트

test code 작성 중 문제 발생 [문제] createdDate 자동 생성 테스트 코드 작성 중 문제가 발생 → 테스트를 위해 우선 데이터를 삽입 후 날짜를 비교해야 하는데 날짜가 null로 삽입됨 [해결] BaseTimeEntity에 @EntityListeners(AuditingEntityListener.class) 을 이용해 JPA 청취 기능을 하는데 main함수가 있는 클래스에서 JPA 청취 가능을 시켜주지 않으면 사용이 불가하다. 따라서 기능 구현을 할 클래스에 @EnableJpaAuditing 어노테이션을 붙여주면 생성됨 package movie.finder.Repository; import movie.finder.domain.Movie; import movie.finder.repositor..

JAVA 2022.03.03

[JAVA] Querydsl 설정

Querydsl build.gradle 작성 시 유의사항 보통 요즘은 spring boot 2.6 이상 이기 때문에 Querydsl을 5.0을 사용한다. 또한 2.6 이상부터는 다음과 같은 부분을 확인해야 한다. build.gradle 설정 변경 PageableExecutionUtils Deprecated(향후 미지원) 패키지 변경 Querydsl fetchResults() , fetchCount() Deprecated(향후 미지원) build.gradle 설정 방법 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-man..

JAVA 2022.03.03

[JAVA] web 확장 - 페이징과 정렬

Spring data가 제공하는 페이징과 정렬 기능을 사용할 수 있다. @GetMapping("/members") public Page list(@PageableDefault(size = 5, sort = "id") Pageable pageable){ // 만약 page를 1 부터 시작하고 싶다면? -> 기본이 0 // 아래 처럼 구현체를 새로 만들어 다른 클래스로 넘겨주면됨 // PageRequest request = PageRequest.of(1, 2); // new MemberDto(member); 를 메소드 레퍼런스를 써서 저렇게 변경 가능 return memberRepository.findAll(pageable) .map(MemberDto::new); } 또한 파라미터로 Pageable을 받을 ..

JAVA 2022.03.03

[JAVA] Auditing

엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? 등록일/수정일 , 등록자/수정자를 등록시켜주자! MainApplication에 @EnableJpaAuditing Annotation 추가 한다. BaseEntity에 @EntityListeners(AuditingEntityListener.class) 추가 아래와 같이 작성 가능하다. @EntityListeners(AuditingEntityListener.class) @MappedSuperclass @Getter public class BaseEntity{ @CreatedDate @Column(updatable = false) private LocalDateTime createdDate; @LastModifiedDate private Loc..

JAVA 2022.02.24

[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