[Springboot]-QClass생성과 엔티티 테스트(Querydsl)

ACAI BERRY DEVELOVER·2023년 6월 25일
0
post-thumbnail

🥛 Q도메인 클래스 생성을 확인했는가?

  • 생성된 파일들은 모두 'Q'로 시작하고 이후는 엔티티 클래스의 이름과 동일하게 만들어진다. 생성된 Q도메인 클래스를 보면 내부적으로 선언된 필드(컬럼)등이 변수처리된 것을 확인할 수 있다.
  • 자동으로 생성된다는 사실이 의미한다는 것은 Q로 시작되는 클래스들은 개발자가 직접 건드리지 않는다는 것이다.
  • gradle의 compileJava를 통해 자동으로 생성되는 방법만을 사용한다.

🍼 Querydsl을 이용하게 되면 레포지토리 인터페이스 역시 QuerydslPredicateExecutor라는 인터페이스를 추가로 상속한다.


☕️ 엔티티의 테스트

Querydsl 위주의 예제로 테스트를 진행한다.
300개의 테스트 데이터를 넣어본다.

@Log4j2
@SpringBootTest
public class GuestbookRepositoryTests {

    @Autowired
    GuestbookRepository repository;

    //300개의 테스트 데이터 넣기
    @Test
    public void insertDummies(){
        IntStream.rangeClosed(1,300).forEach(i ->{
            Guestbook guestbook = Guestbook.builder()
                    .title("title..." + i).writer("user" + (i%10)).content("content....." + i).build();
            log.info(repository.save(guestbook));
        });

    }
}
  • 테스트 시 로그남기고 싶을 때 의존성 추가

    dependencies{
    testCompileOnly 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.12' // 테스트 의존성 추가
    }

🍮 위의 코드를 실행해 데이터베이스상에 300개의 데이터가 생성되었는지 확인한다.
또한 테이블의 컬럼중 moddate와 regdate가 잘 생성되었는지, 시간값이 null이 아닌 값이 들어갔는지 확인한다

🍵 만일 정상적으로 regdate와 moddate가 칼럼에 값이 들어가지 않는 결과가 발생했다면

  • @mappedSuperClass가 붙은 BaseEntity클래스의 내용 확인
  • 앱 구동 클래스에 @EnableJpaAuditing의 적용 여부
  • 해당 클래스의 상속 선언 부분(extends...)

를 확인해보자.


수정 시간 테스트

엔티티 클래스는 가능하면 setter 관련 기능을 만들지 않는 것이 권장사항이다. 하지만 필요에 따라서 수정 기능을 만들기도 한다(엔티티 객체가 애플리케이션 내부에서 변경되면 JPA를 관리하는 쪽이 복잡해질 우려가 있기 때문에 가능하면 최소한의 수정이 가능하도록 하는 것을 권장한다.)

  • 도메인
package com.example.demo.Entity;

import jakarta.persistence.*;
import lombok.*;

@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
public class Guestbook extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long gno;
    @Column(length= 100, nullable = false)
    private String title;
    @Column(length= 1500, nullable = false)
    private String content;
    @Column(length= 50, nullable = false)
    private String writer;

    public void changeTitle(String title){
        this.title = title;
    }
    public void changeContent(String content){
        this.content = content;
    }
}


🍼 BaseEntity의 modDate는 최종 수정 시간이 반영되기 때문에 특정한 엔티티를 수정한 후에 save()를 했을 경우에 동작하게 된다.

정상적으로 동작하는지를 확인하기 위해 테스트 코드를 작성한다.

  • repository테스트
@Test
    public void updateTest(){
        Optional<Guestbook> guestbook = repository.findById(200L);
        if (guestbook.isPresent()){
            Guestbook result = guestbook.get();
            result.changeContent("고마워서 그래 엄마");
            repository.save(result);
        }
    }

위의 테스트 코드를 실행한 후 데이터베이스에 moddate 컬럼의 값이 변경되었는지 확인한다. (성공)

profile
쓸때 대충 쓰지 말고! 공부하면서 써!

0개의 댓글