BootCamp 51day

GyeongNamΒ·2024λ…„ 1μ›” 28일
0

BootCamp

λͺ©λ‘ 보기
45/49
post-thumbnail

πŸ“… 2024λ…„ 01μ›” 25일


51일차 : Spring (11)

n+1 문제

μ—°κ΄€ κ΄€κ³„μ—μ„œ λ°œμƒν•˜λŠ” 이슈둜 μ—°κ΄€ 관계가 μ„€μ •λœ μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•  κ²½μš°μ— 쑰회된 데이터 갯수(n) 만큼 μ—°κ΄€κ΄€κ³„μ˜ 쑰회 쿼리가 μΆ”κ°€λ‘œ λ°œμƒν•˜μ—¬ 데이터λ₯Ό μ½μ–΄μ˜€κ²Œ λœλ‹€.
(JPA Repository둜 find μ‹œ μ‹€ν–‰ν•˜λŠ” 첫 μΏΌλ¦¬μ—μ„œ ν•˜μœ„ μ—”ν‹°ν‹°κΉŒμ§€ ν•œ λ²ˆμ— κ°€μ Έμ˜€μ§€ μ•Šκ³ , ν•˜μœ„ μ—”ν‹°ν‹°λ₯Ό μ‚¬μš©ν•  λ•Œ μΆ”κ°€λ‘œ μ‘°νšŒν•˜κΈ° λ•Œλ¬Έ)

  • PostRepository.java
@Query("select p from Post p left outer join fetch p.author")
List<Post> findAllFetchJoin();

Test

  • AthorControllerTest
/*
 @WebMvcTest(AuthorController.class)
 λ₯Ό μ΄μš©ν•˜μ—¬ Controller 계측을 ν…ŒμŠ€νŠΈμ„ ν…ŒμŠ€νŠΈ λͺ¨λ“  μŠ€ν”„λ§ λΉˆμ„ μƒμ„±ν•˜κ³  μ£Όμž…ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.
 */
@SpringBootTest
@AutoConfigureMockMvc
public class AuthorControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    public AuthorService authorService;
    @Test
//    @WithMockUser security μ˜μ‘΄μ„± μΆ”κ°€ ν•„μš”
    void authorDetailTest() throws Exception {
        AuthorDetailResDto authorDetailResDto = new AuthorDetailResDto();
        authorDetailResDto.setName("test");
        authorDetailResDto.setEmail("test@naver.com");
        authorDetailResDto.setEmail("sadqwexdq");
        Mockito.when(authorService.findAuthorDetail(1L)).thenReturn(authorDetailResDto);
	    mockMvc.perform(MockMvcRequestBuilders.get("/author/30/circle/dto"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect((ResultMatcher) jsonPath("$.name",authorDetailResDto.getName()));
    }
}
  • AuthorRepositoryTest
/*
@DataJpaTest λ₯Ό μ‚¬μš©ν•˜λ©΄ 맀 ν…ŒμŠ€νŠΈκ°€ μ’…λ£Œλ˜λ©΄ μžλ™μœΌλ‘œ DB 원상볡ꡬ
λͺ¨λ“  μŠ€ν”„λ§ λΉˆμ„ μƒμ„±ν•˜μ§€λŠ” μ•Šκ³  DB ν…ŒμŠ€νŠΈ νŠΉν™” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€.
@SpringBootTest λŠ” μžλ™ λ‘€λ°± κΈ°λŠ₯은 μ§€μ›ν•˜μ§€ μ•Šκ³ , λ³„λ„λ‘œ λ‘€λ°± μ½”λ“œκ°€ ν•„μš”.
μ‹€μ œ μŠ€ν”„λ§ μ‹€ν–‰κ³Ό λ™μΌν•˜κ²Œ μŠ€ν”„λ§ 빈 생성 및 μ£Όμž…
 */
//@DataJpaTest
@SpringBootTest
//@Transactional
/*
replace = AutoConfigureTestDatabase.Replace.ANY : H2 db(spring λ‚΄μž₯)
 */
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class AuthorRepositoryTest {
    @Autowired
    private AuthorRepository authorRepository;
    @Test
    public  void  authorSaveTest(){
        // μ€€λΉ„ 단계 (prepare, given)
        Author author = Author.builder()
                .name("λ°•μ„Έμ’…")
                .email("μ„Έμ’…3@ν•œν™”")
                .password("1234")
                .role(Role.USER)
                .build();
        // μ‹€ν–‰ 단계 (execute, when)
        authorRepository.save(author);
        Author authorDB = authorRepository.findByEmail("μ„Έμ’…3@ν•œν™”").orElse(null);
        // 검증 단계 (then)
        assertEquals(author.getEmail(), authorDB.getEmail());
    }
}
  • AuthorServiceTest
@SpringBootTest
public class AuthorServiceTest {
    @Autowired
    AuthorService authorService;
    @Autowired
    PostRepository postRepository;
    // κ°€μ§œκ°μ²΄λ₯Ό λ§Œλ“œλŠ” μž‘μ—…μ„ λͺ©ν‚Ήμ΄λΌκ³  ν•œλ‹€
    @MockBean
    private AuthorRepository authorRepository;
    @Test
    void findAuthorDetailTest(){
        Long authorId = 1L;
        List<Post> posts = new ArrayList<>();
        Post post = Post.builder()
                .title("hello")
                .contents("hello word")
                .build();
        posts.add(post);
        Author author = Author.builder()
                .id(authorId)
                .name("test1")
                .email("test1@naver.com")
                .password("1234")
                .posts(posts)
                .build();
        Mockito.when(authorRepository.findById(authorId)).thenReturn(Optional.of(author));
        AuthorDetailResDto authorDetailResDto =  authorService.findAuthorDetail(authorId);
        Assertions.assertEquals(author.getName(), authorDetailResDto.getName());
        Assertions.assertEquals(author.getPosts().size(), authorDetailResDto.getPostCount());
        Assertions.assertEquals("μΌλ°˜μœ μ €", authorDetailResDto.getRole());
    }
    @Test
    public void updateTest(){
        Long author_id = 1L;
        Author author = Author.builder()
                .name("test1")
                .email("test1@naver.com")
                .password("1234")
                .build();
        Mockito.when(authorRepository.findById(author_id)).thenReturn(Optional.of(author));
        AuthorUpdateDto authorUpdateDto = new AuthorUpdateDto();
        authorUpdateDto.setName("test2");
        authorUpdateDto.setPassword("test2@naver.com");
        authorUpdateDto.setId(author_id);
        Author author_new = authorService.update(authorUpdateDto);
        Assertions.assertEquals(author_new.getName(), authorUpdateDto.getName());
    }
    @Test
    public void findAllTest(){
        int beforeCount = authorService.findAll().size();
        // Mock repository κΈ°λŠ₯ κ΅¬ν˜„
        List<Author> authors = new ArrayList<>();
        authors.add(new Author());
        authors.add(new Author());
        Mockito.when(authorRepository.findAll()).thenReturn(authors);
        // 검증
        Assertions.assertEquals(2, authorService.findAll().size());
    }
}

Spring μ‹€μŠ΅ github 링크

profile
503 Service Unavailable Error

0개의 λŒ“κΈ€