Spring Security ๋ฐ Jwt๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธ ๋ก์ง์ ๊ตฌํํ๋ ์ค, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. org.springframework.security.authentication.BadCredentialsException: ์๊ฒฉ ์ฆ๋ช
์ ์คํจํ์์ต๋๋ค. at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:80) at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(Ab..
Backend Language
๐ฅ ํ
์คํธ ๋ฒ์์ ์ข
๋ฅ ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ์๋ฃ ํ์ ์งํํ๋ ํ
์คํธ๋ฅผ ํตํฉ ํ
์คํธ๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ๊ณ ๊ฐ ์
์ฅ์์ ์๊ตฌํ ๊ธฐ๋ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋์ง ์ํํ๋ ํ
์คํธ๋ฅผ ์ธ์ ํ
์คํธ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด์ฒ๋ผ, ํ
์คํธ์ ๊ด๋ จ ์ฉ์ด๋ ๋ฌธ๋งฅ์ด๋ ์ฌ์ฉ์์ ๋ฐ๋ผ ์๋ฏธ๊ฐ ๋ค๋ฅผ ์ ์๋ค. ๐ป ๊ธฐ๋ฅ ํ
์คํธ(Functional Test) ์ E2E ํ
์คํธ ์ฌ์ฉ์ ์
์ฅ์์ ์์คํ
์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธํ๋ค. ์ด ํ
์คํธ๋ฅผ ์ํด์๋ ์์คํ
์ ๊ตฌ๋ํ๊ณ ์ฌ์ฉํ๋๋ฐ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ์์๊ฐ ํ์ํ๋ค. ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ฉํ๋ ์น ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ฐ์ผ ์ฑ๋ถํฐ ์์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ถ ์๋น์ค์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ํ๋๋ก ์ฎ์ด ์งํ ๋ธ๋ผ์ฐ์ (๋) ~ ๋ฐ์ดํฐ๋ฒ ์ด์ค(๋)๊น์ง ๋ชจ๋ ๊ตฌ์ฑ์์๋ฅผ ์์ ํ ๋
ผ๋ฆฌ์ ์ผ๋ก ํ๋์ ๊ธฐ๋ฅ์ผ๋ก ๋ค..
๐ฅจ ํ
์คํธ๊ฐ ์ด๋ ค์ด ์ฝ๋ ๊ฐ๋ฐ์ ์งํํ๋ค๋ณด๋ฉด, ํ
์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ค์ ๋ง๋๊ฒ ๋๋ค. ํ
์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค. 1. ํ๋ ์ฝ๋ฉ๋ ๊ฒฝ๋ก 2. ์์กด ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑ 3. ์ ์ ๋ฉ์๋ ์ฌ์ฉ 4. ์คํ ์์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒฐ๊ณผ 5. ์ญํ ์ด ์์ฌ ์๋ ์ฝ๋ 6. ๊ทธ ์ธ ํ
์คํธ๊ฐ ์ด๋ ค์ด ์ฝ๋ ๐ ํ๋ ์ฝ๋ฉ๋ ๊ฒฝ๋ก ํ๋ ์ฝ๋ฉ๋ ๊ฒฝ๋ก๋ผํจ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ฉ๋์ด ์๋ ๊ฒ์ ๋ปํ๋ค. Path path = Paths.get("D:\\data\\pay\\cp0001.csv"); ๋ค์๊ณผ ๊ฐ์ด ๋์ด ์๋ ์ฝ๋๋ฅผ ํ
์คํธ ํ๋ ค๋ฉด ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ด ๋ฐ๋์ ์์นํด ์์ด์ผ ํ๋ค. ํ์ง๋ง, ์๋์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๋๋ผ์ด๋ธ๊ฐ ์๊ฑฐ๋ ์๋์ฐ ์ ์ฉ ํ์ผ ๊ฒฝ๋ก์ด๊ธฐ ๋๋ฌธ์ ๋งฅ OS, ๋ฆฌ๋
์ค์์๋ ํ์ผ์ ์ด ์ ์์ด ๋ค๋ฅธ OS๋ฅผ..
๐ ๋์ญ์ ํ์์ฑ [์ธ๋ถ ์์ธ์ด ํ
์คํธ์ ๊ด์ฌํ๋ ์ฃผ์ ์] ํ
์คํธ ๋์์์ ํ์ผ ์์คํ
์ฌ์ฉ ํ
์คํธ ๋์์์ DB๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ ํ
์คํธ ๋์์์ ์ธ๋ถ์ HTTP ์๋ฒ์ ํต์ ํ
์คํธ ๋์์ด ์์ ๊ฐ์ ์ธ๋ถ ์์ธ์ ์์กดํ์ฌ ์ฌ์ฉํ๋ ์ธ๋ถ API ์๋ฒ๊ฐ ์ผ์์ ์ผ๋ก ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ํ
์คํธ๋ฅผ ์ํํ๊ฒ ์ํํ ์ ์๋ค. ๋ํ, ๋ด๋ถ DB๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ํญ์ ๊ฐ๊ฒ ์งํํ๊ธฐ๋ ์ด๋ ต๋ค. ๋ค์๊ณผ ๊ฐ์ ์ธ๋ถ ์์ธ์ ํ
์คํธ ์์ฑ์ ์ด๋ ต๊ฒ ๋ง๋ค ๋ฟ๋ง ์๋๋ผ ํ
์คํธ ๊ฒฐ๊ณผ๋ ์์ธกํ ์ ์๊ฒ ๋ง๋ ๋ค. ํ
์คํธ ๋์์์ ์์กดํ๋ ์์ธ ๋๋ฌธ์ ํ
์คํธ๊ฐ ์ด๋ ค์ธ ๋์๋ ๋์ญ์ ์จ์ ํ
์คํธ๋ฅผ ์งํํ๋ค. ์ธ๋ถ ์์ธ์ผ๋ก ์ธํด ํ
์คํธ๊ฐ ์ด๋ ค์ธ ๋, ์ธ๋ถ ์์ธ์ ๋์ ํ๋ ๋์ญ์ด ์ธ๋ถ ์์ธ์ ๋์ ํ์ฌ ํ
์คํธ์ ..
๐บ Mockito๋ ๋ชจ์ ๊ฐ์ฒด ์์ฑ, ๊ฒ์ฆ, ์คํ์ ์ง์ํ๋ ํ๋ ์์ํฌ์ด๋ค. ์ด๋, ์ธ๊ธฐ์๋ ์๋ฐ ๋ชจ์ ๊ฐ์ฒด ํ๋ ์์ํฌ ์ค ํ๋๋ก, ์ด๋ฅผ ํตํด ๋์ญ์ ๋ณด๋ค ์ํํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ๐บ dependencies ์ถ๊ฐ (Gradle) dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' // junit testImplementation('org.junit.jupiter:junit-jupiter:5.5.0') // mockito -> ์ด๋ถ๋ถ ์ถ๊ฐ testImplementation('org.mock..
๐ ๊ธฐ๋ฅ์์์ ์ํฉ File file = new File("data.txt"); long sum = MathUtils.sum(dataFile); ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ํ์ผ์ด ์๊ฑฐ๋ ์๋ชป ์์ฑ๋ ์ํฉ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด ๋, ์๋ชป๋จ์ ์ธ์งํ๊ณ Exception ์ฒ๋ฆฌ๋ฅผ ํ๊ฑฐ๋ ๋ฌธ์ ์ํฉ์ return ์ ํด์ฃผ์ด์ผ ํ๋ค. ์ด์ฒ๋ผ ์์ธ ์ํฉ์ ์ฐพ์๋ด๊ณ ์ฝ๋์ ๋ฐ์ํ์ฌ ๋น์ ์์ ๋ง์๋ด์ผ ํ๋ค. ๊ฐ๋ฅํ ์์ธ์ํฉ์ ๋ค ์ฐพ์๋ด๊ธฐ ์ํด ๋
ธ๋ ฅํด์ผํ๊ณ ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ๊ฐ๋ฐํ ์ํํธ์จ์ด์ ํ์ง์ ๋์ผ ์ ์๋ค. ๐ ํ
์คํธ ์ฝ๋์ ๊ตฌ์ฑ ์์: ์ํฉ, ์คํ, ๊ฒฐ๊ณผ ํ์ธ ํ
์คํธ ์ฝ๋: ๊ธฐ๋ฅ์ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ๋ฐ๋ผ์, ์ํฉ(given), ์คํ(when), ๊ฒฐ๊ณผ(then)์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค. [์ํฉ์ด ์ฃผ์ด์ง๊ณ , ์..
๐ฐ JUnit 5 ๋ชจ๋ ๊ตฌ์ฑ JUint ํ๋ซํผ ํ
์คํ
ํ๋ ์ ์ํฌ๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํ ๋ฐ์ฒ์ ํ
์คํธ ์์ง์ ์ํ API wprhd JUnit Jupiter JUnit 5๋ฅผ ์ํ ํ
์คํธ API์ ์คํ ์์ง ๊ตฌ์ฑ JUnit Vintage JUnit 3, 4๋ก ์์ฑ๋ ํ
์คํธ๋ฅผ 5 ํ๋ซํผ์์ ์คํํ๊ธฐ ์ํ ๋ชจ๋ ์ ๊ณต Jupiter๋ก ํ
์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ค๋ฉด build.gradle ํ์ผ ๋ด dependencies์ ์์กด์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค. ๋ค์์ TDD ์คํฐ๋ ํ๋ก์ ํธ์ build.gradle file์ด๋ค. Jupiter ๊ด๋ จ ์์กด์ฑ์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. plugins { id 'java' id 'org.springframework.boot' version '2.7.7' id 'io.spring.de..
โญ ๊ธฐ๋ฅ ๋ช
์ธ ํ์ํฌ์ธํธ: ์คํ ๋ฆฌ ๋ณด๋ ํํ ์ด๋ฉ์ผ: ๊ฐ๋จํ ํํ ์ง๋ผ: ๊ฐ์ ์ด์๋ฅผ ํตํด ์ถ๊ฐํ ๊ธฐ๋ฅ์ ๋ช
์ธ ํ์ ์๋ฆฌ: ๊ตฌ๋๋ก ์ ๋ฌ ์ฌ์ฉ์์๊ฒ ๊ธฐ๋ฅ์ ์ ๋ฌํ๊ธฐ ์ํด์๋ ๊ธฐ๋ฅ์ ์
๋ ฅ๊ณผ ๊ฒฐ๊ณผ์ ํํ์ฌ์ผ ํ๋ค. ์
๋ ฅ: ๋ณดํต ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ๊ฒฐ๊ณผ: ์ฌ๋ฌ ํ์์ผ๋ก ์ ์ ๋ฆฌํด ๊ฐ ๋ฑ,, ๋ณ๊ฒฝ (ํ์ ๊ฐ์
์์๋ DB์ ๊ฐ์ ์ถ๊ฐํ๋ฉด์ ์์คํ
์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ๋ฆฌํดํ๋ ๊ฒ๊ณผ ๋ค๋ฆ) 1. ์คํ ๋ฆฌ ๋ณด๋๋ฅผ ํฌํจํ ๋ค์ํ ํํ์ ์๊ตฌ์ฌํญ ๋ฌธ์๋ฅผ ์ด์ฉํด์ ๊ธฐ๋ฅ ๋ช
์ธ ๊ตฌ์ฒดํ 2. ๊ธฐ๋ฅ ๋ช
์ธ๋ฅผ ๊ตฌ์ฒดํํ๋ ๋์ ์
๋ ฅ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋์ถ 3. ๋์ถํ ๊ธฐ๋ฅ ๋ช
์ธ๋ฅผ ์ฝ๋์ ๋ฐ์ (๊ธฐ๋ฅ์ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ, ๋ฆฌํด ํ์
๋ฑ์ด ๊ฒฐ์ ) โญ ์ค๊ณ ๊ณผ์ ์ ์ง์ํ๋ TDD [๊ณผ์ ] 1. ํ
์คํธ ์ฝ๋ ์์ฑ 2. ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ ๋ฆฌํฉํ ๋ง ํ๋ ๊ณผ์ ..
๐ ํ
์คํธ ์ฝ๋ ์์ฑ ์์ 1. ์ฌ์ด ๊ฒฝ์ฐ์์ ์ด๋ ค์ด ๊ฒฝ์ฐ๋ก ์งํ 2. ์์ธ์ ์ธ ๊ฒฝ์ฐ์์ ์ ์์ ์ผ๋ก ์งํ ๊ทธ๋ ๋ค๋ฉด ์ด๋ ค์ด ๊ฒฝ์ฐ๋ก ์์ฑํ๋ฉด ์๋๋ ์ด์ ๋ ๋ญ๊น? ๐ฑ ์ด๋ฐ์ ๋ณต์กํ ํ
์คํธ๋ถํฐ ์์ํ๋ฉด ์๋๋ ์ด์ ์ด๋ฐ์ ๋ณต์กํ๊ฒ ์์ํ๋ฉด ํ ๋ฒ์ ๊ตฌํํด์ผ ํ๋ ์ฝ๋๊ฐ ๋ง์์ง๋ค. if ๋ฌธ์ด ๋์ด๋ ์๋ ์๊ณ ํ๋ฒ์ ๋ง์ ์ฝ๋๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด ๋๋ ๋ชจ๋ฅด๊ฒ ๋ฒ๊ทธ๋ฅผ ๋ง๋ค๊ณ ๋์ค์ ๋ฒ๊ทธ๋ฅผ ์ก๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ํ๋นํ๊ฒ ๋๋ค. ๐ฑ ๊ตฌํํ๊ธฐ ์ฌ์ด ํ
์คํธ๋ถํฐ ์์ํ๊ธฐ ๋ณดํต ์๋ถ ๋ด์ ๊ตฌํ์ ์๋ฃํ๊ณ ํต๊ณผํ ์ ์๋ ํ
์คํธ ๊ตฌํ์ ์ ํํด์ผ ํ๋ค. Chapter 2์์ ํ๋ ์ํธ ๊ฐ๋ ์ธก์ ์์์๋ ๋ค์ ์ค ํ๋๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค. 1. ๋ชจ๋ ์กฐ๊ฑด์์ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ 2. ๋ชจ๋ ์กฐ๊ฑด์์ ์ถฉ์กฑํ์ง ์๋ ๊ฒฝ์ฐ 1๋ฒ์ ๊ฒฝ์ฐ ๋ชจ๋ ์กฐ๊ฑด์ ..
์์๋ GDSC MJU์์ TDD ์คํฐ๋๋ฅผ ์์ํ์ฌ, ๋ค์ ์ฑ
์ ์ ๋ฆฌํ๋ ๋ธ๋ก๊ทธ ํฌ์คํ
์ ์งํํ๊ณ ์ ํ๋ค. ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ - YES24 TDD(Test-Driven Development)๋ ํ
์คํธ๋ถํฐ ์์ํ๋ค. ๊ตฌํ์ ๋จผ์ ํ๊ณ ๋์ค์ ํ
์คํธํ๋ ๊ฒ์ด ์๋๋ผ ๋จผ์ ํ
์คํธ๋ฅผ ํ๊ณ ๊ทธ๋ค์์ ๊ตฌํํ๋ค. ๊ตฌํ ์ฝ๋๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ ํ
์คํธํ ์ ์์๊น? ์ฌ๊ธฐ www.yes24.com ๐ TDD Chapter 1: TDD ๊ฐ๋ฐ ์ค๋น ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ build.gradle ์ค์ ๋ง ์์ฑํ๊ณ ๋์ด๊ฐ๋ค. dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework..