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
- @Transactional
- ์๋์ผ๋ก ๋กค๋ฐฑ
- @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