๐Ÿ’ปDEV-STUDY/Spring

JDBC API๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ โ†’ JDBC Template ๐Ÿ“š Spring JDBC : ๊ฐ„ํŽธํ•œ JDBC API ์‚ฌ์šฉ์„ ์œ„ํ•œ JDBC Template ์ œ๊ณตSpring JDBC๋Š” ๋ฐ˜๋ณต์ ์ธ JDBC API ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ง€์›ํ•œ๋‹ค. JDBC API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐ˜๋ณต ๋ฌธ์ œ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Spring์ด JdbcTemplate์„ ์ œ๊ณตํ•œ๋‹ค.1๏ธโƒฃ Spring JDBC๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ1-1. ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ ์ œ๊ฑฐJDBC API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต ์ž‘์—…์ด ๋ฐœ์ƒํ•œ๋‹ค.Connection ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜Statement ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ResultSet ์ฒ˜๋ฆฌ์˜ˆ์™ธ์ฒ˜๋ฆฌ์™€ ์ž์› ์ •๋ฆฌJdbcTemplate์€ ์ด ๋ชจ๋“  ๊ณผ์ •์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•œ ์ฝ”..
Spring Data JPA ์ฒซ ๋‹จ์ถ”์„œ๋ก Spring Data JPA๋ฅผ ๋ฐฐ์šฐ๊ธฐ์— ์•ž์„œ ์•Œ์•„์•ผ ํ•  ๋‚ด์šฉ๋“ค์ด ๋งŽ๋‹ค.JDBCORMJPAHibernate(JPA ๊ตฌํ˜„์ฒด)Spring Framework ํŠธ๋žœ์žญ์…˜์˜ ์ดํ•ด Spring Data JPA ๊ตฌ์กฐ์™€ ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šคํ•ด๋‹น ๋‚ด์šฉ๋“ค์€ ์•ž์œผ๋กœ ํ•˜๋‚˜์”ฉ ํฌ์ŠคํŒ…ํ•ด๊ฐ€๋ฉฐ ์ดํ•ดํ•  ์˜ˆ์ •์ด๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Spring Boot๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์‚ฌ์‹ค ๊ด€๋ จ ๋‚ด์šฉ Dockerize๋ฅผ ํ†ตํ•ด ๋“ค์€ ์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๋ฐ” ์žˆ๋‹ค. https://1000sang-dev.tistory.com/72 [Docker] Dockerize #2Docker๋ฅผ ํ†ตํ•œ Database ๊ตฌ๋™Database: ์‚ฌ์šฉํ•˜๋ ค๋Š” DB์˜ Base Docker Image ๊ธฐ๋ฐ˜์— ์ถ”๊ฐ€ ์„ค์ •๋ชฉ์ : Docker..
@Controller์—์„œ Exception ์ฒ˜๋ฆฌ@Controller์—์„œ Exception ์ฒ˜๋ฆฌSpring์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•Spring์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ทธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด ExcepitonHandler, ControllerAdvice, ResponseStatusException ๋“ฑ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ExceptionResolver: Spring(WAS) ๋‚ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌBasicErrorController: Spring์˜ ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ, ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ try-catch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(cross-cutting concerns)๋ฅผ ๋ฉ”์ธ ๋กœ์ง์—์„œ ๋ถ„๋ฆฌSpring์˜ HandlerException..
๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์™€ @Controller๋ฅผ ์ž˜ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐSpring ์• ํ”Œ๋ฆฌ์ผ€์ด์…ฉ๋Š˜ ๊ฐœ๋ฐœํ•  ๋•Œ, ํด๋ž˜์Šค๋ช…์€ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ช…์นญ๊ณผ 3๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜ ๋ช…์นญ์„ ์กฐํ•ฉํ•˜์—ฌ ์ž‘์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, PaymentService๋Š” ๋„๋ฉ”์ธ์ธ Payment์™€ ์—ญํ• ์ธ Service๋ฅผ ์กฐํ•ฉํ•œ ํด๋ž˜์Šค๋ช…์ด๋‹ค. ์ด์™€ ๊ฐ™์ด ๊ฐ ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋„๋ฉ”์ธ๊ณผ ๊ณ„์ธต ๊ตฌ์กฐ์—๋”ฐ๋ผ ๋ช…๋ช…๋œ๋‹ค.๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ช…์นญ + 3๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜ ๋ช…์นญPaymentService = Payment(๋„๋ฉ”์ธ) + Service(3๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜ ์ค‘ ์„œ๋น„์Šค ๊ณ„์ธต)UserRepository = User + RepositorryJobpostController = Jobpost + Controllerํด๋ž˜์Šค๋ฅผ ๋ฐฐ์น˜ํ•  ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. 1...
MVC ์•„ํ‚คํ…์ณ ํŒจํ„ด / 3-Layered ์•„ํ‚คํ…์ณ ํŒจํ„ดSpring Boot์˜ ์˜์˜: (1) ์˜์กด์„ฑ ๊ด€๋ฆฌ + (2) ์ž๋™ ์„ค์ •Spring Boot๋Š” ๋ณต์žกํ•œ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ด๋Š” React์˜ CRA(Create-React-App)์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ฃผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ์ค‘์ ‘์„ ๋‘”๋‹ค. 1. ์˜์กด์„ฑ ๊ด€๋ฆฌ:spring-boot-starter-web: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณต, ๋‚ด์žฅ๋œ Tomcat ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์ž๋™ ์„ค์ •์„ ์ œ๊ณตspring-boot-starter-security: ์ธ์ฆ, ์ธ๊ฐ€, ๊ถŒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌspring-boot-starter-data-jpa: JPA ๋ฐ Hibernate ๊ด€๋ จ ์˜์กด์„ฑsprin..
@PathVariable, @RequestParam, @ModelAttribute, @RequestBody, @Vaild, @JsonIncludeSpring์—์„œ ์„ธ๋ถ€ ์š”์ฒญ์œผ๋กœ ์ธ์ž…๋˜๋Š” ๊ฐ’๋“คSpring์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTP ์š”์ฒญ์„ ํ†ตํ•ด ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง€๊ณ , ๊ทธ์— ๋”ฐ๋ผ Model์ด๋‚˜ View๋„ ๋‹ค์–‘ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. Spring์—์„œ ์š”์ฒญ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. @PathVaribale: /api/users/{id}@PathVariable์€ URL ๊ฒฝ๋กœ์—์„œ ๋™์ ์œผ๋กœ ๊ฐ’์„ ์ถ”์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ ID๋‚˜ ํŠน์ • ๋ฆฌ์†Œ๋“œ์— ๋Œ€ํ•œ ๊ณ ์œ  ๊ฐ’์„ URL ๊ฒฝ๋กœ์—์„œ ์ง์ ‘ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.packa..
new ํ‚ค์›Œ๋“œ ์—†์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ / ์˜์กด์„ฑ ์ฃผ์ž…๊ฐ์ฒด ์ƒ์„ฑ ์›๋ฆฌ์Šคํ”„๋ง์—์„œ ์ฒ˜์Œ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋ฉด `new` ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•˜๋Š”๋ฐ @Contoller ๋“ฑ ๊ฐ์ฒด๋“ค์ด ๋งŒ๋“ค์–ด์งˆ๊นŒ?์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ด๋‹ต์€ Spring์˜ IoC(์ œ์–ด๊ถŒ ์—ญ์ „, Inversion of Control)์™€ Spring Container(Applilcation Context)์— ์žˆ๋‹ค. Spring์—์„œ new ํ‚ค์›Œ๋“œ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ์ด์œ ๋Š” Spring์ด ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Bean์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ Spring์€ ์‹ฑ๊ธ€ํ†ค(Singleton) ํŒจํ„ด์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํšจ์œจ์ ใ…‡๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. Spring Bean ์ด๋ž€?Spring Bean์ด๋ž€ Spring IoC(..
์ง๋ ฌํ™” / ์—ญ์ง๋ ฌํ™”HttpMessageConverter ์—ญํ• ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ Controller์˜ ์ฒ˜๋ฆฌ / ๋ฐ˜ํ™˜์— ๋Œ€ํ•ด MessageConverter๋ฅผ ์–ธ๊ธ‰ํ–ˆ์—ˆ์ง€๋งŒ ์ •ํ™•ํžˆ๋Š” "HttpMessageConverter"๋ผ๊ณ  ํ•œ๋‹ค. HttpMessageConverter๋Š” Spring MVC์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ HTTP ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. Spring ์š”์ฒญ ๋ณธ๋ฌธ์„ Java ๊ฐ์ฒด๋กœ ์—ญ์ง๋ ฌํ™”ํ•˜๊ณ , ์‘๋‹ต ๋ณธ๋ฌธ์„ Java ๊ฐ์ฒด์—์„œ JSON, XML ๋“ฑ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™์œผ๋Ÿฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. Spring์€ ๋‹ค์–‘ํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ํ•„์š”์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปค์Šคํ…€ MessageConverter๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.HttpMessageConverter ๋™์ž‘์›๋ฆฌHttpMessageConverter๋Š” ํด๋ผ์ด์–ธํŠธ..