상똥이의 Back-End 공부방
[Board Project] 19. 게시판 서비스 뷰에 기능 구현하기 본문
[0. 준비]
1. 게시판 페이지 서비스 만들기
- 루트패키지.repository 경로에 service.패키지를 만들어준다
- 그 안에 ArticleService.class를 만들어준다
- test경로의 같은 위치에 test를 만들어준다 (shift+ctrl+t)
2. ArticleService에 어노테이션 붙이기
- @Service
- @RequiredArgsConstructor : 필수 필드에 대한 생성자를 자동으로 만들어주는 롬복 애노테이션
3. ArticleServiceTest에 어노테이션 붙이기
- Spring boot의 슬라이스 테스트 기능은 사용하지 않는다 시간이 오래 걸리기 때문
- 그 대신 @ExtendWith(MockitoExtensions.class) 사용
- @ExtendWith(MockitoExtensions.class)
- @ExtendWith() : JUnit 확장을 지정하는 데 사용
- Mockito : 자바의 테스트 더블(mock, stub, spy)등을 생성하고 사용할 수 있는 라이브러리
- JUnit5와 Mokito를 함께 사용할 때 테스트에서 Mokito의 Mocking 기능을 확장하도록 하는 어노테이션
- @DisplayName("비즈니스 로직 - 게시글")
[2. ArticleService 구현하기]
1. ArticleService 작성
- ArticleReposiory 사용: private final ArticleRepository articleRepository
- @Transactional 클래스 레벨로 붙여줌
(1) 게시글 검색 기능 & 페이지네이션 기능
- public Page<ArticleDto> searchArticles(SearchType title, String search_keyword) { return Page.empty(); }
- public Page<ArticleDto> searchArticles(SearchType title, String search_keyword) 위에 @Transactional(readOnly = true) 붙여줌 : 단순 조회 기능이기 때문
(2) 게시글 조회 기능
- public ArticleDto searchArticle(long l){return null;}
-위에 @Transactional(readOnly = true) 붙여줌
(3) 홈 버튼을 누르면 게시판 페이지로 리다이렉션
- 서비스보다는 컨트롤러 로직이 맞음
- 컨트롤러 로직에서 생성
- java.루트페이지.controller 경로에 MainController.class 생성
- 클래스 레벨로 @Controller 붙이기
- @GetMapping("/"): 루트 페이지로 간다
- public String root() { return "redirect/articles" };
[3. ArticleServiceTest 구현하기]
1. 테스트 준비
(0) given when then 방식
(1) private ArticleService sut;
- sut = system under test의 약자, ArticleService가 테스트 대상이라는 뜻
- @InjectMocks 붙이기 : mockito 애노테이션, mock을 주입하는 대상이라는 뜻 (나머지는 @Mock붙임)
(2) private ArticleRepository articleRepository;
- Mocking(테스트 주도 개발)할 때 필요
- @Mock붙이기
ArticleDto article = sut.searchArticle(1L);
2. 게시판(게시글 리스트) 반환 테스트 작성
- @Test
- 테스트명 : givenSearchParameters_whenSearchingArticles_thenReturnsArticleList
- @DisplayName("게시글을 검색하면 게시글 리스트를 반환한다")
(1) given : 없음
(2) When : Page<ArticleDTO> articles = sut.searchArticles(SearchType.검색기준, "search keyword");
- Page를 사용함으로써 페이지네이션 및 정렬 기능도 완성
- articles라는 ArticleDTO 리스트로 반환받음
- 검색 타입(SearchType.검색기준)과 검색어(search keyword)만으로 서치하도록 설정
- 검색기준은 Enum으로 관리
- java.main.루트패키지.domain에 searchType.enum생성
- 종류 : TITLE, CONTENT, ID, NICKNAME, HASHTAG
- 제목, 본문, Id, 닉네임, 해시태그 등의 검색할 때 사용할 파라미터를 DTO로 사용 (java.main.루트패키지에 dto라는 패키지 만들기)
- dto로 만들어줄 것 : createdAt, createdBy, title, content, hashtag
dto 패키지 안에 DTO타입 생성 | dto 종류 체크, ArticleDto생성 |
- ArticleDto 에서 생성자 만든 후 static method로 바꿔주기 : public static method ArticldDto of ( ··· ){ return new ArticleDto( ··· ) }
3. 개별 게시글 조회 테스트 작성
- @Test
- 테스트명 : givenArticleId_whenSearchingArticle_thenReturnsArticle
- @DisplayName("게시글을 조회하면 게시글을 반환한다")
(1) given : 없음
(2) when
- ArticleDto article = sut.searchArticle(1L)
(3) assertThat(articles).isNotNull(); (* 테스트 실행하면 오류뜨는게 정상임)
4. 홈 버튼을 누르면 게시판 페이지로 리다이렉션
- test.루트페이지.controller 경로에 MainControllerTest생성
- 클래스 레벨에 @WebMvcTest(MainController.class) & @Import(SecurityConfig.class)
- private final MockMvc mvc;
- public MainControllerTest(@Autowired MockMvc mvc){ this.mvc = mvc; }
- @Test
- 테스트명 : givenNothing_whenRequestingRootPage_thenRedictsTo()ArticlesPage
(1) given : 없음
(2) when&then
- mvc.perform(get("/")) : 루트페이지로 이동하기
- .andExpect(status().is3xxRedirection()) : status는 static import, 301등의 서버인지 확인
-
'프로젝트 > 게시판 만들기' 카테고리의 다른 글
[Board Project] 17. 로그인 페이지 만들기 (0) | 2023.11.02 |
---|---|
[Board Project] 15. 게시판 페이지 만들기(2) (Thymeleaf) (0) | 2023.10.25 |
[Board Project] 14. 게시판 페이지 만들기(1) (Thymleaf) (0) | 2023.10.24 |
[Board Project] 13. 뷰 엔드포인트 테스트 정의 (0) | 2023.10.23 |
[Board Project] 12. API 구현 (Query DSL, Spring data, JPA) (0) | 2023.10.21 |