[์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ 2๊ธฐ - BE] 2์ฃผ์ฐจ ๋ฐœ์ž๊ตญ

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์˜ ์—…๋ฐ์ดํŠธ๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
  1. ๊ธฐ๋Šฅ์  ์•ˆ์ •์„ฑ ๊ฐ์†Œ
    • Spring Data Jpa๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ. ์ด๋ฅผ ์žฌ์ •์˜ ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋˜ ์—ฌ๋Ÿฌ ์ตœ์ ํ™”๋‚˜ ๊ธฐ๋Šฅ์ด ๋ฌด์‹œ๋  ์ˆ˜ ์žˆ์Œ
  2.  

 

[ SOLVE ] ๊ทธ๋Ÿผ override๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜?

  1. CUSTOM Repository ์‚ฌ์šฉ
  2. 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>
}

 

  1. ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ ํ™œ์šฉ
  2. 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 ]

  1. ํ…Œ์ŠคํŠธ ๊ฐ„ ๋…๋ฆฝ์„ฑ ๋ณด์žฅ

ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๊ณ , ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„์•ผ ํ•จ. ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์›๋ž˜ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ๊ฐ€ ํ•ญ์ƒ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์œ ์ง€

  1. ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€

ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„์—๋„ ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜์ง€ ์•Š์œผ๋ฉด, ํ…Œ์ŠคํŠธ ์ค‘์— ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‚จ์•„ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ดํ›„์˜ ํ…Œ์ŠคํŠธ๋‚˜ ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ์˜ํ–ฅ์„ ๋ฏธ์ณ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์Œ

  1. ํ…Œ์ŠคํŠธ ์„ฑ๋Šฅ ํ–ฅ์ƒ

ํ…Œ์ŠคํŠธ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์‹ค์ œ๋กœ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŠธ๋žœ์žญ์…˜์„ ๋กค๋ฐฑํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ ๋ฉด์—์„œ ์œ ๋ฆฌ.


์ธ์Šคํ„ด์Šค ์ƒ๋ช…์ฃผ๊ธฐ

  1. 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 ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๊ณ , ๋”ฐ๋กœ ๊ณต๋ถ€ํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ ค์•ผ ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค!

๋ฐ˜์‘ํ˜•