2024. 10. 13. 22:41ใ๐ ๋ฐฑ์๋ ๊ฐ๋ฐ/SPRING
์ด๋ฒ 2์ฃผ์ฐจ ๋ฐ์๊ตญ ๋ด์ฉ์ spring ํ ์คํธ ์ฝ๋์ ๋ํ ๋ด์ฉ์ด ๋๋ถ๋ถ์ด๋ค.
์๋ฌด๋๋ Spring์์ ๊ฐ์ฅ ์ค์ํ ์์๋ ํ ์คํธ ์ฝ๋๋ผ๊ณ ์๊ฐ๋์ด ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ์ผ๋ TEST ์ฝ๋์ ๋ํด ํ๋ํ๋์ฉ ํํค์ณ ๋ณผ ์์ ์ด๋ค !
package com.hyup.portfolio.domain.repository
import com.hyup.portfolio.domain.entity.Project
import org.springframework.data.jpa.repository.JpaRepository
import java.util.Optional
interface ProjectRepository : JpaRepository<Project, Long> {
fun findAllByIsActive(isActive: Boolean): List<Project>
override fun findById(id: Long): Optional<Project>
}
์ ์ฝ๋์์ ๊ถ๊ธํ ๋ด์ฉ์ ?
[ QUESTION ] findById๋ฅผ ์ override๋ฅผ ํด์ ์ฌ์ฉํ๋ ์ด์
-> JpaRepository๊ฐ ์ด๋ฏธ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ๋ค์ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํด์ผํจ
-> override๋ฅผ ํ์ฉํด์ ์ฌ์ ์ ํ๋ฉด ๊ธฐ๋ฅ์ ์ผ๋ก ์์ข๋ค.
[ WHY ?] override๋ฅผ ํ์ฉํด์ ์ฌ์ ์ ํ๋ฉด ๊ธฐ๋ฅ์ ์ผ๋ก ์์ข์ ์ด์
1. ๊ธฐ๋ณธ ๋์์ ์ผ๊ด์ฑ ๋ฌธ์
- JpaRepository์์ ์ ๊ณตํ๋ findById๋ ๊ธฐ๋ณธ์ ์ธ CRUD ๋์์ ์์ ์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ,
์ด๋ฅผ ์ฌ์ ์ํ๋ฉด ์์์น ๋ชปํ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์์. - ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๋๋ฅผ ์ดํดํ ๋, ์ด๋ ค์์ ์๊ฒจ์ค ์ ์์
2. ์ ์ง๋ณด์์ฑ ์ ํ
- JPA์ ์ ๋ฐ์ดํธ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ์ ๋ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์
- ๊ธฐ๋ฅ์ ์์ ์ฑ ๊ฐ์
- Spring Data Jpa๋ ํธ๋์ญ์ ๊ด๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ, ์ฑ๋ฅ ์ต์ ํ ๋ฑ์ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ. ์ด๋ฅผ ์ฌ์ ์ ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ฌ๋ฌ ์ต์ ํ๋ ๊ธฐ๋ฅ์ด ๋ฌด์๋ ์ ์์
[ SOLVE ] ๊ทธ๋ผ override๋ฅผ ํ์ฉํ์ง ์๊ณ ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋?
- CUSTOM Repository ์ฌ์ฉ
- interface ProjectRepository : JpaRepository<Project, Long> { fun findAllByIsActive(isActive: Boolean): List<Project> override fun findById(id: Long): Optional<Project> }
interface CustomProjectRepository {
fun findByIdCustom(id: Long): Optional<Project>
}
- ์ฟผ๋ฆฌ ๋ฉ์๋ ํ์ฉ
- interface ProjectRepository : JpaRepository<Project, Long> { fun findAllByIsActive(isActive: Boolean): List<Project> fun findByIdAndIsActive(id: Long, isActive: Boolean): Optional<Project> }
@DataJpaTest ๋ฉ์๋
@DataJpaTest ๋ฉ์๋๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด @Transactional ์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์กด์ฌ
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(DataJpaTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface
# DataJpaTest ์ด๋
ธํ
์ด์
์ด ํฌํจํ๊ณ ์๋ ์ด๋
ธํ
์ด์
์ด์ค @Transactional ์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ํ ์คํธ ๋ฉ์๋ ํ๋๋ฅผ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ณด๊ณ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋ ๊ทธ ํธ๋์ญ์ ์์ ๋ฐ์ํ ์์ ๋ค์ ๋ชจ๋ ๋กค๋ฐฑํด์ค
[ QUESTION ] ํธ๋์ญ์ ์์ ๋ฐ์ํ ์์ ๋ค์ ๋ชจ๋๋กค๋ฐฑํด์ผ ํ๋ ์ด์
[ ANSWER ]
- ํ ์คํธ ๊ฐ ๋ ๋ฆฝ์ฑ ๋ณด์ฅ
ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋์ด์ผ ํ๊ณ , ํ๋์ ํ ์คํธ๊ฐ ๋ค๋ฅธ ํ ์คํธ์ ์ํฅ์ ์ฃผ์ง ์์์ผ ํจ. ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ฉด, ํ ์คํธ ๋ด์์ ๋ฐ์ํ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์๋ ์ํ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๊ฐ ํญ์ ์ด๊ธฐ ์ํ๋ก ์ ์ง
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง
ํ ์คํธ๊ฐ ๋๋ ํ์๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ์ง ์์ผ๋ฉด, ํ ์คํธ ์ค์ ์ฝ์ ๋๊ฑฐ๋ ์์ ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋จ์ ์๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ดํ์ ํ ์คํธ๋ ์ค์ ์ดํ๋ฆฌ์ผ์ด์ ์คํ์ ์ํฅ์ ๋ฏธ์ณ, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์
- ํ ์คํธ ์ฑ๋ฅ ํฅ์
ํ ์คํธ ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์์ ํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ค์ ๋ก ์๊ตฌ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ ๊ฒ์ด ์ฑ๋ฅ ๋ฉด์์ ์ ๋ฆฌ.
์ธ์คํด์ค ์๋ช ์ฃผ๊ธฐ
- PER_METHOD (๊ธฐ๋ณธ๊ฐ)
- ๊ฐ ํ ์คํธ ๋ฉ์๋๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ
- ๊ฐ ํ ์คํธ ๋ฉ์๋๋ ๋ ๋ฆฝ์ ์ธ ์ํ ์ ์ง
- ํ ์คํธ๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฏ๋ก, ํ ์คํธ ํด๋์ค์ ์ํ๋ฅผ ๊ณต์ ํ ์ ์๊ณ ํ ์คํธ ๊ฐ์ ์์กด์ฑ๋ ์์ด์ผ ํจ.
@TestInstance(TestInstance.Lifecycle.PER_METHOD) // ์๋ต ๊ฐ๋ฅ (๊ธฐ๋ณธ ๊ฐ)
class ExampleTest {
@BeforeEach
void setUp() {
// ํ
์คํธ ๋ฉ์๋ ์คํ ์ ํธ์ถ๋จ
}
@Test
void testA() {
// testA ์คํ ์ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋จ
}
@Test
void testB() {
// testB ์คํ ์ ๋ ๋ค๋ฅธ ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋จ
}
}
PER_METHOD๋ ๊ฐ ํ ์คํธ๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ ์๋ก์ ์ํ์ ์ํฅ์ ์ฃผ์ง ์์ง๋ง ์ํ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
2. PER_CLASS
- ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋๊ณ , ๋ชจ๋ ํ ์คํธ ๋ฉ์๋์์ ์ด ์ธ์คํด์ค๊ฐ ์ฌ์ฌ์ฉ๋๋ค.
- @BeforeAll์ ์ฌ์ฉํ๋ฉด ํด๋์ค ์ ์ฒด์์ ํ ๋ฒ๋ง ์คํ๋๋ฏ๋ก ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class ExampleTest {
@BeforeAll
void initAll() {
// ๋ชจ๋ ํ
์คํธ ๋ฉ์๋ ์คํ ์ ํ ๋ฒ๋ง ํธ์ถ๋จ
}
@Test
void testA() {
// testA ์คํ ์ ๋์ผํ ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋จ
}
@Test
void testB() {
// testB ์คํ ์์๋ ๋์ผํ ์ธ์คํด์ค๊ฐ ์ฌ์ฉ๋จ
}
}
PER_CLASS๋ ์ํ๋ฅผ ๊ณต์ ํ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋์ง๋ง ํ ์คํธ ๊ฐ ์ธ์คํด์ค ์ํ๊ฐ ๊ณต์ ๋๋ฏ๋ก, ํ ์คํธ ๊ฐ ์์กด์ฑ์ด ๋ฐ์ํจ.
@BeforeAll, @AfterAll
- @BeforeAll : PER_CLASS์์๋ง ์ฌ์ฉ๋๋ฉฐ, ๋ชจ๋ ํ ์คํธ ์ ์ ํ ๋ฒ๋ง ์คํ
- @AfterAll : PER_METHOD์ PER_CLASS ๋ชจ๋์ ์ฌ์ฉ๋๊ณ ๋ชจ๋ ํ ์คํธ ์ ์ ํ ๋ฒ๋ง ์คํ ๋จ
[QUESTION] @BeforeAll ์ด PER_CLASS์์๋ง ์ฌ์ฉ๋๋ ์ด์ , @AfterAll์ PER_METHOD, PER_CLASS ๋ชจ๋ ์ฌ์ฉ๊ฐ๋ฅํ ์ด์
[ANSWER]
@BeforeAll์ ํด๋์ค ์์ค์์ ํ ๋ฒ๋ง ์คํ๋๋ ๋ฉ์๋. ์ฆ ํ ์คํธ ํด๋์ค์ ๋ชจ๋ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ฑ ํ ๋ฒ ์คํ๋จ
PER_CLASS์์๋ ํ ์คํธ ํด๋์ค์ ๋ํด ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋๋ฏ๋ก, @BeforeAll ๋ฉ์๋๊ฐ ํด๋์ค ์ธ์คํด์ค์์ ํ ๋ฒ ์คํ๋๊ณ , ์ดํ์ ๋ชจ๋ ํ ์คํธ๊ฐ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ
@AfterAll ์ ๋ชจ๋ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋ ํ์ ํ ๋ฒ๋ง ์คํ๋๋ ๋ฉ์๋์ด๋ค. ์ฌ๊ธฐ์ PER_CLASS์์๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ํ๋๋ง ์์ฑ๋๋ฏ๋ก, ๋ชจ๋ ํ ์คํธ๊ฐ ๋๋๊ณ ํ๋ฒ๋ง ํธ์ถ๋๋ฉด ๋๋ค.
PER_METHOD์์๋ ๊ฐ ํ ์คํธ๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋์ง๋ง, @AfterAll์ด ํ ์คํธ ๋ฉ์๋๊ฐ ๋ชจ๋ ๋๋ ํ์ ํ ๋ฒ ํธ์ถ๋๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
๋ฏธ์ - REST API ์ค๊ณ
์ด๋ฒ ๋ฏธ์ ์์๋ REST API ์ค๊ณํ๋ ๋ฏธ์ ์ด ์ฃผ์ด์ก๋ค.
HTTP ์ฃผ์ ๋ฉ์๋ ์ ๋ฆฌ (GET / POST / PUT / PATCH / DELETE)
- GET : ๋ฆฌ์์ค ์กฐํ
- POST : ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
- PUT : ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ์ฆ ๋ฎ์ด์ฐ๊ธฐ ์ํ
- PATCH : ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
- DELETE : ๋ฆฌ์์ค ์ญ์
์ด๋ฒ ๋ฏธ์
๊ณผ ๋ฐ์๊ตญ์ ํ๋ฉด์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ HTTP ์ฃผ์ ๋ฉ์๋์ ๋ํด ์ง์คํด์ผ ๋๋ค๋ ๊ฒ์ ์ ์ ์์๋ค. api๋ฅผ ์ค๊ณํ ๋ ค๋ฉด ์ด์ฉ์ ์์ด ๊ฐ HTTP ๋ฉ์๋์ ๋ํด ์์์ผ URL์ ์ค์ ํ ๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ๋๋์ง๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฒ์ฃผ ๋ ๊ฐ์ธ ์ผ์ ์ด ๋๋ฌด ๋ง์์ ์์ฝ๊ฒ๋ ์ง๋๋ฅผ ๋ค ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ค. ๋ฐ์๊ตญ์ ๋ง๋ค์ด์ผ ๋๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๋ด๊ฐ ๊ฐ์ฅ ๊ณต๋ถํด๋ณผ๋งํ ๊ฒ์ด TEST ์ฝ๋์ ๋ํด์ ์กฐ์ฌ๋ฅผ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด์ฌํ ํ์๋ค.
GET, POST, PUT, PATCH, DELETE ๋ฉ์๋์ ๋ํด์ ์กฐ๊ธ์ด๋ผ๋ ๊ณต๋ถํ ์ ์์ด์ ์ข์๊ณ , ๋ฐ๋ก ๊ณต๋ถํด์ ๋ธ๋ก๊ทธ์ ์ฌ๋ ค์ผ ๊ฒ ๋ค๊ณ ์๊ฐํ์๋ค!
'๐ ๋ฐฑ์๋ ๊ฐ๋ฐ > SPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DTO๋ฅผ Request, Response๋ก ๋๋๋ ์ด์ (0) | 2025.02.15 |
---|---|
[์ธํ๋ฐ ์๋ฐ์ ํด๋ฝ 2๊ธฐ - BE] 3์ฃผ์ฐจ ๋ฐ์๊ตญ (2) | 2024.10.20 |
[์ธํ๋ฐ ์๋ฐ์ ํด๋ฝ 2๊ธฐ - BE] 1์ฃผ์ฐจ ๋ฐ์๊ตญ (10) | 2024.10.06 |
Spring ์๋ ์ฌ์์ (0) | 2024.07.25 |
Spring #5 MVC์ ํ ํ๋ฆฟ ์์ง (0) | 2024.07.16 |