[내일배움캠프] 3월 1주차 WIL 회고록
이번주 요약 : Querydsl 강의 시청 및 공부, 테스트 코드 작성
월요일, 화요일 : Querydsl 공부
Querydsl :
- 문법 오류를 컴파일 시점에 잡아줄 수 있다.
- 쿼리를 자바 코드로 작성한다.
- 동적 쿼리 문제 해결
- 쉬운 SQL 스타일 문법
JPQL과 다른 점은 (좋은 점)
JPQL을 사용할 때 만약 이 SQL 쿼리에서 오타가 나도 인텔리제이에선 잡아주지 않아서 오류가 난 뒤에야 이 쿼리가 오류가 있다는 것을 알 수 있다.
String qlString = "select m from Member m"
+ " where m.username = :username";
하지만 Querydsl은 오타가 나면 인텔리제이에서 바로 잡아준다. (컴파일 시점에서 오류를 발견할 수 있다.)
그리고 JPQL은 setParameter 를 사용해서 파라미터 바인딩을 해줘야 하지만 Querydsl은 알아서 자동으로 파라미터 바인딩을 해준다.
Member findMember = em.createQuery(qlString, Member.class)
.setParameter("username", "member1")
.getSingleResult();
그리고 Querydsl은 코드 어시스턴스도 해줘서 정말 편리하다.
목요일, 금요일 : 테스트 코드 작성
원래는 Mockito를 사용하여 테스트 코드를 작성하려 했는데 유저 인증(댓글을 수정 및 삭제 시 작성한 유저가 맞는지 확인하는 기능) 부분에서 막혀버려서 결국 Mockito를 사용하지 않고 Junit을 이용해서 테스트 코드를 작성했다.
@BeforeEach 를 사용해서 테스트 메서드 실행 이전에 수행되도록 만들었다.
@BeforeEach
public void beforeEach() throws IOException {
Long questionBoardId = 1L;
Long communityBoardId = 2L;
// 질문 댓글 작성 요청
CommentRequest request = new CommentRequest("질문댓글");
// 잡담 댓글 작성 요청
CommentRequest request2 = new CommentRequest("잡담댓글");
// findById를 사용해서 1번 유저 저장
Optional<User> findUser = userRepository.findById(1L);
// 질문 댓글 작성
commentService.createQuestionComment(questionBoardId, request, findUser.get());
// 잡담 댓글 작성
commentService.createCommunityComment(communityBoardId, request2, findUser.get());
}
테스트 코드를 작성한 후 단위 테스트를 실행해보니 전부 통과가 된다. 근데 통합 테스트를 실행해보니 통과가 안된다.
이 부분을 어떻게 하면 좋을지 고민하다 목요일이 끝났다.
어제 테스트 코드를 한꺼번에 실행하면 통과가 안되는 오류를 고치려고 시도해봤다.
팀원분한테 물어보니 id가 겹치면 테스트가 실패한다고 해서 실제 기능이 수행되듯이 테스트 코드를 짜보려고 했다.
댓글을 수정하는 기능 테스트에서 코드를 리팩토링 해봤다.
@Override
@Transactional
public Comment createQuestionComment(Long questionBoardId, CommentRequest requestDto,
User user) {
// if (existsCommentByBoardIdAndUserId(questionBoardId, user.getId())) {
// throw new CustomException(ExceptionStatus.COMMENT_IS_EXIST);
// }
// 댓글 생성
Comment comment = new Comment(user, requestDto, questionBoardId);
commentRepository.save(comment);
return comment;
}
저번에는 beforeEach를 사용해서 Optinal<Comment> comment = commentReposiotry.findById(1L) 이런식으로 댓글을 불러와서 사용했는데 이번에는 comment 생성자에 직접 댓글을 저장시켰다.
// 질문 댓글 작성
@Test
@DisplayName("질문 댓글 작성")
void createQuestionComment() {
// given
// 질문 댓글 요청
CommentRequest request = new CommentRequest("질문댓글");
// 1번 유저 저장
Optional<User> findUser = userRepository.findById(1L);
// when
// comment 생성자에 댓글을 만들어서 넣는다 (설명하기 어렵네요ㅜㅜ)
Comment comment = commentService.createQuestionComment(1L, request, findUser.get());
// then
// comment에 댓글 ("질문댓글") 이랑 request.getContent() = ("질문댓글") 이랑 같은지 확인
assertThat(comment.getContent()).isEqualTo(request.getContent());
// 자신이 만든 질문 게시글에 댓글을 달면 나오는 익셉션 테스트, 서비스에서 주석 풀면 정상 작동
// assertThrows(CustomException.class,
// () -> commentService.createQuestionComment(1L, request, findUser.get()));
}
실행해보니 테스트 통과도 되고 비슷하게 수정 및 삭제도 만든 후 통합 테스트를 돌려보니 전부 다 통과가 된다.
다음주 목표 : 열심히 하기