๋ฐ์ํ 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. ์ด์ 1 2 3 ๋ค์ ๋ฐ์ํ