Skip to content

Latest commit

Β 

History

History
152 lines (121 loc) Β· 6.13 KB

File metadata and controls

152 lines (121 loc) Β· 6.13 KB

3. μŠ€ν”„λ§ λΆ€νŠΈ ν…ŒμŠ€νŠΈ

3.1 @SpringBootTest

  • @SpringBootTestλŠ” 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ œκ³΅ν•˜λŠ” 기본적인 μŠ€ν”„λ§ λΆ€νŠΈ ν…ŒμŠ€νŠΈ μ–΄λ…Έν…Œμ΄μ…˜

  • 섀정을 μž„μ˜λ‘œ λ°”κΎΈμ–΄μ„œ ν…ŒμŠ€νŠΈ ν•  수 μžˆλ‹€.

  • μ‹€μ œ κ΅­λ™λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ˜‘κ°™μ΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈλ₯Ό λ‘œλ“œν•˜μ—¬ ν…ŒμŠ€νŠΈν•œλ‹€.

  • @RunWith:JUint에 λ‚΄μž₯된 λŸ¬λ„ˆλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  μ–΄λ…Έν…Œμ΄μ…˜μ— μ •μ˜λœ λŸ¬λ„ˆ 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€. !κΌ­ λΆ™μ—¬μ•Όν•œλ‹€!

  • νŒŒλΌλ―Έν„°

    - value : ν…ŒμŠ€νŠΈκ°€ μ‹€ν–‰λ˜κΈ° 전에 μ μš©ν•  ν”„λ‘œνΌν‹°λ₯Ό μ£Όμž…μ‹œν‚¬ 수 μžˆλ‹€.
    - properties : ν…ŒμŠ€νŠΈκ°€ μ‹€ν–‰λ˜κΈ° 전에 {key = value}ν˜•μ‹μœΌλ‘œ ν”„λ‘œνΌν‹°λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
    - classes : μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ— λ‘œλ“œν•  클래슀λ₯Ό μ§€μ •ν•  수 μžˆλ‹€. λ”°λ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ `@SpringBootConfiguration`을 μ°Ύμ•„μ„œ λ‘œλ“œ
    - webEnvironment : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 싀행될 λ•Œμ˜ μ›Ή ν™˜κ²½μ„ μ„€μ •ν•  수 μžˆλ‹€.
    

3.2 @WebMvcTest

  • μ›Ήμ—μ„œ ν…ŒμŠ€νŠΈν•˜κΈ° νž˜λ“  컨트둀러λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” 데 μ ν•©ν•˜λ‹€.
  • μš”μ²­κ³Ό 응닡에 λŒ€ν•΄ ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€.
  • μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜λ©° μˆ˜λ™μœΌλ‘œ μΆ”κ°€/μ‚­μ œ κ°€λŠ₯

/com/havi/domain/Book.java

import java.time.LocalDateTime;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor //νŒŒλΌλ―Έν„°κ°€ μ—†λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.
@Getter
public class Book{
  private Integer idx;
  private String title;
  private LocalDateTime publishedAt;

  @Builder //BuilderνŒ¨ν„΄μ„ μ μš©ν•œ 객체 생성 λ©”μ†Œλ“œ/클래슀λ₯Ό λ§Œλ“€μ–΄μ€€λ‹€.
  public Book(String title, LocalDateTime publishedAt){
    this.title = title;
    this.publishedAt = publishedAt;
  }
}

/com/havi/controller/BookController.java

package com.havi.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("/books")
    public String getBookList(Model model){
        model.addAttribute("bookList",bookService.getBookList());
        return "book";
    }
}
  • /books둜 μš”μ²­ μ‹œ ν˜„μž¬ BookService ν΄λž˜μŠ€μ— μ±… λͺ©λ‘μ„ μš”μ²­ν•˜μ—¬ "bookList" λΌλŠ” ν‚€κ°’μœΌλ‘œ 데이터값을 λ„˜κΈ°λŠ” 컨트둀러λ₯Ό λ§Œλ“ λ‹€. λ°˜ν™˜λ˜λŠ” λ·° 이름은 'book'이닀.

/com/havi/service/BookService.java

package com.havi.service;

import com.havi.domain.Book;

import java.util.List;

public interface BookService {
    List<Book> getBookList();
}
  • κ΅¬ν˜„μ²΄λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  λͺ© 데이터λ₯Ό μ΄μš©ν•΄ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€.

/com/havi/BookController.java

package com.havi;

import com.havi.controller.BookController;
import com.havi.domain.Book;
import com.havi.service.BookService;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import java.time.LocalDateTime;
import java.util.Collections;

import static org.hamcrest.Matchers.contains;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringRunner.class)
@WebMvcTest(BookController.class)
public class BookControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean //각자 객체둜 λŒ€μ²΄ (λͺ© 객체)
    private BookService bookService;

    @Test
    public void Book_MVC_ν…ŒμŠ€νŠΈ() throws Exception{
        Book book = new Book("Spring Boot Book", LocalDateTime.now());
        given(bookService.getBookList()).willReturn(Collections.singletonList(book));
        //getBookList()λ©”μ„œλ“œμ˜ 싀행에 λŒ€ν•œ λ°˜ν™˜κ°’μ„ 미리 μ •μ˜

        mvc.perform(get("/books"))
                .andExpect(status().isOk()) //HTTPμƒνƒœκ°’μ΄ 200인지 ν…ŒμŠ€νŠΈ
                .andExpect(view().name("book"))//λ°˜ν™˜λ˜λŠ” 뷰의 이름이 'book'인지 ν…ŒμŠ€νŠΈ
                .andExpect(model().attributeExists("bookList"))//λͺ¨λΈμ˜ ν”„λ‘œνΌν‹° 쀑 'bookList'λΌλŠ” ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ
                .andExpect(model().attribute("bookList",contains(book)));//λͺ¨λΈμ˜ ν”„λ‘œνΌν‹° 쀑 'bookList'λΌλŠ” ν”„λ‘œνΌν‹°μ— book 객체가 담겨져 μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈ
    }
}
  • MockMvcλŠ” 컨트둀러 ν…ŒμŠ€νŠΈ μ‹œ λͺ¨λ“  μ˜μ‘΄μ„±μ„ λ‘œλ“œν•˜λŠ” 것이 μ•„λ‹Œ BookController κ΄€λ ¨ 빈만 λ‘œλ“œν•˜μ—¬ κ°€λ²Όμš΄ MVCν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•œλ‹€.

3.3 @DataJpaTest

  • JPA κ΄€λ ¨ ν…ŒμŠ€νŠΈ μ„€μ •λ§Œ λ‘œλ“œν•œλ‹€.
  • λ°μ΄ν„°μ†ŒμŠ€μ˜ 섀정이 정상적인지, 데이터λ₯Ό μ œλŒ€λ‘œ 생성,μˆ˜μ •,μ‚­μ œ ν•˜λŠ”μ§€ λ“±μ˜ ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•˜λ‹€.
  • μ‹€μ œ 데이터λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜λ‹€.
  • @AutoConfigureTestDatabase
    • Replace.Any : μ‚¬μš©ν•˜λ©΄ 기본적으둜 λ‚΄μž₯된 데이터 μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.
    • Replace.NONE : @ActiveProfiles에 μ„€μ •ν•œ ν”„λ‘œνŒŒμΌ ν™˜κ²½κ°’μ— 따라 데이터 μ†ŒμŠ€κ°€ μ μš©λœλ‹€.
  • μžλ™ μ„€μ • 방식
    • application.yml 섀정을 spring.test.database.replace: NONE 으둜 λ³€κ²½
  • @DataJpaTest : ν…ŒμŠ€νŠΈκ°€ 끝날 λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•œ 데이터 λ‘€λ°±
  • 데이터 베이슀 μ‚¬μš© μ„€μ •
    • spring.test.database.connection: H2
    • @AutoConfigureTestDatabase(connection = H2)
  • @Entity : ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ—”ν‹°ν‹°μž„μ„ μ•Œλ¦¬κΈ° μœ„ν•΄ μ‚¬μš©,μžλ™κ²€μƒ‰μ„ ν†΅ν•˜μ—¬ 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ„ μ–Έ 된 ν΄λž˜μŠ€λ“€μ€ μ—”ν‹°ν‹° 빈으둜 λ“±λ‘ν•œλ‹€.
  • @Table : λ°μ΄ν„°μ˜ μ €μž₯μ†Œ, ν…Œμ΄λΈ”μ„ μ˜λ―Έν•œλ‹€.
  • @Id : μ—”ν‹°ν‹°μ˜ κΈ°λ³Έν‚€λ₯Ό μ˜λ―Έν•œλ‹€.
  • @GeneratedValue : DB에 μ˜ν•΄ μžλ™μœΌλ‘œ μƒμ„±λœ κ°’. μ‹€μ œ 데이터가 μ €μž₯될 λ•Œ μƒμ„±λ˜λŠ” 값이닀.
  • @Column : ν•„λ“œμ™€ ν…Œμ΄λΈ”μ˜ μ»¬λŸΌμ„ λ§€ν•‘μ‹œμΌœμ€€λ‹€.