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

SpringBoot32

[SpringBoot] ์Šคํ”„๋ง ๋ฉ”์ผ ์ „์†ก ๋ฐฉ๋ฒ• ( + google Gmail SMTP ์„ค์ •) ์Šคํ”„๋ง ๋ถ€ํŠธ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์ผ ์ „์†ก ๊ธฐ๋Šฅ ๊ตฌํ˜„1. ๊ตฌ๊ธ€ Gmail SMTP ์‚ฌ์šฉ ์œ„ํ•œ ์„ค์ • ๊ตฌ๊ธ€ ์‚ฌ์ดํŠธ > ํ”„๋กœํ•„ ํด๋ฆญ > Google ๊ณ„์ • ๊ด€๋ฆฌ ๊ฒ€์ƒ‰์ฐฝ์— > "์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ" ๊ฒ€์ƒ‰ ์•ฑ ์ด๋ฆ„ ์„ค์ • > ๋งŒ๋“ค๊ธฐ 16์ž๋ฆฌ์˜ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ƒ์„ฑ๋จ 2. build.gradledependencies { // ๋ฉ”์ผ ์ „์†ก ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ implementation 'org.springframework.boot:spring-boot-starter-mail' } 3. application-mail.propertiesโ€ป ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์œ ์ถœ๋˜๋ฉด ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ๊ผญ .gitignore์— application-mail.properties ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ.(๋ณธ์ธ์€ ๋ณด์•ˆ ๊ด€๋ จ ์„ค์ • ํŒŒ์ผ application-oauth... 2026. 3. 16.
[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ JUnit ์ด๋ž€? ์ž๋ฐ” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธ.@BeforeAll - ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „์— ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰, static public/default๋กœ ์ •์˜@AfterAll - ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ํ›„ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰, static public/default๋กœ ์ •์˜@BeforeEach - ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์‹œ์ž‘ ์ „์— ์‹คํ–‰, public๋กœ ์ •์˜@AfterEach - ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ํ›„์— ์‹คํ–‰, public๋กœ ์ •์˜@BeforeAll -> @BeforeEach -> @Test -> @AfterEach ->@AfterAll AssertJ๋Š” JUnit๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ๊ฒ€์ฆ๋ฌธ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.์˜ˆ์‹œ: assertThat(a+b).isEqualTo(sum); ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜:isE.. 2026. 2. 20.
[SpringBoot] ๋กœ๊ทธ(Log) @Slf4j ๋กœ๊ทธ (Log) ๋กœ๊ทธ(Log)๋ž€ ์‹œ์Šคํ…œ์ด ๋™์ž‘ํ•  ๋•Œ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ๋ฐ ๋™์ž‘ ์ •๋ณด๋ฅผ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ ๋กœ๊ทธ ๋ ˆ๋ฒจ (Log Level)๋กœ๊ทธ๋Š” ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ์ถœ๋ ฅ๋ ์ง€ ๋„˜์–ด๊ฐˆ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ฅธ ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.Trace > Debug > Info > Warn > Error > Fatal๋กœ๊ทธ ๋ ˆ๋ฒจ์„ค๋ช…์˜ˆ์‹œTRACE๊ฐ€์žฅ ์ƒ์„ธํ•œ ์ •๋ณด(๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋‹จ์œ„)๋ฉ”์„œ๋“œ ์ง„์ž…/๋ฐ˜ํ™˜ ์‹œ์  ๋“ฑDEBUG๋””๋ฒ„๊น…์šฉ ์ƒ์„ธ ์ •๋ณด๋ณ€์ˆ˜ ๊ฐ’, ๋กœ์ง ํ๋ฆ„ ์ถ”์ INFO์ผ๋ฐ˜์ ์ธ ์ •๋ณด์„œ๋น„์Šค ์‹œ์ž‘, ์š”์ฒญ ์ฒ˜๋ฆฌ ์™„๋ฃŒWARN๊ฒฝ๊ณ  ์ƒํ™ฉ(์—๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ฃผ์˜ ํ•„์š”)์„ฑ๋Šฅ ์ €ํ•˜, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž…๋ ฅERROR์˜ค๋ฅ˜ ๋ฐœ์ƒ์˜ˆ์™ธ, ์‹œ์Šคํ…œ ์žฅ์•  ๐Ÿ’ก API๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ DEBUG๋กœ ์„ค์ •, ๋ฐฐํฌ์‹œ์—๋Š” INFO๋‚˜ Warn ๋ ˆ๋ฒจ๋กœ.. 2025. 11. 9.
[SpringBoot] ์Šคํ”„๋ง ์Šค์ผ€์ค„๋Ÿฌ ์Šคํ”„๋ง ์Šค์ผ€์ค„๋Ÿฌ๋ž€?์Šคํ”„๋ง ์Šค์ผ€์ค„๋Ÿฌ(Scheduler)๋Š” ํŠน์ • ์ž‘์—…์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋˜๋Š” ์˜ˆ์•ฝ๋œ ์‹œ๊ฐ„์— ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.์˜ˆ: ๋งค์ผ ์ž์ •์— DB ๋ฐฑ์—…, 1์‹œ๊ฐ„๋งˆ๋‹ค ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ, 1๋ถ„๋งˆ๋‹ค ์ƒํƒœ ๊ฐฑ์‹  ๋“ฑ@Scheduled ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @EnableScheduling์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.์ฆ‰, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž๋™์œผ๋กœ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ โœ… ์Šคํ”„๋ง์Šค์ผ€์ค„๋Ÿฌ ์‚ฌ์šฉ๋ฒ•1. ๋ฉ”์ธ Application์— @EnableScheduling ์–ด๋…ธํ…Œ์ด์…˜ ๋ถ™์ด๊ธฐ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์Šค์ผ€์ค„๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์•ˆ ๋ถ™์ด๋ฉด @Scheduled๊ฐ€ ๋ถ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ๋ณดํ†ต ๋ฉ”์ธ ํด๋ž˜์Šค๋‚˜ ์„ค์ • ํด๋ž˜์Šค์— ๋ถ™์ธ๋‹ค.@SpringBootApplication@EnableScheduling //.. 2025. 11. 8.
[SpringBoot] AOP(Aspect Oriented programing, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) AOP(Aspect Oriented programing, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) ์ด๋ž€?๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concern) ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ , ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ๋กœ๊ทธ ์ถœ๋ ฅํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์„ฑ๋Šฅ ์ธก์ • (๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ๊ฐ„)์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ถŒํ•œ ๊ฒ€์‚ฌ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๊ฐ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ž‘์„ฑํ•˜๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—,AOP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ณตํ†ต ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘๊ณ  ์ž๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. AOP ํ•ต์‹ฌ ๊ฐœ๋…๊ฐœ๋…์„ค๋ช…Aspect (๊ด€์ )๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•œ ๊ฒƒ (์˜ˆ: ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜ ๋“ฑ)Join Point (์กฐ์ธ ํฌ์ธํŠธ)AOP๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง€์  (๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋“ฑ)Advice (์–ด๋“œ๋ฐ”์ด์Šค)์‹ค์ œ๋กœ ์‹คํ–‰๋  ๊ณตํ†ต ๋กœ์ง (Aspect ์•ˆ์˜ ๋ฉ”์„œ๋“œ)Pointcut (ํฌ์ธํŠธ์ปท)์–ด๋–ค Joi.. 2025. 11. 8.
[SpringBoot] HTML form ์ „์†ก vs JavaScript๋กœ JSON ์ „์†ก ๐Ÿงฉ 1. HTML ์ „์†ก ๋ฐฉ์‹๐Ÿ”น ๊ฐœ์š”๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํผ ์ „์†ก ๊ธฐ๋Šฅ ์‚ฌ์šฉ ํƒœ๊ทธ์˜ action๊ณผ method ์†์„ฑ์„ ์ด์šฉํ•ด ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก์ „์†ก ํ˜•์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ application/x-www-form-urlencoded ๋˜๋Š” multipart/form-data (ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ)๐Ÿ”น ์˜ˆ์‹œ ์ฝ”๋“œ ์•„์ด๋””: ๋น„๋ฐ€๋ฒˆํ˜ธ: ํšŒ์›๊ฐ€์ž… ๐Ÿ”น ์„œ๋ฒ„ (Spring Boot Controller)@ReauireArgsConstructor@Controllerpublic class UserController { private final UserService userservice; @PostMapping("/user") public String signup(AddUserReq.. 2025. 11. 2.
[SpringBoot] STS ํ”„๋กœ์ ํŠธ Context root ๋ณ€๊ฒฝํ•˜๊ธฐ(/controller -> /) STS ํ†ฐ์บฃ์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ€๋” Context Path๊ฐ€ /controller๋กœ ์ž๋™์„ค์ • ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.๊ทธ๋ž˜์„œ /controller๊ฐ€ ์•„๋‹Œ /๋กœ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. 1. ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ-> properties 2. Validation -> Web Project Settings -> Context root ๋ณ€๊ฒฝํ•˜๊ธฐ๋“ค์–ด๊ฐ€๋ณด๋ฉด Context root๊ฐ€ /controller๋กœ ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ / ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ/๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœํ–ˆ๋˜ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค. 3. ํ†ฐ์บฃ ์šฐํด๋ฆญ-> Clean๊ณผ Project->Clean.. (์ด ๋ถ€๋ถ„์€ ์ƒ๋žต ๊ฐ€๋Šฅ)ํ˜น์‹œ๋‚˜ ์ ์šฉ์ด ์•ˆ ๋˜์—ˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Project Clean๊ณผ ํ†ฐ์บฃ clean์„ ํ•˜๊ณ  ํ†ฐ์บฃ์„ ์‹คํ–‰ํ•œ๋‹ค. 2025. 1. 18.
[SpringBoot] STS ํ”„๋กœ์ ํŠธ ๋นจ๊ฐ„์—‘์Šค ๋œฐ ๋•Œ(pom.xml ์ฒซ์งธ์ค„ ์—๋Ÿฌ) STS๋กœ Spring ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ‘์ž๊ธฐ ํ”„๋กœ์ ํŠธ์— ๋นจ๊ฐ„ ์—‘์Šค๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ํ•ด๋ณด๋ฉด ํ•ด๊ฒฐ ๋œ๋‹ค.1) Clean projectProject > Clean... ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํŒŒ์ผ์„ ์ง€์šฐ๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๊ณ , ์ดํด๋ฆฝ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์บ์‹œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.์ด๊ฒƒ๋งŒ ํ•ด์„œ๋Š” ํ”„๋กœ์ ํŠธ ๋นจ๊ฐ„ ์—‘์Šค๋ฅผ ์ง€์šธ ์ˆœ ์—†๋‹ค. ์•„๋ž˜ ๊ณผ์ •์„ ๋” ํ•ด์•ผ ํ•œ๋‹ค. 2) STS ๋„๊ณ  ์‚ฌ์šฉ์ž/.m2 ์•ˆ์— ์žˆ๋Š” repository ํŒŒ์ผ ์‚ญ์ œ์ € .m2 ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ€ repository ํด๋”๋ฅผ ์‚ญ์ œํ•œ๋‹ค.์ด๊ฒƒ์€ pom.xml์˜ dependensy ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋˜ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—๋‹ค์šด๋ฐ›์•˜๋˜ ๋‚ด์šฉ๋“ค์„ ๋‹ค์‹œ ์‚ญ์ œํ•˜๊ณ  ์•„๋ž˜ 3๋ฒˆ์งธ ๊ณผ์ •์œผ๋กœ ๋‹ค์‹œ ๋‹ค์šด๋ฐ›๋Š”๋‹ค. 3) pom.xml ํŒŒ์ผ์— plugin.. 2025. 1. 18.
[SpringBoot] AJAX ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๋™๊ธฐ(Synchronous), ๋น„๋™๊ธฐ(Asynchronous) ์ฐจ์ด AJAX๋ž€?AJAX(Asynchronous JavaScript and XML)๋Š” ์›น ํŽ˜์ด์ง€์—์„œ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๊ฐœ์„ ๋˜๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋”์šฑ ๋™์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."Asynchronous": ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ, ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."JavaScript": ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์ฃผ๋กœ XMLHttpRequest ๊ฐ์ฒด๋‚˜ Fetch API๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค."XML": ์ดˆ๊ธฐ์—๋Š” XML ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•˜์ง€๋งŒ, ํ˜„์žฌ๋Š” JSON์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.AJAX์˜ ์ฃผ์š” ํŠน์ง•๋น„๋™๊ธฐ ํ†ต์‹ : ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Œ.์‚ฌ์šฉ์ž ๊ฒฝํ—˜.. 2025. 1. 14.