코딩하는 털보

21.09.29 TIL 본문

Diary/Today I Learned

21.09.29 TIL

이정인 2021. 9. 29. 21:19

Spring Security CSRF 방어 설정으로 인해 Postman이 변경 요청을 할 때 403 status만 받아왔다.
Postman에 CSRF 토큰을 집어넣는 방법이 있을 수도 있지만
나는 그냥 Profile 별로 다른 보안 설정을 사용하려고 한다.

@Configuration
@Profile("dev")
public class DevWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll().and()
                .csrf().disable()
                .formLogin().and()
                .httpBasic();
    }
}

이렇게 하면 active profile=dev 에서는 postman이 잘 동작한다.
근데 생각해보니 이렇게 다르게 설정하면 테스트에서 프로파일 별로 서로 다른 결과를 가져올 수 있기 때문에
좋은 방법은 아닌 것 같다..


assertJ의 assertThatThrownBy() 메서드로 예외 발생 테스트를 작성했다.

    @Test
    @DisplayName("존재하지 않는 게시글 ID로 삭제")
    void deleteArticleByInvalidId() {
        willThrow(EmptyResultDataAccessException.class)
                .given(articleRepository).deleteById(99L);

        assertThatThrownBy(() -> articleService.deleteArticleById(99L))
                .isInstanceOf(ArticleNotFoundException.class);
        verify(articleRepository).deleteById(99L);
    }

@DataJpaTest

리포지토리 테스트를 추가했다.
@Import 어노테이션을 사용하면 테스트 할 때 스캔할 @Configuration를 추가할 수 있다.

@DataJpaTest
@Import(JpaAuditingConfiguration.class)
class ArticleRepositoryTest {

    @Autowired
    private ArticleRepository articleRepository;

    List<Article> mockArticleList = new ArrayList<>();

    @BeforeEach
    private void beforeEach() throws InterruptedException {
        //given
        mockArticleList.add(Article.from(
                new ArticleRequestDto("test title 1", "tester", "test content 1")));
        mockArticleList.add(Article.from(
                new ArticleRequestDto("test title 2", "tester", "test content 2")));
        mockArticleList.add(Article.from(
                new ArticleRequestDto("test title 3", "tester", "test content 3")));
        mockArticleList.add(Article.from(
                new ArticleRequestDto("test title 4", "tester", "<script>alert('XSS');</script>")));

        for (Article article : mockArticleList) {
            articleRepository.save(article);
            sleep(10);
        }
    }

    @Test
    @DisplayName("최근 생성 순으로 게시글 목록 조회")
    public void findAllByOrderByCreatedAtDesc() {

        //when
        List<Article> articleList = articleRepository.findAllByOrderByCreatedAtDesc();

        //then
        for (int i = 0; i < articleList.size()-1; i++) {
            assertThat(articleList.get(i).getCreatedAt().isAfter(articleList.get(i+1).getCreatedAt()))
                    .isTrue();
        }
    }
}

값이 null인 게시글을 만들려고 할 때 DB에 저장이나 수정을 요청하기 전에 컨트롤러에서 필터링하기 위해
RequestDto에 lombok.NonNull 어노테이션으로

@Getter
@AllArgsConstructor
public class ArticleRequestDto {
    @NonNull
    private final String title;
    @NonNull
    private final String writer;
    @NonNull
    private final String content;
}
Comments