0102 - 0109


# 0102 - 0109

# 0103 - ์›๊ฒฉ ์ €์žฅ์†Œ์— push๋œ ํŒŒ์ผ์„ ignore

  • ๋ฌธ์ œ
    ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ด๋ฏธ ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์„ git ignore์— ์ถ”๊ฐ€ ํ•˜์—ฌ ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
    ๊ทธ๋ƒฅ ignore์— ์ถ”๊ฐ€์‹œํ‚ค๋ฉด ์ถ”๊ฐ€๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ํ•ด๊ฒฐ

git rm -r --cached .
git add .
git commit -m "chore: git ignore"
git push

์ด์™€ ๊ฐ™์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๊นƒ์˜ ์บ์‹œ๋ฅผ ๋‹ค ๋‚ ๋ฆฐ ๋‹ค์Œ ๋‹ค์‹œ add๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.


# 0104 - JPA ์—ฐ๊ด€๊ด€๊ณ„

# JPA์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ

  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”
  • 1์ฐจ์› ๋งคํ•‘
    • @Entity, @Column, @Id, @GeneratedValue, @Enumerated.. ์™€ ๊ฐ™์€ ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์˜ ์ผ๋Œ€์ผ๋กœ ๋Œ€์‘๋˜๋Š” ๊ฒƒ์œผ๋กœ์จ ๊ธฐ๋ณธ์ ์ธ Annotation์„ ์ˆ™์ง€
  • ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘

# ์—ฐ๊ด€ ๊ด€๊ณ„ ์ •์˜ ๊ทœ์น™

์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ๋•Œ, ์ƒ๊ฐํ•ด์•ผ ํ•  3๊ฐ€์ง€

  • ๋ฐฉํ–ฅ : ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ
  • ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ : ์–‘๋ฐฉํ–ฅ์ผ ๋•Œ, ์—ฐ๊ด€ ๊ด€๊ณ„์—์„œ ๊ด€๋ฆฌ ์ฃผ์ฒด
  • ๋‹ค์ค‘์„ฑ : ๋‹ค๋Œ€์ผ(N:1), ์ผ๋Œ€๋‹ค(1:N), ์ผ๋Œ€์ผ(1:1), ๋‹ค๋Œ€๋‹ค(N:M)

# ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค ํ•˜๋‚˜๋กœ ์–‘ ์ชฝ ํ…Œ์ด๋ธ” ์กฐ์ธ์ด ๊ฐ€๋Šฅ. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋Š” ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ์„ ๋‚˜๋ˆŒ ํ•„์š”๊ฐ€ ์—†๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ์šฉ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐ์ฒด ์‚ฌ์ด์— ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์ฐธ์กฐ์šฉ ํ•„๋“œ๋ฅผ ๊ฐ–๊ณ  ์ฐธ์กฐํ•˜๋ฉด ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„, ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋“œ๊ฐ€ ๊ฐ๊ฐ ์ฐธ์กฐ์šฉ ํ•„๋“œ๋ฅผ ๊ฐ–๊ณ  ์ฐธ์กฐํ•˜๋ฉด ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๊ฐ€ ๋œ๋‹ค.
์—„๋ฐ€ํ•˜๊ฒŒ๋Š” ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋Š” ์—†๊ณ  ๋‘ ๊ฐ์ฒด๊ฐ€ ๋‹จ๋ฐฉํ–ฅ ์ฐธ์กฐ๋ฅผ ๊ฐ๊ฐ ๊ฐ€์ ธ์„œ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋œ๋‹ค.

# ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ

๋‘ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„์—์„œ ์ œ์–ด์˜ ๊ถŒํ•œ(์™ธ๋ž˜ํ‚ค๋ฅผ ๋น„๋กฏํ•œ ํ…Œ์ด๋ธ” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ์ฒ˜๋ฆฌ)์„ ๊ฐ–๋Š” ์‹ค์งˆ์ ์ธ ๊ด€๊ณ„๊นŒ ์–ด๋–ค ๊ฒƒ์ธ์ง€ JPA์—๊ฒŒ ์ œ๊ณต, ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ์•„๋‹ˆ๋ผ๋ฉด ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ์•„๋‹Œ ๊ฐ์ฒด์—์„œ mappedBy ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์„ ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์œผ๋กœ ์ •ํ•˜๋ฉด ๋œ๋‹ค.

# ๋‹ค์ค‘์„ฑ

  • ๋‹ค๋Œ€์ผ(N:1) - ๋‹จ๋ฐฉํ–ฅ(์ฃผ์ธ์ด 'N') : ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ๋‹ค๋Œ€์ผ(N:1) - ์–‘๋ฐฉํ–ฅ(์ฃผ์ธ์ด 'N') : ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ์ผ๋Œ€๋‹ค(1:N) - ๋‹จ๋ฐฉํ–ฅ(์ฃผ์ธ์ด '1') : ์‚ฌ์šฉ๋ถˆ๊ฐ€
  • ์ผ๋Œ€๋‹ค(1:N) - ์–‘๋ฐฉํ–ฅ(์ฃผ์ธ์ด '1') : ์‚ฌ์šฉ๋ถˆ๊ฐ€
  • ์ผ๋Œ€์ผ(1:1) - ๋‹จ๋ฐฉํ–ฅ : ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ์ผ๋Œ€์ผ(1:1) - ์–‘๋ฐฉํ–ฅ : ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • ๋‹ค๋Œ€๋‹ค(N:M) - ์‹ค๋ฌด ์‚ฌ์šฉ๊ธˆ์ง€ => ์ž๊ธฐ๋„ ๋ชจ๋ฅด๋Š” ๋ณต์žกํ•œ ์กฐ์ธ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ๋„ ์žˆ์Œ. ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๊ฒƒ

# 0105 - @DataJpaTest vs @SpringBootTest

# @DataJpaTest

@DataJpaTest๋Š” ์˜ค์ง JPA ์ปดํฌ๋„ŒํŠธ๋“ค๋งŒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜.
full-auto config๋ฅผ ํ•ด์ œํ•˜๊ณ  JPA ํ…Œ์ŠคํŠธ์™€ ์—ฐ๊ด€๋œ config๋งŒ ์ ์šฉํ•œ๋‹ค.

  • @DataJpaTest๊ฐ€ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited @BootstrapWith(value=org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper.class)
@ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
@OverrideAutoConfiguration(enabled=false)
@TypeExcludeFilters(value=DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest
  1. @Transactional
    • ์ž๋™์œผ๋กœ ๋กค๋ฐฑ
  2. @AutoConfigureTestDatabase
    • replace=AutoConfigureTestDatabase.Replace๊ฐ€ ๋””ํดํŠธ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด, ์„ค์ •ํ•ด๋†“์€ DB๊ฐ€ ์•„๋‹Œ in-memory DB๋ฅผ ํ™œ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
    • EmbeddedBatabaseConnection ํด๋ž˜์Šค๋ฅผ ๋ณด๋ฉด H2, DERBY, HSQL, HSQLDB ์ค‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ in-memory DB์— ์ž๋™์œผ๋กœ ์ปค๋„ฅ์…˜์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • replace=AutoConfigureTestDatabase.NONE ์œผ๋กœ ๊ฐ’์„ ๋ฎ์–ด ์”Œ์šฐ๋ฉด ์„ค์ •ํ•ด๋†“์€ DB๋ฅผ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# @SpringBootTest

@SpringBootTest๋Š” full application config์„ ๋กœ๋“œ์—์„œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@BootstrapWith(value=SpringBootTestContextBootstrapper.class)
@ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
public @interface SpringBootTest
  • ์„ค์ •ํ•ด ๋†“์€ config, context, components๋ฅผ ๋ชจ๋‘ ๋กœ๋“œํ•œ๋‹ค.
  • DataSource bean์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— in-memory, ๋กœ์ปฌ, ์™ธ๋ถ€ ์ƒ๊ด€ ์—†์ด DB๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • ํ…Œ์ŠคํŠธํ•  ๋•Œ๋งˆ๋‹ค DB๊ฐ€ ๋กค๋ฐฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— @Transactional์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

# 0106 - Junit5 : @ExtendWith, MockMvc, @TestConstructor

# @ExtendWith

  • Junit 4์˜ @RunWith๊ฐ€ Junit 5์—์„œ๋Š” @ExtendWith๋กœ ๋ณ€๊ฒฝ
  • @SpringBootTest ์• ๋…ธํ…Œ์ด์…˜์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋–„๋ฌธ์— ๋‘˜๋‹ค ๋ช…์‹œํ•  ํ•„์š”๋Š” ์—†๋‹ค

# MockMvc

  • Spring MVC ์—ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.
  • ์‹ค์ œ ์„œ๋ฒ„์˜ ์‹คํ–‰ ์—†์ด ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

MocmMvc์™€ WebApplicationContext๋ฅผ @Autowired ์• ๋…ธํŽ˜์ด์…˜์„ ์ด์šฉํ•ด ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๊ณ , setup() ๋ฉ”์„œ๋“œ๋กœ MockMvc๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
@BeforeEach ์• ๋…ธํ…Œ์ด์…˜์„ ๋ช…์‹œํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ setup() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

@WebMvcTest
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebbApplicationContext webApplicationContext;

    @BeforeEach
    public void setup() throws Exception{
        this.mockMvc = MockMvcBuilders
                        .webAppContextSetup(this.webApplicationContext)
                        .build();
    }

}

# TestRestTemplate

  • @SpringBootTest์˜ WebEnvironment์„ค์ •์œผ๋กœ ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ ๋’ค, RestTemplate์„ ํ†ตํ•ด ์š”์ฒญ, ์‘๋‹ต ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • TestRestTemplate๋Š” ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ์šฉ RestTemplate์ด๋ฉฐ, ์ž๋™์œผ๋กœ ๋‚ด์žฅ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ๋‹ค
  • ํ•„์š”ํ•˜๋‹ค๋ฉด RestTemplateBuilder๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

MockMvc๋Š” ์‚ฌ์ด๋“œ์—์„œ ํ…Œ์ŠคํŠธ ํ•˜๋Š”๊ฒƒ, TestRestTemplate๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒƒ

# @TestConstructor

JUnit 5๋ถ€ํ„ฐ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
AutowireMode.ALL ์„ค์ •์„ ํ†ตํ•ด @Autowired ์• ๋…ธํ…Œ์ด์…˜์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , private final๋กœ ์„ ์–ธ๋œ ํ•„๋“œ๋“ค์— ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

@RequiredArgsConstructor
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@SpringBootTest
public class MyTest {

    private final HelloService helloService;

    @Test
    public void ํ…Œ์ŠคํŠธ() {
        // ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ƒ๋žต
    }
}

# 0107 - Springboot Test

# ์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์˜์กด์„ฑ
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

# @SpringBootTest

์Šคํ”„๋ง๋ถ€ํˆฌ์—์„œ๋Š” @SpringBootTest ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์˜์กด์„ฑ๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

@SpringBootTest ์–ด๋…ธํ…Œ์ด์…˜์€ Spring Main Application(@SpringBootApplication)์„ ์ฐพ์•„๊ฐ€ ํ•˜์œ„์˜ ๋ชจ๋“  Bean์„ Scanํ•œ๋‹ค.

๊ทธ ํ›„ Test์šฉ Application Context๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋นˆ์„ ๋“ฑ๋กํ•ด์ฃผ๊ณ , mock bean์„ ์ฐพ์•„๊ฐ€ ๊ทธ ๋นˆ๋งŒ mock bean์œผ๋กœ ๊ต์ฒดํ•ด์ค€๋‹ค.

# WebEnvironment

  • MOCK : mock servlet environment๋กœ ๋‚ด์žฅ ํ†ฐ์บฃ ๊ตฌ๋™์„ ์•ˆํ•œ๋‹ค.
  • RANDOM_PORT, DEFINED_PORT : ๋‚ด์žฅ ํ†ฐ์บฃ ์‚ฌ์šฉ
  • NONE : ์„œ๋ธ”๋ฆฟ ํ™˜๊ฒฝ ์ œ๊ณต ์•ˆํ•จ

# 1. MOCK

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc

@RunWith(SpringRunner.class) ์–ด๋…ธํ…Œ์ด์…˜์€ JUnit์ด ๋‚ด์žฅ๋œ Runner๋ฅผ ์‹คํ–‰ํ•  ๋•Œ SpringRunner.class๋ผ๋Š” ํ™•์žฅ๋œ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ์ง€์‹œํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ์˜ WebEnvironment ํ™˜๊ฒฝ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ MOCK์œผ๋กœ ์žกํ˜€์žˆ์œผ๋ฉฐ, ์ด ๋•Œ ๋‚ด์žฅํ†ฐ์บฃ์„ ๊ตฌ๋™ํ•˜์ง€ ์•Š์•„ ์„œ๋ธ”๋ฆฟ์ด ์•„๋‹ˆ๋ผ ์„œ๋ธ”๋ฆฟ์„ Mockingํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋œฌ๋‹ค.

Mockup์ด๋œ ์„œ๋ธ”๋ฆฟ๊ณผ interaction ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” MockMVC๋ผ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

# 2. RANDOM_PORT

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc

WebEnvironment๊ฐ€ RANDOM_PORT๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‹ค์ œ๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ(๋‚ด์žฅ ํ†ฐ์บฃ)์ด ๋žœ๋คํ•œ ํฌํŠธ๋กœ ๋œฌ๋‹ค. ์ด๋–„๋ถ€ํ„ฐ๋Š” Test์šฉ RestTemplate, Web Client๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

@Test
public void hello() throws Exception {
    String result = testRestTemplate.getForObject("/hello", String.class);
    assertThat(result).isEqualTo("hello dsunni");
}

# 3. MockBean

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class ControllerTest {
    @Autowired
    TestRestTemplate testRestTemplate;

    @MockBean
    TestService mockTestService;
}

@MockBean์„ ๋ถ™์—ฌ์„œ mockTestService๋ฅผ ๋งŒ๋“ค๋ฉด Application Context์•ˆ์— TestService ๋นˆ์„ mockTestService๋นˆ์œผ๋กœ ๊ต์ฒดํ•œ๋‹ค. ์‹ค์งˆ์ ์œผ๋กœ ์›๋ณธ์ด ์•„๋‹Œ mock bean์„ ์‚ฌ์šฉํ•ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

# 4. @WebTestClient

java5 Spring MVC WebFlux์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ Rest Client ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Rest Client๋Š” Synchronous์˜€๋‹ค. ์˜ค์ฒญ ํ•˜๋‚˜ ๋ณด๋‚ด๋ฉด ๋๋‚ ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

WebTestClient๋Š” Asynchronousํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์ด ์˜ค๋ฉด ๊ทธ ๋–„ CallBackEvent๊ฐ€ ๋ฐœ์ƒํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์˜์กด์„ฑ ์ถ”๊ฐ€
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@Autowired
WebTestClient webTestClient;

@Test
    public void hello() throws Exception {
        when(mockiService.getName()).thenReturn("test");
        webTestClient.get().uri("/hello")	//request ๋งŒ๋“ค์–ด์„œ
          			.exchange()								//๋ณด๋‚ด๊ณ 
                .expectStatus().isOk()		//๊ฒ€์ฆ
                .expectBody(String.class).isEqualTo("hello test");
    }   

# ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ

๋ ˆ์ด์–ด ๋ณ„๋กœ ์ž˜๋ผ์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ. ๋ ˆ์ด์–ด ๋ณ„๋กœ ๋นˆ์ด ๋“ฑ๋ก๋จ

  • @JsonTest
  • @WebMvcTest
  • @WebFluxTest
  • @DataJpaTest

# ํ…Œ์ŠคํŠธ ์œ ํ‹ธ

  • OutputCapture
  • TestPropertyValues
  • TestRestTemplate
  • ConfigFileApplicationContextInitializer
Last update: September 13, 2022 21:44
Contributors: ahnjs