๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŒฑ Backend/Spring16

[JUnit5] @ParameterizedTest, @MethodSource ๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” "๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ"์ด๋ผ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด @Nested@DisplayName("๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ")class createPostTest { @Test void createPost_์„ฑ๊ณต() { ... } @Test void createPost_์กด์žฌํ•˜์ง€์•Š๋Š”์‚ฌ์šฉ์ž() { ... } @Test void createPost_์กด์žฌํ•˜์ง€์•Š๋Š”๋ฌธ์ œ๋ฒˆํ˜ธ() { ... } @Test void createPost_์กด์žฌํ•˜์ง€์•Š๋Š”์นดํ…Œ๊ณ ๋ฆฌ() { ... }}์ด๋Ÿฐ ์‹์œผ๋กœ ๋ชจ๋“  ์˜ˆ์™ธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์”ฉ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๊ฒ€์ฆํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ฒ˜๋Ÿผ ์ง„ํ–‰ํ•˜๋ฉด ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„๋„ ๋งŽ์•„์ง€๊ณ .. 2025. 6. 19.
[JUnit5 / TestCode] @Nested๋กœ ๊ฐ€๋…์„ฑ ์ข‹์€ ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์—๋„ ์ž‘์„ฑํ•ด์•ผ ํ•  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค.์„ฑ๊ณต(), ์‹คํŒจ_๋ฌด์Šจ์˜ˆ์™ธ() ์ด๋Ÿฐ ์‹์œผ๋กœ..์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ@ExtendWith(MockitoExtension.class)class LikeServiceTest {... @Test @DisplayName("์ข‹์•„์š” ๋“ฑ๋ก์— ์„ฑ๊ณตํ•˜๋ฉด LikeResponseDto ๋ฐ˜ํ™˜") void createLike_์„ฑ๊ณต() { ... } @Test @DisplayName("์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅธ ๊ฒŒ์‹œ๊ธ€์— ๋‹ค์‹œ ๋ˆ„๋ฅด๋ฉด AlreadyLikedException ๋ฐœ์ƒ") void createLike_์ด๋ฏธ์ข‹์•„์š”๋ˆ„๋ฆ„_์˜ˆ์™ธ() { ... } @Test @DisplayName("์ข‹์•„์š” ๋“ฑ๋ก ์ค‘ ๋‚™.. 2025. 6. 11.
[Spring] SSE(Server Sent Events) ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€, ๋˜๋Š” ์ข‹์•„์š”๊ฐ€ ๋ˆŒ๋ฆฌ๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋žŒ์„ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ SSE๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.SSE (Server Sent Events): HTTP ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๋‹จ๋ฐฉํ–ฅ ์ง€์† ์—ฐ๊ฒฐ์„ ํ™œ์šฉํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ด๋ฒคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ตฌํ˜„Client๊ฐ€ ์„œ๋ฒ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋งคํ•‘๋˜๋Š” SSE ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.์„œ๋ฒ„์—์„œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„œ์•Ÿ๊ณ , ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ํ‘ธ์‹œํ•œ๋‹ค.[ํŠน์ง•]์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” UTF-8๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•จ.๋ฐ˜ํ™˜๋˜๋Š” ์ปจํ…์ธ  ์œ ํ˜•์€ text/event-streamSSE์˜ ์žฅ์ ์‹ค์‹œ๊ฐ„.. 2025. 6. 10.
[JUnit, Mockito] TestCode ์ž‘์„ฑํ•˜๊ธฐ JUnit: ์ž๋ฐ” ์–ธ์–ด๋ฅผ ์œ„ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„ํ•ดํ•˜์—ฌ ๊ฐ ๋‹จ์œ„๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ -> ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ž„AssertJ: ์ž๋ฐ” ํ…Œ์ŠคํŠธ๋ฅด ๋•๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌMockito: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” Java ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›ŒํฌJUnit ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜@TestTest ๋ฉ”์„œ๋“œ๋กœ ์ธ์‹ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์ฃผ์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•จ@BeforeAll@BeforeAll @Test ๋ฉ”์†Œ๋“œ ๋ณด๋‹ค ๋จผ์ € ํ•œ๋ฒˆ๋งŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ@BeforeEach@BeforeEach ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ @Test ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ์ „์— ๋ฐ˜๋“œ์‹œ ์‹คํ–‰@Test ๋ฉ”์†Œ๋“œ ์‹คํ–‰์ „ ๊ณตํ†ต์œผ๋กœ.. 2025. 6. 8.
@RequiredArgsContructor, @AllArgsContructor, @NoArgsContructor ๊ด€์„ฑ์ ์œผ๋กœ ์“ฐ๋˜ ์–ด๋…ธํ…Œ์ด์…˜ ์ค‘์—์„œ @RequiredArgsContructor, @AllArgsContructor, @NoArgsContructor ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ฐœ๋…์„ ํŒŒ์•…ํ•˜๊ณ ์ž ๊ธ€์„ ์จ๋ณธ๋‹ค..@RequiredArgsContructorfinal ํ•„๋“œ๋‚˜ @NonNull์ด ๋ถ™์€ ํ•„๋“œ๋งŒ ํฌํ•จํ•˜๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.๊ผญ ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ ์ฃผ์ž…๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.์ฃผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž… (DI) ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.@AllArgsContructor๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ์ „์ฒด ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.DTO, ํ…Œ์ŠคํŠธ์šฉ ๊ฐ์ฒด ๋“ฑ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.import lombok.RequiredArgsConstructor;import lombok.AllArgsConstructor;import lombok.ToString;@Req.. 2025. 6. 6.
@Transactional ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ ํŠธ๋žœ์žญ์…˜?: DBMS ๋˜๋Š” ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์—์„œ ์ƒํ˜ธ์ž‘์šฉ์˜ ๋‹จ์œ„ (ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„)ํŠน์ง•AtomicConsistentIsolationDurability์—ฐ์‚ฐ๋กค๋ฐฑ์ปค๋ฐ‹⇒ ๊ทธ๋Ÿผ Spring์—์„œ๋Š” ์ด ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฐ€?@Transactional์Šคํ”„๋ง์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.@Transactional ๊ณผ ๊ฐ™์ด ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์ง€์›ํ•œ๋‹ค.Spring์—์„œ ๋ฐ์ดํ„ฐ ์ž‘์—…์˜ ์‹คํ–‰๋‹จ์œ„๋ฅผ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.ํด๋ž˜์Šค / ๋ฉ”์„œ๋“œ ์œ„์— @Transactional ์„ ๋ถ™์ด๋ฉด AOP(๊ด€์ ์ง€ํ–ฅํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ฅผ ํ†ตํ•ด ํƒ€๊ฒŸ์ด ์ƒ์†ํ•˜๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ํƒ€๊ฒŸ์„ ์ƒ์†ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋•Œ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํƒ€๊ฒŸ ๋ฉ”์†Œ๋“œ ์ „ ํ›„๋กœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰.. 2025. 5. 21.