👻 저장 API를 만들어 봅시다!.
RestController 를 생성하여 save() 라는 기능을 만들어 봅시다.
현재 조립해야 할 클래스들은 PostsService 클래스와 PostsSaveRequestDto 클래스 2가지가 있습니다.
이 2가지도 같이 생성하겠습니다.
@RequiredArgsConstructor -> final 필드의 생성자를 만들어줍니다.
@RestController -> @ResponseBody + @Controller 인 기능입니다.
public class PostsApiController {
private final PostsService postsService;
@PostMapping("/api/v1/posts") -> http 메서드의 Post 메서드를 사용합니다.
public Long save(@RequestBody PostsSaveRequestDto requestDto) { -> 요쳥을 Dto 로 날립니다.
return postsService.save(requestDto);
}
}
@RequiredArgsConstructor
@Service
public class PostsService {
private final PostsRepository postsRepository;
@Transactional -> 트랜잭션 설정을 합니다.
public Long save(PostsSaveRequestDto requestDto) {
return postsRepository.save(requestDto.toEntity()).getId();
}
}
@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();
}
}
dto 를 절대적으로 domain 객체로 사용하시면 큰일 납니다.!!!
dto 클래스를 따로 만들어 사용 해야합니다. 다음으로 toEntity() 기능은 자신의 필드 값으로 Posts 객체를 생성하는 기능입니다.
자 그러면 여기까지 API 의 저장 기능을 만들어 보았습니다. 그러면 다음으로는 무엇을 하셔야 할 까요?
테스트 코드를 작성해야합니다!!
테스트 코드를 작성해볼까요??
@SpringBootTest
class PostsServiceTest{
@Autowired
PostsService postsService;
@Test
@DisplayName("PostsService_TEST")
void PostsServiceTest() {
// given
PostsSaveRequestDto dto = PostsSaveRequestDto.builder()
.title("테스트")
.content("테스트 중 입니다.")
.author("홍길동")
.build();
// when
Long saveId = postsService.save(dto);
// then
assertThat(saveId).isNotNull();
assertThat(saveId).isEqualTo(1L);
}
}
Service 클래스의 테스트 코드입니다. 잘 작동하는 것을 확인해 보실 수 있습니다!
다음으로는 Controller 클래스를 테스트 해볼까요??
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class PostsApiControllerTest{
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private PostsRepository postsRepository;
@AfterEach
public void clean() {
postsRepository.deleteAll();
}
@Test
@DisplayName("Posts_등록_TEST")
void PostsApiControllerTest() {
// given
PostsSaveRequestDto dto = PostsSaveRequestDto.builder()
.title("테스트")
.content("테스트 중 입니다.")
.author("홍길동")
.build();
String url = "<http://localhost>:" + port + "/api/v1/posts";
// when
ResponseEntity<Long>responseEntity = restTemplate.postForEntity(url, dto, Long.class);
// then
assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(responseEntity.getBody()).isGreaterThan(0L);
List<Posts>all = postsRepository.findAll();
assertThat(all.get(0)).isNotNull();
assertThat(all.get(0).getTitle()).isEqualTo(dto.getTitle());
assertThat(all.get(0).getContent()).isEqualTo(dto.getContent());
assertThat(all.get(0).getAuthor()).isEqualTo(dto.getAuthor());
}
}
@WebMvcTest 로 SliceTest를 해야하는데 지금은 JPA를 사용하여 테스트를 하기 때문에 @SpringBootTest로 테스트를 하겠습니다.
포트는 랜덤 포드를 사용하여 검증 합니다.
'Book > Spring boot 와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
[Book] 13) JPA Auditing으로 생성시간/수정시간 자동화 하기! (0) | 2022.04.01 |
---|---|
[Book] 12) H2 DB 웹 콘솔에서 직접 접근해보자! (0) | 2022.04.01 |
[Book] 11) API 만들어보기! -4 (0) | 2022.03.31 |
[Book] 10) API 만들어보기! -3 (0) | 2022.03.31 |
[Book] 8) API 만들어보기! - 1 (0) | 2022.03.30 |
[Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈 (0) | 2022.03.30 |
[Book] 6) JPA 로 데이터베이스를 다루어보자! (0) | 2022.03.29 |
[Book] 5) 롬복(Lombok) 을 사용해보자! (0) | 2022.03.28 |