TDD

์ฐธ๊ณ  ๋™์˜์ƒ

https://howtodoinjava.com/spring-boot2/testing/spring-boot-mockmvc-example/

TDD?

Test Driven Development ์˜ ์ค„์ธ๋ง์œผ๋กœ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€

ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ , ์ด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ

์ด๋Ÿฐ ๊ฐœ๋…์ด๋‹ค

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ์ž˜ ๋™์ž‘ํ•˜๊ณ , ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ๋ชฉ์ ์ด๋‹ค

์–ธ์ œ์‚ฌ์šฉํ•ด์•ผํ•˜๋‚˜?

  • ์ฒ˜์Œํ•ด๋ณด๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฃผ์ œ

  • ๊ณ ๊ฐ์˜ ์š”๊ตฌ์กฐ๊ฑด์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ

  • ๊ฐœ๋ฐœํ•˜๋Š” ์ค‘์— ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋ฐ”๊ฟ”์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ

  • ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‚˜์„œ ์ด ์ฝ”๋“œ๋ฅผ ๋ˆ„๊ตฐ๊ฐ€ ์œ ์ง€๋ณด์ˆ˜ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ

=> ๋ถˆํ™•์‹ค์„ฑ์ด ๋†’์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค!

์ง„ํ–‰๋ฐฉ์‹(์ ˆ์ฐจ)

  • Ask : ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์— ์งˆ๋ฌธ - ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ ์‹คํŒจ

  • Respond : ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์งˆ๋ฌธ์— ๋Œ€๋‹ต - ํ…Œ์ŠคํŠธ ์„ฑ๊ณต

  • Refine : ์•„์ด๋””์–ด๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์€ ์ œ๊ฑฐํ•˜๊ณ , ๋ชจํ˜ธํ•œ ๊ฒƒ์€ ๋ช…ํ™•ํžˆ ํ•ด์„œ ๋Œ€๋‹ต์„ ์ •์ œ - ๋ฆฌํŒฉํ† ๋ง

    • ์†Œ์Šค์˜ ๊ฐ€๋…์„ฑ์ด ์ ์ ˆํ•œ๊ฐ€?

    • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋Š” ์—†๋Š”๊ฐ€?

    • ์ด๋ฆ„์ด ์ž˜๋ชป ๋ถ€์—ฌ๋œ ๋ฉ”์†Œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ช…์€ ์—†๋Š”๊ฐ€?

    • ๊ตฌ์กฐ์˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์—†๋Š”๊ฐ€?

  • Repeat : ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ๊ณ„์† ์ง„ํ–‰

Unit Test

ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๊ธฐ์ค€์œผ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ

  • ๋ชจ๋“ˆ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๋˜๋Š” ๋ฉ”์†Œ๋“œ

โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

BDD

Behavior-driven development์˜ ์•ฝ์ž๋กœ ํ–‰์œ„ ์ฃผ๋„ ๊ฐœ๋ฐœ์ด๋ผ๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. โ†’ ์—ฌ๊ธฐ์„œ ํ–‰์œ„๋ž€ ๋น„์ง€๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค

ํ•จ์ˆ˜ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ , ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค

  • Feature : ํ…Œ์ŠคํŠธ์— ๋Œ€์ƒ์˜ ๊ธฐ๋Šฅ / ์ฑ…์ž„์„ ๋ช…์‹œ

  • Scenario : ํ…Œ์ŠคํŠธ ๋ชฉ์ ์— ๋Œ€ํ•œ ์ƒํ™ฉ์„ ์„ค๋ช…

  • Given : ์‹œ๋‚˜๋ฆฌ์˜ค ์ง„ํ–‰์— ํ•„์š”ํ•œ ๊ฐ’์„ ์„ค์ •

  • When : ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด์„ ๋ช…์‹œ

  • Then : ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์™„๋ฃŒํ–ˆ์„ ๋•Œ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ช…์‹œ

JUnit?

  • ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒ๊ณผ ๊ฐ™์€์ง€๋ฅผ ํŒ๋ณ„ํ•ด์ฃผ๋Š” ๋‹จ์ •๋ฌธ(assertions)

  • ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์—์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜(test fixture)

    • ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ณ , ๋งค๋ฒˆ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ƒํƒœ๋‚˜ ํ™˜๊ฒฝ

  • ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ(test runner)

Junit3์—์„œ๋Š” setUp๊ณผ tearDown์ด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค

setUp์€ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ณตํ†ต์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

tearDown์€ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ๋‚˜์„œ ๋‹ค์Œ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ

test suite : ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ

Junit4๋ถ€ํ„ฐ๋Š”

@Test : ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ๋Š” ๊ด€๊ณ„์—†์ด ์ด ์• ๋…ธํ…Œ์ด์…˜๋งŒ ๋ถ™์ด๋ฉด ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

  • @Ignore๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Junit3์—์„œ ์‚ฌ์šฉํ•˜๋˜ setUp๊ณผ tearDown์€ @Before๋‚˜ @After๋กœ ๋Œ€์‹ ํ•ด์„œ ์‚ฌ์šฉ

@BeforeClass, @AfterClass๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋‚ด์—์„œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ๊ฐ€๋Šฅ

fail() ํ•จ์ˆ˜ : Junit์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ, ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋ฌด์กฐ๊ฑด ์‹คํŒจ = throw new Exception

  • ์˜ค๋ฅ˜ vs ์‹คํŒจ : ์˜ค๋ฅ˜๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹คํŒจ๋ฅผ ์˜๋ฏธํ•˜๊ณ , ์ด๋Š” ์ผ€์ด์Šค ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธ

assertEquals ํ•จ์ˆ˜ : ์˜ˆ์ƒ๊ฐ’๊ณผ ์‹ค์ œ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ

  • assertEquals(์˜ˆ์ƒ๊ฐ’, ์‹ค์ œ๊ฐ’) ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ

  • assertArrayEquals(์˜ˆ์ƒ๊ฐ’, ์‹ค์ œ๊ฐ’) ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ

@Before : ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ด๊ฑธ๋กœ ํ‘œ์‹œํ•ด๋‘” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค

@RunWith : ์—ฌ๊ธฐ์„œ ์ธ์ž๋กœ ๋„ฃ์–ด์ค€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ๋‚ด์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง€์ •ํ•ด์ค€๋‹ค

  • Spring์—์„œ๋Š” SpringJUnit4ClassRunner๋ฅผ ์ธ์ž๋กœ ์ž์ฃผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•ด์ฃผ๋Š”๋ฐ, ์ง€์ •ํ•ด๋‘๋ฉด Repeat, ProfileValueSourceConfiguration๋“ฑ ์Šคํ”„๋ง์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • @SuiteClasses๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฑด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ธ์ž๋ฅผ ๋„ฃ์–ด์ค€ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰

Hamcrest

Matcher ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ…Œ์ŠคํŠธ ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ๋–„ ์ข€ ๋” ๋ฌธ๋งฅ์ ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Matcher๋ž€ ๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ ์ผ์น˜๋‚˜ ๊ทœ์น™์ค€์ˆ˜ ๋“ฑ์„ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฉ”์†Œ๋“œ๋‚˜ ๊ฐ์ฒด์ด๋‹ค.

์˜ˆ์‹œ๋กœ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” assertEquals ๋ง๊ณ  assertThat์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜๋Š”๋ฐ ์ด๊ฑด ๋ฌธ๋งฅ์ ์œผ๋กœ๋„ ๋” ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

assertThat(ํ…Œ์ŠคํŠธ๋Œ€์ƒ, matcher๊ตฌ๋ฌธ) / assertThat("๋ฉ”์„ธ์ง€", ํ…Œ์ŠคํŠธ ๋Œ€์ƒ, matcher ๊ตฌ๋ฌธ)

  • @Ignore๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Mock?

๋ชจ๋“ˆ์˜ ๊ฒ‰๋ชจ์–‘์ด ์‹ค์ œ ๋ชจ๋“ˆ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋งŒ๋“  ๊ฐ€์งœ ๊ฐ์ฒด

๊ธฐ๋ณธ์ ์ธ ๋ถ„๋ฅ˜ ๊ฐœ๋…

ํ…Œ์ŠคํŠธ ๋”๋ธ”์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฑด ์˜ค๋ฆฌ์ง€๋„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋Œ€์‹ ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ

  1. ๋”๋ฏธ ๊ฐ์ฒด : ๋ฉ์ฒญํ•œ ๋ชจ์กฐํ’ˆ, ๋‹จ์ˆœํ•œ ๊ป๋ฐ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์˜ค๋กœ์ง€ ์ธ์Šคํ„ด์Šคํ™”๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ๋งŒ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด โ†’ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋ฟ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ๊นŒ์ง€๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ - ํƒ€์ž… ๊ธฐ๋ณธ๊ฐ’((), null, false ๋“ฑ)์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„ ์œผ๋กœ๋งŒ / ๋งŒ์•ฝ ํ˜ธ์ถœ ์‹œ์—๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋งŒ๋“ค์–ด๋‘ฌ์•ผํ•จ

  2. ํ…Œ์ŠคํŠธ ์Šคํ… : ๋”๋ฏธ ๊ฐ์ฒด๊ฐ€ ๋งˆ์น˜ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด๋‘” ๊ฐ์ฒด / ๊ฐ์ฒด์˜ ํŠน์ • ์ƒํƒœ๋ฅผ ๊ฐ€์ •ํ•ด์„œ ๋งŒ๋“ค์–ด๋‘” ๋‹จ์ˆœ ๊ตฌํ˜„์ฒด / ํŠน์ •ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๊ฑฐ๋‚˜ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…

  3. ํŽ˜์ดํฌ ๊ฐ์ฒด : ์Šคํ…๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์Šคํ…์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์— ๋น„ํ•ด์„œ ํŽ˜์ดํฌ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€ํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋‚˜ ์ข€ ๋” ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์นญ โ†’ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์•„์ดํ…œ๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋งŒ ์‹ค์ œ๋กœ DB์— ์ ‘์†ํ•ด์„œ ๋น„๊ตํ•  ๋•Œ์™€ ๋™์ผํ•œ ๋ชจ์Šต์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Map์ด๋‚˜ List๋ฅผ ์ด์šฉํ•ด์„œ DB๊ฐ™์€ ์™ธ๋ถ€ ์˜์กด ํ™˜๊ฒฝ์„ ๋Œ€์ฒดํ•œ๋‹ค

  4. ํ…Œ์ŠคํŠธ ์ŠคํŒŒ์ด : ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ๊ฐ์ฒด์˜ ํ˜ธ์ถœ, ๊ทธ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ๋“ฑ ํ˜ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๋ชฐ๋ž˜ ๊ฐ์‹œํ•ด์„œ ๊ธฐ๋กํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์š”์ฒญ์ด ์˜ค๋ฉด ๊ธฐ๋ก ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋”๋ธ” โ†’ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๊ณ , ํ…Œ์ŠคํŠธ ์ŠคํŒŒ์ด๊ฐ€ ํ•„์š”ํ•ด๋„ Mock์—์„œ ์ง€์›์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›ํ•ด์ฃผ๋Š”๊ฑฐ ์‚ฌ์šฉ

  5. Mock ๊ฐ์ฒด : ์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ ๋”๋ธ”์€ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ Mock ๊ฐ์ฒด๋Š” ํ–‰์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

Mock ํ”„๋ ˆ์ž„์›Œํฌ

Mock ํ”„๋ ˆ์ž„์›Œํฌ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋Š” ๋™์ ์œผ๋กœ Mock ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ ๊ฐ€๋Šฅ

์žฅ์ 

  • Mock ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ ๋ช…์‹œ์ ์ธ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • Mock ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ํ–‰์œ„๊นŒ์ง€๋„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

  • EasyMock

  • jMock

  • Mockito

  • assertArrayEquals(์˜ˆ์ƒ๊ฐ’, ์‹ค์ œ๊ฐ’) ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ

MockMvc?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํ”„๋ง MVC์˜ ๋™์ž‘์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค

์ ์šฉ๊ณผ์ •

@WebMvcTest(ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฆ„.class)

  • MVC๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์• ๋…ธํ…Œ์ด์…˜์ด

  • ์›น์ƒ์—์„œ์˜ request, response์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ

  • Controller, ControllerAdvice, JsonComponent, Converter, GenericConverter, ๋“ฑ ์ œํ•œ๋œ ๋‚ด์šฉ๋งŒ ์Šค์บ”

@RunWith : ์—ฌ๊ธฐ์„œ ์ธ์ž๋กœ ๋„ฃ์–ด์ค€ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ๋‚ด์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง€์ •ํ•ด์ค€๋‹ค

  • Spring์—์„œ๋Š” SpringJUnit4ClassRunner๋ฅผ ์ธ์ž๋กœ ์ž์ฃผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•ด์ฃผ๋Š”๋ฐ, ์ง€์ •ํ•ด๋‘๋ฉด Repeat, ProfileValueSourceConfiguration๋“ฑ ์Šคํ”„๋ง์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • @SuiteClasses๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๊ฑด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ธ์ž๋ฅผ ๋„ฃ์–ด์ค€ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰

Hamcrest

Matcher ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ…Œ์ŠคํŠธ ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ๋–„ ์ข€ ๋” ๋ฌธ๋งฅ์ ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Matcher๋ž€ ๊ฐ’๋“ค์— ๋Œ€ํ•ด์„œ ์ผ์น˜๋‚˜ ๊ทœ์น™์ค€์ˆ˜ ๋“ฑ์„ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฉ”์†Œ๋“œ๋‚˜ ๊ฐ์ฒด์ด๋‹ค.

์˜ˆ์‹œ๋กœ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” assertEquals ๋ง๊ณ  assertThat์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•˜๋Š”๋ฐ ์ด๊ฑด ๋ฌธ๋งฅ์ ์œผ๋กœ๋„ ๋” ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

assertThat์˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

assertThat(ํ…Œ์ŠคํŠธ๋Œ€์ƒ, matcher๊ตฌ๋ฌธ) / assertThat("๋ฉ”์„ธ์ง€", ํ…Œ์ŠคํŠธ ๋Œ€์ƒ, matcher ๊ตฌ๋ฌธ)

Mock?

๋ชจ๋“ˆ์˜ ๊ฒ‰๋ชจ์–‘์ด ์‹ค์ œ ๋ชจ๋“ˆ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋งŒ๋“  ๊ฐ€์งœ ๊ฐ์ฒด

๊ธฐ๋ณธ์ ์ธ ๋ถ„๋ฅ˜ ๊ฐœ๋…

ํ…Œ์ŠคํŠธ ๋”๋ธ”์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฑด ์˜ค๋ฆฌ์ง€๋„ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋Œ€์‹ ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ

  1. ๋”๋ฏธ ๊ฐ์ฒด : ๋ฉ์ฒญํ•œ ๋ชจ์กฐํ’ˆ, ๋‹จ์ˆœํ•œ ๊ป๋ฐ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์˜ค๋กœ์ง€ ์ธ์Šคํ„ด์Šคํ™”๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ๋งŒ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด โ†’ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋ฟ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ๊นŒ์ง€๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ - ํƒ€์ž… ๊ธฐ๋ณธ๊ฐ’((), null, false ๋“ฑ)์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„ ์œผ๋กœ๋งŒ / ๋งŒ์•ฝ ํ˜ธ์ถœ ์‹œ์—๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋งŒ๋“ค์–ด๋‘ฌ์•ผํ•จ

  2. ํ…Œ์ŠคํŠธ ์Šคํ… : ๋”๋ฏธ ๊ฐ์ฒด๊ฐ€ ๋งˆ์น˜ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด๋‘” ๊ฐ์ฒด / ๊ฐ์ฒด์˜ ํŠน์ • ์ƒํƒœ๋ฅผ ๊ฐ€์ •ํ•ด์„œ ๋งŒ๋“ค์–ด๋‘” ๋‹จ์ˆœ ๊ตฌํ˜„์ฒด / ํŠน์ •ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๊ฑฐ๋‚˜ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…

  3. ํŽ˜์ดํฌ ๊ฐ์ฒด : ์Šคํ…๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์Šคํ…์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์— ๋น„ํ•ด์„œ ํŽ˜์ดํฌ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€ํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋‚˜ ์ข€ ๋” ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ง€์นญ โ†’ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์•„์ดํ…œ๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋งŒ ์‹ค์ œ๋กœ DB์— ์ ‘์†ํ•ด์„œ ๋น„๊ตํ•  ๋•Œ์™€ ๋™์ผํ•œ ๋ชจ์Šต์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Map์ด๋‚˜ List๋ฅผ ์ด์šฉํ•ด์„œ DB๊ฐ™์€ ์™ธ๋ถ€ ์˜์กด ํ™˜๊ฒฝ์„ ๋Œ€์ฒดํ•œ๋‹ค

  4. ํ…Œ์ŠคํŠธ ์ŠคํŒŒ์ด : ํ…Œ์ŠคํŠธ ๋‚ด์—์„œ ๊ฐ์ฒด์˜ ํ˜ธ์ถœ, ๊ทธ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ ๋“ฑ ํ˜ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๋ชฐ๋ž˜ ๊ฐ์‹œํ•ด์„œ ๊ธฐ๋กํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์š”์ฒญ์ด ์˜ค๋ฉด ๊ธฐ๋ก ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋”๋ธ” โ†’ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๊ณ , ํ…Œ์ŠคํŠธ ์ŠคํŒŒ์ด๊ฐ€ ํ•„์š”ํ•ด๋„ Mock์—์„œ ์ง€์›์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›ํ•ด์ฃผ๋Š”๊ฑฐ ์‚ฌ์šฉ

  5. Mock ๊ฐ์ฒด : ์ผ๋ฐ˜์ ์ธ ํ…Œ์ŠคํŠธ ๋”๋ธ”์€ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ Mock ๊ฐ์ฒด๋Š” ํ–‰์œ„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

Mock ํ”„๋ ˆ์ž„์›Œํฌ

Mock ํ”„๋ ˆ์ž„์›Œํฌ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋Š” ๋™์ ์œผ๋กœ Mock ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ด๊ฒƒ์€ WebApplicationContext๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋‚ด์žฅ๋œ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ Mock ์„œ๋ธ”๋ฆฟ์„ ์ œ๊ณต

์žฅ์ 

  • Mock ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ ๋ช…์‹œ์ ์ธ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  • Mock ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ํ–‰์œ„๊นŒ์ง€๋„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

  • EasyMock

  • jMock

  • Mockito

MockMvc?

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํ”„๋ง MVC์˜ ๋™์ž‘์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค

์ ์šฉ๊ณผ์ •

@WebMvcTest(ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฆ„.class)

  • MVC๋ฅผ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์• ๋…ธํ…Œ์ด์…˜์ด

  • ์›น์ƒ์—์„œ์˜ request, response์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ

  • Controller, ControllerAdvice, JsonComponent, Converter, GenericConverter, ๋“ฑ ์ œํ•œ๋œ ๋‚ด์šฉ๋งŒ ์Šค์บ”

@AutoConfigureMockMvc ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋‹ค๋ฅธ ์„ค์ • ์—†์ด MockMvc๋ฅผ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์Šต

@SpringBootTest

์ด ์• ๋…ธํ…Œ์ด์…˜์€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ด ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ œ๊ณต

@AutoConfigureMockMvc

MockMvc์‚ฌ์šฉ

Service๋‚˜ Repository๋ฅผ ๊ฐ€๊ธ‰์ ์ด๋ฉด ๋นˆ์œผ๋กœ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž! - ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์“ฐ์ง€๋งˆ!

@ControllerAdvice

@Valid

get

  • ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getAllStaff ํ…Œ์ŠคํŠธ

    • ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋„ฃ์–ด๋‘๊ณ  ๊ฐ€์ ธ์˜ฌ๊นŒ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ โ†’ ๊ทธ๋ƒฅ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ํ•ด์„œ ์‚ฌ์šฉ

  • getAllStaff๋ฅผ ํ˜ธ์ถœ์‹œ, ๋งŒ์•ฝ์— db์•ˆ์— ๊ฐ’์ด ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๋•Œ์˜ ํ…Œ์ŠคํŠธ

    • 204-no content๋กœ ๋ณด๋‚ด์คŒ

  • ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” getStaff ํ…Œ์ŠคํŠธ

  • ์—†๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€๋‹ฌ๋ผ๋Š” ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

    • ๋งŒ์•ฝ ์—†๋Š” ๊ฐ’์„ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์›๋ž˜๋Š” RuntimeException์„ ์ผ์œผํ‚ค๋„๋ก ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ

    • ์—†๋Š” ๊ฐ’์„ ์š”์ฒญํ• ์‹œ, ์ปจํŠธ๋กค๋Ÿฌ์— ๊ฐ€์ ธ์˜จ๊ฐ’์ด ์—†์„ํ…Œ๋‹ˆ ์—ฌ๊ธฐ์„œ ์—†๋Š” ๊ฐ’์ผ ๋•Œ 400-bad request์œผ๋กœ ๋–จ๊ตฌ๋ผ๊ณ  ๋‚ด๋ถ€์ฝ”๋“œ์ˆ˜์ •

post

  • id๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์ธ์ž๋“ค์„ ์ฑ„์›Œ๋„ฃ์–ด์ฃผ๋ฉด ๊ทธ ์ธ์ž๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” saveStaff ํ…Œ์ŠคํŠธ

  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” id๋กœ post ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

    • ๋งŒ์•ฝ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” id๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ƒˆ๋กœ์šด ์ธ์ž๋“ค์„ ๋„ฃ์–ด์ฃผ๋ฉด ํ˜„์žฌ๋Š” ์ˆ˜์ •ํ•ด์„œ ๋„ฃ์–ด์ฃผ๋Š”๋ฐ, ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก! - UPDATE์™€ ๊ธฐ๋Šฅ์ด ๊ฒน์นœ๋‹ค

    • service์—์„œ ๋งŒ์•ฝ ๋ฐ›์€ ๊ฐ’์˜ id์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด 400-bad request๋ฆฌํ„ด

put

  • ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ์ˆ˜์ •ํ•˜๋Š” ํ…Œ์ŠคํŠธ - ๋ชจ๋“  ์ธ์ž๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผํ•จ

  • ์ธ์ž๋“ค ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ์—†์„ ๊ฒฝ์šฐ(id, name, position)์˜ ํ…Œ์ŠคํŠธ โ†’ @Valid๋‚˜ @ControllerAdvice๋ฅผ ํ†ตํ•ด์„œ ๋„๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, PUT์— ํ•œ์ •ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์–ด์„œ ๋‹ด์— ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ

    • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ›์„ ๋–„, ๋งŒ์•ฝ์— ์ธ์ž์ค‘์— ๋น ์ง„๊ฒŒ ์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ 400-bad request์œผ๋กœ ๋ฆฌํ„ด

  • ์ธ์ž๋“ค์€ ๋‹ค ๋“ค์–ด์™”๋Š”๋ฐ, ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š๋Š” id๊ฐ’์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ

    • ์„œ๋น„์Šค์—์„œ 404-not found๋กœ ๋ฆฌํ„ด

patch

  • ์ˆ˜์ •ํ•˜๋Š” ํ…Œ์ŠคํŠธ - ์กด์žฌํ•˜๋Š” id๊ฐ’์— ๋Œ€ํ•ด์„œ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ ์ธ์ž๋ฅผ ๋„ฃ์–ด์ค˜์•ผํ•จ

  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” id์— ๋Œ€ํ•ด์„œ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

    • ์„œ๋น„์Šค์—์„œ 404-not found๋กœ ๋ฆฌํ„ด

  • ๊ธฐ์กด ๊ฐ์ฒด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ์ž๋ฅผ ๋ฐ›์•˜์„ ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

    • ๋ฐ›์•„์˜จ ๊ฐ’๋“ค์ด null์ผ ๊ฒฝ์šฐ์— 400-bad request๋กœ ๋ฆฌํ„ด

delete

  • ์›ํ•˜๋Š” id์— ๋Œ€ํ•ด์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

  • ์กด์žฌํ•˜์ง€ ์•Š์€ id์— ๋Œ€ํ•ด์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ…Œ์ŠคํŠธ

    • ์—†์ง€๋งŒ ์„ฑ๊ณต 204-no content

Last updated

Was this helpful?