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

BackEnd๐ŸŒฑ/Spring47

Gradle๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑํ•˜๊ธฐ ์„œ๋ก  ํ˜„์žฌ ์ œ๊ฐ€ ์žˆ๋Š” ๋ถ€์„œ์—์„œ๋Š” ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ์„ ๊ณต์œ ํ•˜๊ณ  ๊นƒ์„ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋“ค์€ ๋ฉ€ํ‹ฐ ํ”„๋กœ์ ํŠธ์— Nexus Maven ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•ด์„œ ๋„๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ ์„ธํŒ…์ด ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๊ธฐ์— ๋”ฐ๋กœ ์„ค์ •์— ๊ด€ํ•ด์„œ๋Š” ๊ฑด๋“œ๋ฆด ๋ถ€๋ถ„์ด ์—†๊ธฐ๋„ ํ•˜๊ณ , ์ง์ ‘ ๊ตฌ์„ฑํ•ด ๋ณธ ์ ๋„ ์—†์–ด์„œ ์ด๋ฒˆ๊ธฐํšŒ์— ์ •๋ฆฌ์™€ ํ•จ๊ป˜ ์ง์ ‘ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ํ•ด๋ณด๊ณ ์ž ํฌ์ŠคํŒ…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์˜ ์ •์˜์™€ Gradle์„ ์ด์šฉํ•œ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชฉ์ฐจ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์ด๋ž€? Gradle๋กœ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ตฌ์„ฑํ•˜๊ธฐ ํ…Œ์ŠคํŠธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ Apple Silicon (M1), IntelliJ Java 11, Spr.. 2023. 3. 4.
ํŠธ๋žœ์žญ์…˜(Transaction)์˜ ์˜ˆ์™ธ(Exception)์— ๋”ฐ๋ฅธ ๋กค๋ฐฑ ์ฒ˜๋ฆฌ ์„œ๋ก ์ด์ „์— Java์˜ Checked Exception๊ณผ UnChecked Exception์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์š”์•ฝํ•˜๋ฉด RuntimeException์„ ์ƒ์†ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” Checked Exception, ์ƒ์†ํ•œ ํด๋ž˜์Šค๋Š” Unchecked Exception์ด๋ฉฐ, Checked Exception์€ try-catch์„ ํ†ตํ•ด ์˜ˆ์™ธ๋ฅผ ๊ผญ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด์•ผ ์ปดํŒŒ์ผ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ๊ฐ์˜ ์˜ˆ์™ธ๋“ค์— ๋Œ€ํ•˜์—ฌ Transaction์—์„œ ๋กค๋ฐฑ์ด ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜๋Š”์ง€ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณตํ†ต ์ฝ”๋“œ@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)public class User {    @Id    @GeneratedVa.. 2023. 2. 5.
DB ์ปค๋„ฅ์…˜ ํ’€(Connection Pool)๊ณผ Hikari CP ์„œ๋ก  HikariCP๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด, ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด Connection Pool ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” Connection Pool๊ณผ Hikari CP์— ๋Œ€ํ•ด ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชฉ์ฐจ ์ „ํ†ต์ ์ธ WAS์™€ DB ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• Connection Pool์ด๋ž€? Connection Pool์„ ๋ฌด์ž‘์ • ํฌ๊ฒŒ ๋งŒ๋“ค๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์•„์งˆ๊นŒ? ์ด์ƒ์ ์ธ Connection Pool์˜ ํฌ๊ธฐ๋Š” ์–ผ๋งˆ์ผ๊นŒ? Hikari CP๋ž€? ์ „ํ†ต์ ์ธ WAS์™€ DB ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• ์ผ๋ฐ˜์ ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ CRUD์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์‚ฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ„ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด DB์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งค๋ฒˆ ๋“œ๋ผ์ด๋ฒ„(Driver)๋ฅผ ๋กœ๋“œํ•˜๊ณ  connection ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์˜ค.. 2023. 1. 18.
Spring JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Batch Insert ์ˆ˜ํ–‰ํ•˜๊ธฐ ์„œ๋ก  ํ‰์†Œ์— JPA๋ฅผ ํ™œ์šฉํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด repository.save() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹จ๊ฑด ๋‹จ์œ„๋กœ ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋ฐฑ, ์ˆ˜์ฒœ ๊ฐœ ์ด์ƒ์˜ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„ ๋ ๊นŒ์š”? ์ด๋Š” ์„ฑ๋Šฅ๊ณผ ํด๋ผ์ด์–ธํŠธ์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring ํ™˜๊ฒฝ์—์„œ ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ Batch Insert์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” Apple Silicon (M1), Java 11, Spring Boot, JPA, JUnit5, Docker MySQL ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•˜์˜€์œผ๋ฉฐ, ์†Œ์Šค์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Batch Insert๋ž€? Ident.. 2023. 1. 9.
Actuator Refresh ๋ฐ˜์˜ ์•ˆ๋˜๋Š” ํ˜„์ƒ ํ•ด๊ฒฐ ๋ฌธ์ œ ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ Spring Cloud Config Server: Spring Boot 2.7.4 ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค ์„œ๋ฒ„๋“ค: Spring Boot 2.7.4 Spring Discovery Server: Spring Boot 2.7.4 Spring GateWay Server: Spring Boot 2.7.4 ํ˜„์žฌ ์ƒํ™ฉ์€ ์œ„์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ Spring Cloud Conifg ์„œ๋ฒ„๋ฅผ ๋„์šด ํ›„ ๊ฐ๊ฐ์˜ Spring Boot Application์—์„œ ํ•ด๋‹น Config ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์„ค์ • ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Config Server์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ๊ฐ๊ฐ์˜ Spring Boot Application์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์žฌ๊ธฐ๋™ Actuator Refresh Spring .. 2022. 11. 12.
Actuator dependency and Swagger Stater 3.0.0 ์ถฉ๋Œ ์—๋Ÿฌ ์ƒํ™ฉ ํ˜„์žฌ Spring Boot 2.7.4 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , Swagger 3.0.0 ๋ฒ„์ „์„ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ๋„์ค‘ Actuator dependency๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋”๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”๋ณด๊ธฐ Error org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.j.. 2022. 11. 11.
JUnit5 ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ๋ชฉ์ฐจ JUnit5๋ž€? JUnit5 ๊ตฌ์„ฑ JUnit5 ์‹œ์ž‘ํ•˜๊ธฐ JUnit5์˜ ์–ด๋…ธํ…Œ์ด์…˜๋“ค JUnit5 ํ…Œ์ŠคํŠธ ์ด๋ฆ„ ํ‘œ์‹œํ•˜๊ธฐ JUnit5 Assertion ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•˜๊ธฐ ํƒœ๊น…๊ณผ ํ•„ํ„ฐ๋ง ํ…Œ์ŠคํŠธ ๋ฐ˜๋ณตํ•˜๊ธฐ ํ…Œ์ŠคํŠธ ์ธ์Šคํ„ด์Šค ํ…Œ์ŠคํŠธ ์ˆœ์„œ 1. JUnit5๋ž€? Junit๋ž€ ํ…Œ์ŠคํŒ… ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์จ ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ(Test Driven Development, TDD)์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ์ดํ›„ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์‹ค์ œ ๊ฐœ๋ฐœ ์ฝ”๋“œ์— ์ ์šฉ 2. JUnit5 ๊ตฌ์„ฑ JUnit5๋Š” Java8๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ Platform, Jupiter, Vintage ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ๋กœ ์ด๋ฃจ.. 2022. 10. 2.
[Spring] StringUtils ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ ์ •๋ฆฌ org.springframework.util ํŒจํ‚ค์ง€์˜ StringUtils ํด๋ž˜์Šค์—๋Š” ์†์‰ฝ๊ฒŒ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” StringUtils์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ์ž์—ด์„ ํ˜•์‹์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. StringUtils์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. StringUtils (Spring Framework 5.3.22 API)Check whether the given CharSequence contains actual text. More specifically, this method returns true if the CharSequence is not null, its length is greater.. 2022. 8. 31.
AssertJ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์•Œ์•„๋ณด๊ธฐ AssertJ๋ž€? โญ๏ธ ํ…Œ์ŠคํŠธ์— ๊ด€๋ จ๋œ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ๊ฐ€๋…์„ฑ ๋†’์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ง€์›ํ•˜๋Š” ์˜คํ”ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. โญ๏ธ assertThat(๊ฒ€์ฆ๋Œ€์ƒ)๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ์ด์šฉํ•˜์—ฌ ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์‡„์ ์œผ๋กœ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต ํ™˜๊ฒฝ plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { c.. 2022. 8. 8.