kkkkkkkkkkkk
kkkkk
kkkkkkkkkkkk
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS & OS
    • Algorithms
    • Laguage
    • Book
      • 객체지향의 사실과 오해
      • Effective Java
      • Spring boot 와 AWS로 혼자 구현하는 ..
      • 도메인 주도 계발 시작하기
    • DB
    • Spring
    • Spring Boot
    • JPA
    • Git
    • Clean Code
    • HTTP

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 설계 원칙
  • 역할
  • 책임
  • 결합도
  • 객체지향 프로그래밍
  • 응집도

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kkkkkkkkkkkk

kkkkk

Book/Spring boot 와 AWS로 혼자 구현하는 웹서비스

[Book] 9) API 만들어보기! - 2

2022. 3. 30. 19:02

👻  저장 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
    'Book/Spring boot 와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
    • [Book] 11) API 만들어보기! -4
    • [Book] 10) API 만들어보기! -3
    • [Book] 8) API 만들어보기! - 1
    • [Book] 7) 출력되는 쿼리문을 MySQL 문법으로 수정 후 이슈
    kkkkkkkkkkkk
    kkkkkkkkkkkk

    티스토리툴바