상똥이의 Back-End 공부방

[Board Project] 19. 게시판 서비스 뷰에 기능 구현하기 본문

프로젝트/게시판 만들기

[Board Project] 19. 게시판 서비스 뷰에 기능 구현하기

상똥백 2023. 11. 5. 10:52

[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등의 서버인지 확인