🥛 Q도메인 클래스 생성을 확인했는가?
🍼 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가 칼럼에 값이 들어가지 않는 결과가 발생했다면
를 확인해보자.
엔티티 클래스는 가능하면 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()를 했을 경우에 동작하게 된다.
정상적으로 동작하는지를 확인하기 위해 테스트 코드를 작성한다.
@Test
public void updateTest(){
Optional<Guestbook> guestbook = repository.findById(200L);
if (guestbook.isPresent()){
Guestbook result = guestbook.get();
result.changeContent("고마워서 그래 엄마");
repository.save(result);
}
}
위의 테스트 코드를 실행한 후 데이터베이스에 moddate 컬럼의 값이 변경되었는지 확인한다. (성공)