이 글은 이 책을 기준으로 쓰여졌습니다.
오늘은 글 수정,조회 API를 구축하고, JPA Auditing을 적용하여 글을 언제 만들었고 수정되었는지를 자동으로 저장할 수 있도록 했다.
먼저 컨트롤러에 update 메서드와 글 조회를 위한 findById 메서드를 만들어 준다.
응답용 Dto 클래스도 작성. 별 내용은 없다
글 수정시 수정할 글 정보를 담고 있는 Dto 이다. title과 content를 필드로 가지고 있다.
Posts 클래스에도 글 수정을 위한 update 메서드를 만들어 준다.
PostsService에서 눈여겨 볼 것이 있다면, 쿼리를 날리는 부분이 없다는 것이다. 이는 JPA의 영속성 컨텍스트 라는 특성 때문이라고 한다. JPA의 엔티티 매니저가 활성화된 상태로 트랜잭션 안에서 DB에서 데이터를 가져오면 트랜잭션이 끝나는 시점에서 해당 테이블에 변경내용이 반영된다. 이를 더티 체킹이라고 한다.
@Test
public void Posts_수정된다() throws Exception{
//given
Posts savedPosts = postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
Long updateId = savedPosts.getId();
String expectedTitle = "title2";
String expectedContent = "content2";
PostsUpdateRequestDto requestDto = PostsUpdateRequestDto.builder()
.title(expectedTitle)
.content(expectedContent)
.build();
String url = "http://localhost:" + port + "/api/v1/posts/" + updateId;
HttpEntity<PostsUpdateRequestDto> requestEntity = new HttpEntity<>(requestDto);
//when
ResponseEntity<Long> responseEntity = restTemplate.exchange(url, HttpMethod.PUT,
requestEntity, Long.class);
//then
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(responseEntity.getBody()).isGreaterThan(0L);
List<Posts> all = postsRepository.findAll();
assertThat(all.get(0).getTitle()).isEqualTo(expectedTitle);
assertThat(all.get(0).getContent()).isEqualTo(expectedContent);
}
PostsApiControllerTest에 방금 추가한 기능들을 테스트하기 위한 테스트 코드도 작성하였다.
그리고 실제로 웹 화면에서 확인해보기 위해 톰캣을 실행시켰다.
application에서 main 메서드를 실행하고 localhost:8080/h2-console 로 접속했다.
이런 로그인 창이 나오는데 JDBC URL 부분을 꼭 jdbc:h2:mem:testdb로 맞춰줘야 한다고 한다.
Connect를 통해 db 관리 페이지에 접속할 수 있다. 좌측에 posts 테이블도 잘 확인되는것을 볼 수 있다.
insert into posts (author,content,title) values ('author','content','title');
이 쿼리를 통해 post를 하나 만들어준다.
그리고 localhost:8080/api/v1/posts/1 에 접속해주면,
이렇게 작성한 내용이 잘 조회된다.
그 후 JPA Auditing을 이용해 글 작성,수정 시간을 자동으로 기록해주는 기능을 적용했다.
BaseTimeEntity에서 EntityListener를 통해 AuditingEntityListener를 사용하게 하고, createdDate와 modifiedDate 필드를 만들어 놓는다.
- @MappedSuperclass : JPA Entitiy 클래스들이 BaseTimeEntity를 상속할 경우 필드들도 칼럼으로 자동 인식되도록 함
- @EntityListeners : 기능 포함
- @CreatedDate : Entity가 생성되어 저장될 때 시간 자동 저장
- @LastModifiedDate : Entity의 값이 변경될 때 시간 자동 저장
Posts클래스가 BaseTimeEntity를 상속하게 하고,
Application클래스에 어노테이션만 하나 추가해주면 적용 완료이다.
@Test
public void BaseTimeEntity_등록(){
//given
LocalDateTime now = LocalDateTime.of(2020,12,24,0,0,0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
System.out.println(">>>>>>> createDate="+posts.getCreatedDate()+"," +
" modifiedDate="+posts.getModifiedDate());
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
PostsRepositoryTest클래스에 이를 테스트하기 위한 테스트 코드를 작성했다.
로그에 createdDate와 modifiedDate가 잘 출력되는것을 확인할 수 있다.
'따라 공부하기 > Spring boot 혼자 개발하는 웹 서비스' 카테고리의 다른 글
[Spring Boot]부트스트랩 이용하여 게시글 등록화면 만들기 (0) | 2020.12.26 |
---|---|
[Spring Boot]머스테치 플러그인 설치 후 기본 페이지 만들기 (0) | 2020.12.25 |
[Spring Boot]Spring의 웹 계층과 등록 API 만들기 (0) | 2020.12.23 |
[Spring Boot]JPA 적용과 테스트 코드 작성 (0) | 2020.12.22 |
[Spring Boot]롬복(lombok) 설치와 테스트 (0) | 2020.12.21 |
댓글