๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Spring Boot21

[Spring Boot] ํƒ€์ž„๋ฆฌํ”„ ํ‘œํ˜„์‹, ๋ฌธ๋ฒ• ์ •๋ฆฌ ํƒ€์ž„๋ฆฌํ”„ ํ‘œํ˜„์‹ ํƒ€์ž„๋ฆฌํ”„ ๋ฌธ๋ฒ• 2025. 5. 3.
[Spring Boot] ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋ž€?์˜์กด์„ฑ ์ถ”๊ฐ€ ํƒ€์ž„๋ฆฌํ”„๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ž„โ€‹๊ทธ๋Ÿผ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋ž€?์Šคํ”„๋ง ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋Š” ์›นํŽ˜์ด์ง€(HTML)์—๋ฐ์ดํ„ฐ ๋„ฃ์–ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ํ…œํ”Œ๋ฆฟ ์—”์ง„ ๊ฐ„๋‹จ ๋ฌธ๋ฒ•์ฝ”๋“œ ๋ณด๋ฉด ์•ฝ๊ฐ„ HTML์ด๋ž‘ ์„ž์ธ ๋А๋‚Œ ํƒœ๊ทธ, ํƒœ๊ทธ ๋ณด๋ฉด HTML์ด๋ž‘ ๋น„์Šทโ€‹๊ฑฐ๊ธฐ์— text attribute๊ฐ€ ํ• ๋‹น๋จ.โ€‹โ€‹โ€‹์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์—์„œ { ์ด๋ฆ„ : "ํ™๊ธธ๋™", ๋‚˜์ด : 11}์ด๋ ‡๊ฒŒ ๋„˜๊ฒจ์ฃผ๋ฉด,์ด๋ฆ„, ๋‚˜์ด ๋ผ๋Š” ํ‚ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ๋„˜๊ฒจ์ฃผ๊ณ ,ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ ์ด๊ฑฐ ๋ฐ›์•„์„œ HTML์— ๊ฐ’ ์ ์šฉํ•จ.โ€‹โ€‹โ€‹(์„œ๋ฒ„์—์„œ json์œผ๋กœ ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์คŒ)๐Ÿ”ฝ(ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ๋ฐ›์Œ)๐Ÿ”ฝ(HTML๋กœ ๋ณ€ํ™˜)๐Ÿ”ฝ(๋ธŒ๋ผ์šฐ์ €์— ๋™์ ์œผ๋กœ ํ‘œ์‹œ) ๋Œ€ํ‘œ์ ์ธ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ JSP, ํƒ€์ž„๋ฆฌํ”„, ํ”„๋ฆฌ๋งˆ์ปค ๋“ฑ์ด ์žˆ์Œโ€‹์Šคํ”„๋ง์€ ํƒ€์ž„๋ฆฌํ”„๋ฅผ ๊ถŒ์žฅ. build.gradl.. 2025. 5. 3.
[Spring Boot] @PathVariable vs. @RequestParam ๋ญ˜ ์จ์•ผํ• ๊นŒ? (feat.@QueryParam) ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ›์•„์„œ ํŠน์ • ์ž์›์„ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ(ex. id๊ฐ€ 10์ธ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด๊ณ ์‹ถ์„ ๋•Œ)์“ฐ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€ํ‘œ์ ์œผ๋กœ@PathVariable์„ ๋งŽ์ด ์”€.โ€‹๊ทผ๋ฐ @ReqeustParam๋„ ์–ด๋””์„œ ๋ดค๋Š”๋ฐ,๋‘˜ ์ค‘ ๋ญ˜์จ์•ผํ• ๊นŒ!!โ€‹์–ด๋–จ ๋•Œ ๋ฌด์—‡์„ ์จ์•ผํ• ๊นŒ..์ •๋ฆฌํ•ด๋ณด๊ฒ ์Œโ€‹@PathVariable๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์ธ๋ฐ, @GetMapping("/api/articles/{id}") public ResponseEntity findArticle(@PathVariable("id") Long id) { Article article = blogService.findById(id); return ResponseEntity.ok().body(new ArticleResponseDto(.. 2025. 5. 3.
[Spring Boot] ResponseEntity๋ž€?GlobalResponse ์ •๋ฆฌ ํ•œ๋งˆ๋””๋กœ ์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ ๋กœ ์‘๋‹ตํ•  ๋•Œ์‘๋‹ต์„ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ์ƒ์žโ€‹๊ทผ๋ฐ ์‘๋‹ต์œผ๋กœ ๋ญ˜ ๋‹ด๋ƒ๋ฉด,โ€‹๋ฐ์ดํ„ฐ, ์ƒํƒœ์ฝ”๋“œ, ํ—ค๋” ์ด๋Ÿฐ๊ฑธ ๋„ฃ์–ด์„œ ๋ณด๋ƒ„ return ResponseEntity.status(HttpStatus.CREATED).body("ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต!"); ๋Œ€ํ‘œ์ ์œผ๋กœ ์ด์ •๋„ ์žˆ์Œ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ์ ์ด ์ƒ๊น€์ฝ”๋“œ๋ฅผ ์งœ๋Š” ์‚ฌ๋žŒ๋งˆ๋‹ค ์‘๋‹ต์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ.๋”ฐ๋ผ์„œ ๋ณดํ†ต GlobalResponse๋กœ ์‘๋‹ตํ˜•์‹ ํ†ต์ผํ•ด์„œ ํ”„๋ก ํŠธํ•œํ…Œ ๋˜์ ธ์คŒโ€‹๊ทธ๋Ÿผ ํ”„๋ก ํŠธ๋ž‘ ํ˜‘์—…ํ• ๋•Œ ํ”„๋ก ํŠธ๊ฐ€ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ž‘์—… ๊ฐ€๋Šฅโ€‹โ€‹GlabalResponse๋Š” ๋ณดํ†ต ์•„๋ž˜์™€๊ฐ™์ด ๊ตฌ์„ฑ๋จpublic class GlobalResponse { private int code; // ์ƒํƒœ ์ฝ”๋“œ private String message.. 2025. 5. 3.
[Spring Boot] @RestController ์ธ์‹ ์•ˆ๋  ๋•Œ (IntelliJ) ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ๋งŒ๋“œ๋Š” ์ค‘์ธ๋ฐ@RestController๊ฐ€ ์ธ์‹ ์•ˆ๋˜๋Š” ์ƒํ™ฉ ๋ฐœ์ƒImport๋„ ์•ˆ๋œ๋‹ค ์—ญ์‹œ๋‚˜ gradle์—์„œ Spring Web ์ถ”๊ฐ€๋ฅผ ์•ˆํ–ˆ๋˜๊ฑฐ์˜€์Œ ์ถ”๊ฐ€ํ•˜๋‹ˆ๊นŒ Import class ๋œธโ€‹Importํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ~ 2025. 5. 3.
[Spring Boot] ์˜์กด์„ฑ ์ฃผ์ž…ํ•  ๋•Œ ํ•„๋“œ์ฃผ์ž… vs ์ƒ์„ฑ์ž ์ฃผ์ž…? ์Šคํ”„๋ง์—์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๊ฐ€์žฅ ๊ถŒ์žฅ๋จ.๋ฐ”๋กœ ์˜ˆ์ „ ํฌ์ŠคํŒ…์—์„œ @RequiredArgsConstructor@Servicepublic class UserService { private final UserRepository userRepository;} ์ด ์˜ˆ์ œ๋ฅผ ๊ฐ–๊ณ  ์™”์—ˆ๋Š”๋ฐ, ์ด๊ฑด ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ DIํ•ด์ฃผ๋Š” ์žฅ๋ฉด์ž„.โ€‹์ด๊ฑธ ํ•„๋“œ ์ฃผ์ž…์œผ๋กœ ํ•œ๋‹ค๋ฉด? @Autowiredprivate UserRepository userRepository; ์ด๋ ‡๊ฒŒ ๋จ.์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ์ ์ด์ผ๋‹จ userRepository๊ฐ€ final์ด ์•„๋‹ˆ๋ผ์„œ ๋ถˆ๋ณ€์„ฑ์ด ๊นจ์ง๊ทธ๋ฆฌ๊ณ  ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ๋„ฃ์–ด์ฃผ๋‹ˆ๊นŒ ์˜์กด์„ฑ ์ฃผ์ž…์ด ใ…‡ใ„ท์„œ ๋๋Š”์ง€ ์•ˆ๋ณด์ž„์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๋” ์ข‹์„๊นŒ? ๐Ÿ’‰ 1. ๋ถˆ๋ณ€์„ฑ ๋ณด์žฅ (final ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ˆ๊นŒ)final์ด ๋ถ™์–ด์„œ ์ค‘๊ฐ„.. 2025. 5. 3.
[Spring Boot]@RequiredArgsConstructor๋ž€? ๋งŽ์ด ์“ฐ์ด๋Š” @NoArgsConstructor๋ž‘ @AllArgsConstructor๋ž‘๋น„๊ตํ•ด์„œ ๋งํ•˜์ž๋ฉด, @NoArgsConstructornew Member()๊ฐ™์ด ์•„๋ฌด ์ธ์ž ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋งŒ๋“ค์–ด์ฃผ๋Š” ์• ๋„ˆํ…Œ์ด์…˜์ž„๊ทผ๋ฐ setter๋‚˜ builder ์—†์œผ๋ฉด ๋ฌด์“ธ๋ชจ ์ผ์ˆ˜๋„โ€‹โ€‹@AllArgsConstructor๋ชจ๋“  ํ•„๋“œ ๋ฐ›์•„์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ƒ์„ฑ์ž ๋งŒ๋“ค์–ด์ฃผ๋Š” ์• ๋„ˆํ…Œ์ด์…˜์ž„new Member("Kim", 20); ์ด๋Ÿฐ์‹ํ•„๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ์“ธ๋ฐ์—†์ด ๋งŽ์€ ์ธ์ž ์ „๋‹ฌํ•ด์•ผํ• ์ˆ˜๋„โ€‹โ€‹@RequiredArgsConstructor์ฃผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…(DI)ํ• ๋•Œ ๋งŽ์ด ์“ฐ์ž„.final๋ถ™์€ ํ•„๋“œ๋‚˜, @NonNull๋ถ™์€ ํ•„๋“œ๋งŒ ์ƒ์„ฑ์ž์— ํฌํ•จ๋จ.ํ•„๋“œ๊ฐ€ ๋งŽ์•„๋„, ํ•„์š”ํ•œ ํ•„๋“œ๋กœ๋งŒ ์ƒ์„ฑ์ž ๋”ฑ๋”ฑ ์ •๋ฆฌ ๊ฐ€๋Šฅ-> ๊น”๋”ํ•จ. ์™œ @RequiredArgCons.. 2025. 5. 3.
[Spring Boot]Entity, Dto, Repository ํ—ท๊ฐˆ๋ฆฌ๋Š” ์‚ฌ๋žŒ ์˜ค์„ธ์š” ์ด๋ฏธ ํ”„์ ์„ ํ•ด๋ณด๊ธดํ–ˆ์ง€๋งŒdto๋ž‘ repository, entity ๊ฐœ๋…์€์ž ๊น ๋’ค๋Œ๋ฉด ํ—ท๊ฐˆ๋ฆฌ๋Š”๊ฒƒ๊ฐ™๋‹คโ€‹์ฒจ์— ์Šคํ”„๋ง๋ถ€ํŠธ๋กœ ๋ฐฑ์—”๋“œ ๊ณต๋ถ€ ์‹œ์ž‘ํ–ˆ์„๋•Œ๋„๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ๋˜ ๊ฐœ๋…์ž„โ€‹โ€‹์‚ฌ์ „์  ์˜๋ฏธ๋Š” ๋‹ค๋“ค ์ฑ…์ด๋‚˜ ๊ตฌ๊ธ€๋ง ํ•˜๋ฉด์„œ ๋ดค์„๊ฑฐ๊ฐ™์œผ๋‹ˆ๊นŒ ์Šคํ‚ตํ•˜๊ณ ๋น„์œ ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉดโ€‹Entity : ์Œ์‹(๋ฐ˜์ฐฌ)DTO : ๋ฐ˜์ฐฌํ†ตRepository : ๋ƒ‰์žฅ๊ณ โ€‹์ด๋Ÿฐ ๋А๋‚Œ์ž„(๋‚œ ๋จธ๋ฆฌ๊ฐ€ ๋‚˜๋น ์„œ ์ด์ •๋„๋กœ ์ง๊ด€์ ์ธ ๋น„์œ ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ฒจ์— ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ์Œ ใ… ) Entity (์ง„์งœ ๋ฐ˜์ฐฌ)์ง„์งœ ์ €์žฅํ•ด์•ผ๋  ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ทธ์ž์ฒด.๋ƒ‰์žฅ๊ณ (repository)์— ๋„ฃ๊ณ  ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” DB๋ž‘ 1:1๋กœ ์—ฐ๊ฒฐ๋œ ํด๋ž˜์Šค์ž„.์ด ํด๋ž˜์Šค ์•ˆ์— ์ด์ œ @Entity, @Id, @Column์ด๋Ÿฐ ์• ๋„ˆํ…Œ์ด์…˜ ๋ถ™๋Š”๊ฑฐ์ž„โ€‹โ€‹DTO (๋ฐ˜์ฐฌํ†ต)๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ฐ›์„๋•Œ ์“ฐ๋Š” ์ „์šฉ ์šฉ๊ธฐDB์— ์ €์žฅ.. 2025. 5. 3.
[Spring Boot]@Builder ์• ๋„ˆํ…Œ์ด์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž, ์˜ˆ์‹œ @Builder ์• ๋„ˆํ…Œ์ด์…˜@Builder ์• ๋„ˆํ…Œ์ด์…˜์€ ๋กฌ๋ณต์—์„œ ์ง€์›ํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜์ž„.ํ•œ๋งˆ๋””๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์คŒโ€‹์ƒ์„ฑ์ž ์œ„์— ๋ถ™์ด๊ฒŒ ๋˜๋ฉด, ๋นŒ๋” ํŒจํ„ด ๋ฐฉ์‹์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธํ•จ.โ€‹์˜ˆ๋ฅผ๋“ค์–ด ๋นŒ๋” ํŒจํ„ด ์•ˆ์“ฐ๊ณ  ๋งŒ๋“ค๋ฉดnew Article("title1", "abc");์ด๋ ‡๊ฒŒ ๋จ.โ€‹โ€‹๊ทผ๋ฐ ๋นŒ๋” ํŒจํ„ด ์“ฐ๊ฒŒ๋˜๋ฉด Article.builder().title("title1").content("abc").build();์ด๋ ‡๊ฒŒ ๋จ!โ€‹โ€‹๋นŒ๋” ํŒจํ„ด ์•ˆ์“ฐ๋ฉด abc๊ฐ€ ์–ด๋Аํ•„๋“œ์— ๋“ค์–ด๊ฐ€๋Š”๊ฐ’์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์ข€ ์–ด๋ ค์›€. ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ์ข€ ํ—ท๊ฐˆ๋ ธ๋˜๊ฒŒ, @Builder์˜ ์—ญํ• ์ด ์ƒ์„ฑ์ž์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ@AllArgsConstructor๋‚˜ @NoArgsConstuctor์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์œ„์— ์•ˆ๋ถ™๊ณ ํ•„๋“œ๋กœ ๋”ฐ๋กœ ๋บ๋Š”์ง€?โ€‹์ผ๋‹จ @B.. 2025. 5. 3.
๋ฐ˜์‘ํ˜•