스프링 부트로 구현하는 웹서비스 - 7 게시글 저장

Bumgu·2023년 7월 15일
0
@Getter  
@NoArgsConstructor  
public class PostsSaveRequestDto {  
private String title;  
private String content;  
private String author;  
  
@Builder  
public PostsSaveRequestDto(String title, String content, String author) {  
this.title = title;  
this.content = content ;  
this.author = author;  
}  
public Posts toEntity(){  
return Posts.builder()  
.title(title)  
.content(content)  
.author(author)  
.build();  
}  
}

Entity클래스와 거의 유사한 형태임에도 Dto 클래스를 추가로 생성함.
하지만, 절대로 Entity클래스를 Request/Response 클래스로 사용해서는 안된다.
Entity 클래스는 데이터베이스와 맞닿은 핵심 클래스 이기 때문에, Entity클래스를 기중으로 테이블이 생성되고, 스키마가 변경됨.


PostsApiController.java

@RequiredArgsConstructor  
@Service  
public class PostsService {  
private final PostsRepository postsRepository;  
  
@Transactional  
public Long save(PostsSaveRequestDto requestDto){  
return postsRepository.save(requestDto.toEntity()).getId();  
}

PostsApiControllerTest.java

@ExtendWith(SpringExtension.class)  
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)  
public class PostsApiControllerTest {  
  
@LocalServerPort  
private int port;  
  
@Autowired  
private TestRestTemplate restTemplate;  
  
@Autowired  
private PostsRepository postsRepository;  
  
@After("")  
public void tearDown() throws Exception{  
postsRepository.deleteAll();  
}  
  
@Test  
public void Posts_등록() throws Exception {  
//given  
String title = "title";  
String content = "content";  
PostsSaveRequestDto requestDto = PostsSaveRequestDto.builder()  
.title(title)  
.content(content)  
.author("author")  
.build();  
String url = "http://localhost:" + port + "/api/v1/posts";  
  
  
//when  
ResponseEntity<Long> responseEntity = restTemplate.postForEntity(url, requestDto, 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(title);  
assertThat(all.get(0).getContent()).isEqualTo(content);  
  
}  
}

HelloController와 달리 @WebMvcTest를 사용하지 않음.
@WebMvcTest의 경우 JPA 기능이 작동하지 않기 떄문
Controller와 ControllerAdvice등 외부 연동과 관련된 부분만 활성화 된니 JPA 기능까지 한번에 테스트 할때는 @SpringBootTestTestRestTemplate를 사용하면 된다.

profile
Software VS Me

0개의 댓글