Framework/Spring Framework31 @RequestBody, @RequestParam, @PathVariable, @ModelAttribute์ ์ฐจ์ด ์คํ๋ง ํ๋ ์์ํฌ์์ HTTP ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ก ๋งคํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค. ๊ฐ๊ฐ์ ์ ๋ ธํ ์ด์ ์ ๋ค๋ฅธ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ๋ค์์ @RequestBody, @RequestParam, @PathVariable, @ModelAttribute์ ์ฐจ์ด์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ๋ด๋ถ์ ์๋ ๋ฐฉ์์ ๋ํด์ ๋ค๋ค๋ณด์๋ค.@RequestBody์ค๋ช @RequestBody๋ HTTP ์์ฒญ ๋ณธ๋ฌธ์ ๊ฐ์ฒด์ ๋งคํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.์ฃผ๋ก JSON, XML ๋ฑ์ ํฌ๋งท์ผ๋ก ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ ๋ ์ฌ์ฉ๋๋ค. JSON ๋ฐ์ดํฐ ๊ฒฝ์ฐ HttpMessageConverter ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด MappingJackson2HttpMessageConverter ํด๋์ค๋ฅผ ํตํด ์์ฒญ ๋ณธ๋ฌธ์ ์ฝ๊ณ , ํด๋น ๊ฐ์ฒด๋ก ๋ณํํ๋ค. .. Framework/Spring Framework 2024. 6. 30. JPA ์ํฐํฐ ์ํ (์๋ช ์ฃผ๊ธฐ) JPA์ ์ํฐํฐ ์ํTransient: ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋์ง ์๋ ์ํ์ด๋ค. ์๋ก์ด ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง๋ง ์์ง ์์์ฑ ์ปจํ ์คํธ์ ์ถ๊ฐ๋์ง ์์๋ค.User user = new User();user.setName("John Doe");// user๋ transient ์ํPersistent: ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋๋ ์ํ์ด๋ค. ์ด ์ํ์์๋ ์ํฐํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์์ฑ ์ปจํ ์คํธ์ ์ํด ์ถ์ ๋๊ณ , ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ค.entityManager.persist(user);// user๋ persistent ์ํDetached: ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๋ ์ด์ ๊ด๋ฆฌ๋์ง ์๋ ์ํ์ด๋ค. ์ฃผ๋ก ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ์ํฐํฐ ๋งค๋์ ๊ฐ ๋ซํ ๋ ๋ฐ์ํ๋ค.en.. Framework/Spring Framework 2024. 6. 6. ํํฐ์ ์ธํฐ์ ํฐ์ ์ฐจ์ด ํํฐ์ ์ธํฐ์ ํฐ๋ ๋ ๋ค ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ํน์ ์์ ์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. ์๋ฐ ํํฐ์ ์คํ๋ง ์ธํฐ์ ํฐ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์ปจํธ๋กค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ด๋ ์๋ต์ด ํด๋ผ์ด์ธํธ์ ๋๋ฌํ๊ธฐ ์ ์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌํ ์ ์๋ค.๋ํ ๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ์ฌ์ ์ฒ๋ฆฌ(pre-processing)์ ์ฌํ ์ฒ๋ฆฌ(post-processing)๋ฅผ ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์์ฒญ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋ ์๋ต ํค๋๋ฅผ ์์ ํ ์ ์๋ค.ํํฐ์ ์ธํฐ์ ํฐ๋ ๋ชจ๋ ์ฒด์ธ(chain)์ ํํ๋ก ์ฌ๋ฌ ๊ฐ๊ฐ ์ฐ์์ ์ผ๋ก ์คํ๋ ์ ์๋ค. ํ๋์ ํํฐ๋ ์ธํฐ์ ํฐ๊ฐ ๋ค์ ํํฐ๋ ์ธํฐ์ ํฐ๋ฅผ ํธ์ถํ๋๋ก ์ค๊ณํ ์ ์๋ค.์ด๋ ๊ฒ ํํฐ์ ์ธํฐ์ ํฐ๋ ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๊ทธ ๋์ ๋ฐฉ์๊ณผ ์ ์ฉ.. Framework/Spring Framework 2024. 3. 4. Spring Boot 3.X migration ์ด์ (feat. ์คํ๋ง ์ํ๋ฆฌํฐ, JWT ๋ณ๊ฒฝ์ ) ์คํ๋ง ๋ถํธ 2 ๋ฒ์ ์ ์ฌ์ฉํ๋ค๊ฐ 3๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ฒ ๋๋ฉด ์ฌ๋ฌ๊ฐ์ง ์ด์๊ฐ ์๊ธฐ๊ฒ ๋๋ค. ํนํ๋ JDK17 ๊น์ง ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ๊ธฐ์กด์ ์๋ ํจํค์ง ๊ฒฝ๋ก๋ฅผ ๋ชป ์ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ๋ง๋ค. ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ์ ๋ํด์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ๊ธฐ๋ก์ผ๋ก ๋จ๊ฒจ ๋์์ผ๊ฒ ๋ค. ๊ธฐ์กด ๋ณ๊ฒฝ ํ ์คํ๋ง ๋ถํธ ๋ฒ์ 2.7.17 3.0.11 ์๋ฐ ๋ฒ์ 8 17 JWT ๋ฒ์ 0.9.1 0.11.5 Spring Security ๋ ๋ชจ๋ 6๋ฒ์ (6:3.1.1.RELEASE) ์ ์ฌ์ฉํ์๋ค. thymeleaf์์ Spring Security๋ฅผ ์ฐ๋ ค๋ฉด springsecurity6๋ฅผ ์จ์ผ ํ๋ค. ๐ build.gradle ๋ณ๊ฒฝ ํ dependencies { implementation 'org.springframework.boot:spring-.. Framework/Spring Framework 2023. 11. 9. JPA ์ Spring data JPA ์ฐจ์ด์ (+ ํ์ด๋ฒ๋ค์ดํธ) JPA, JPA, JPA ๋ง์ ์ฌ๋๋ค์ด ๋งํ์ง๋ง, JPA ์ Spring data JPA๋ฅผ ํผ์ฉํด์, ์ฐฉ๊ฐํด์ ์ฌ์ฉํ๋ ์ฌ๋์ด ๋ง์ ๊ฒ ๊ฐ๋ค.๋ฌผ๋ก ๋๋ํ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. JPA๋ EntityManager ๋ฅผ ์ด์ฉํ์ฌ, EntityManager ์ ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ CRUD ํ๋ ๊ฑธ๋ก ์๊ณ ์์ง๋ง, ์ค์ ํ๋ก์ ํธ๋ฅผ ํด๋ณด๋ฉด EntityManager ๋ฅผ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ Repository ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ์ฌ์ฉํ๊ณ ์๋ค. ๋ฌด์จ ์ฐจ์ด ์ผ๊น?์ด์ฐธ์ JPA์ Spring data JPA ๊ฐ๋ ์ ๋ค์ก์ ๋ณด๋ ค๊ณ ํ๋ค. JPA (Java Persistence API)JPA๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ์ค API๋ค. JPA๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํํ๊ณ , CRU.. Framework/Spring Framework 2023. 11. 8. ์์ฒญ์ด ์์ ๋ ์คํ๋ง MVC ๋ด๋ถ์ ํ๋ฆ ๊ณผ์ (DispatcherServlet ์ค์ฌ) Spring MVC ๊ตฌ์กฐ ํ๋ฆ์คํ๋ง MVC๋ Model-View-Controller ๋์์ธ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ํ๋ ์์ํฌ๋ก, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ธ๋ค.๊ธฐ๋ฅ๊ณผ ์ญํ ๋ณ๋ก ๋ชจ๋์ ๋๋๊ณ ๊ฐ ๋ชจ๋๋ค์ด ํ๋ ฅํ์ฌ ํด๋ผ์ด์ธํธํํ ์จ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด์ฃผ๊ฒ ๋๋ค.๊ทธ ์ค DispatcherServlet์ ์คํ๋ง ํ๋ ์์ํฌ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, ์คํ๋ง MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller) ์ญํ ์ ํ๋ค. ๋ชจ๋ HTTP ์์ฒญ์ ๋จผ์ DispatcherServlet์ ํตํด ์ฒ๋ฆฌ๋๋ฉฐ, ์ด๊ณณ์์ ์์ฒญ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ทฐ๋ก ๋ผ์ฐํ ํ๋ค. DispatcherServlet์ ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ์ด ์ง์ ์ผ๋ก, ์์ฒญ์ ์ฒ๋ฆฌ ํ๋ฆ์.. Framework/Spring Framework 2023. 10. 31. (23.01.18)Spring ํ๋ ์์ํฌ + Thymeleaf ๋ก FullCalendar ์ด๋ฏธ์ง ๋ํ๋ด๊ธฐ ๋ฐ ์ด๋ฒคํธ ์จํด๋ฆญ(onClick)์ฒ๋ฆฌํ๊ธฐ Spring + Thymeleaf ๋ก FullCalendar ์ด๋ฏธ์ง ๋ํ๋ด๊ธฐ ๋ฐ ์ด๋ฒคํธ ์จํด๋ฆญ(onClick)์ฒ๋ฆฌํ๊ธฐ ๋ฌ๋ ฅ์ ๋ทฐ๋ก ๋์ธ ๋ ๋ง์ด ์ฐ๋ ๋ฌ๋ ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค. ๋ฐ๋ก fullcalendar์ธ๋ฐ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฌ๋ ฅ์ ๋ง๋๋ ๊ฒ์ด๋ค. fullcalendar์ ์ผ์ ์ ๋ํ๋ด๋ ๋ฌ๋ ฅ์ ์นํ์ ์ธ๋ฐ ์ด๋ฅผ ์กฐ๊ธ ์์ฉํ์ฌ ์ผ๊ธฐ ๋ฌ๋ ฅ์ผ๋ก ๋ง๋ค์๋ค. ์ผ๊ธฐ๋ฅผ ์ฐ๋ฉด ํด๋น ๋ ์ง์ ํ๋กํ ์ฌ์ง์ด ๋จ๊ณ ํ๋กํ์ ๋๋ฅด๋ฉด ์ผ๊ธฐ ์์ธ ํ์ด์ง๋ก ๋์ด๊ฐ๊ฒ ๋ง๋ค์๋ค. https://fullcalendar.io/ FullCalendar - JavaScript Event Calendar Open Source... With over 10 years of open source and over 120 contributors,.. Framework/Spring Framework 2023. 1. 23. (23.01.17.)Spring ํ๋ ์์ํฌ : AOP(Aspect Oriented Programming) ๊ด๊ณ์งํฅ ํ๋ก๊ทธ๋๋ฐ AOP(Aspect Oriented Programming) ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ Core Concerns : ๋ฉ์ธ ๋ก์ง Cross-Cutting Concerns : ๋ถ๊ฐ์ ์ธ ๋ก์ง(๋ก๊ทธ์ธ ๊ฒ์ฌ, ๋ณด์, ๋ก๊น ….) ๋ฐ๋ณต๋๋ ๋ถ๊ฐ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ(๋ถ๊ฐ๋ก์ง ์ค๋ณต๋ฐฉ์ง) OOP(Object Oriented Progrramming) ๋ฐฉ์์ผ๋ก๋ ์๋จ AOP ๋ฐฉ์์ ์ฌ์ฉํ์ฌ OOP๋ฅผ ๋ณด์ํ ์ ์์ Adivce : ๋ถ๊ฐ์ ์ธ ๋ก์ง์ ๋ฉ์๋๋ก ์ ์ธํ ๊ฒ Pointcut : ๋ถ๊ฐ๋ก์ง์ธ ์คํ๋ ๋ฉ์ธ ๋ก์ง์ ์์ ํ ๊ฒฝ๋ก ํํ Aspect : ๋ถ๊ฐ๋ก์ง์ ๋ฉ์๋๋ก ์ ์ธํ ํด๋์ค JoinPoint : ๋ถ๊ฐ๋ก์ง์ ์ด์ด์ ์คํ๋ ์ฃผ ๋ก์ง์ ๋ฉ์๋ ์ ๋ณด @Before, @After, @Around, @AfterReturning.. Framework/Spring Framework 2023. 1. 18. (23.01.16.)Spring ํ๋ ์์ํฌ : ์ด๋ฉ์ผ ์ธ์ฆ ๋ณด์ - ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์ธ์ฆ์ ์ธ์ ์ด ๋ฌ๋ผ ์ธ์ฆ ์ค๋ฅ ๊ณ ์น๊ธฐ ์ด๋ฉ์ผ ์ธ์ฆ ๋ณด์ -์ธ์ฆ์ ์ ์ฒญํ ๊ธฐ๊ธฐ ์ด์ธ์ ๊ธฐ๊ธฐ์์๋ ์ธ์ฆ ๋ต๋ณ ๋ฉ์ผ ํ์ธ -์ด๋ฉ์ผ์ ์ธ์ฆ์ฉ ์ํธ ๋ฌธ์์ด์ ์ ๋ฌ -์ด๋ฉ์ผ ์์ ์๊ฐ ๋ฉ์ผ์ ์ด๊ณ ๋งํฌ ํด๋ฆญ > ์ํธ๋ฌธ์์ด์ ๋ค์ ์๋ฒ๋ก ๋ณด๋ด์ค๋ค. -์ด๋ฉ์ผ์ ๋ณด๋ผ๋์ ์๋ฒ์ธก ๋ฉ์๋์ ์ํธ๋ฌธ์์ด์ ๋ค์ ๋ฐ์ ๋์ ๋ฉ์๋๋ ๋ค๋ฅด๋ค. -์ด์ฉ์์ ์ธ์ ์ ์ํธ๋ฌธ์์ด์ ๊ธฐ์ต์์ผ๋๊ณ ๋์์์ ๋์ ์ํธ ๋ฌธ์์ด์ ๋น๊ตํ๋ค. -์์ ์ ์ฐจ๊ฐ ๋ชจ๋ ๋์ผ ์์คํ ์์ ์คํ๋๋ค๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค. -ํ์ง๋ง ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์ธ์ฆ์ ์๋ต์ ๋๋ฅด๋ฉด ์ธ์ ์ด ๋ค๋ฅธ ์ธ์ ์ผ๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์ธ์ฆ์ด ์๋ํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ธ์ฆ ๋งํฌ๋ฅผ ๋๋ฅผ ๋ ์ธ์ id๊น์ง ๊ฐ์ด ์ค์ ํด๋น ์ธ์ id์ ์๋ ๋ฌธ์์ด๊ณผ ํจ๊ป ๋น๊ตํ๊ฒ๋ ํด์ผํ๋ค. ๋จผ์ ๋ฉ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ @ServletComponentScan์.. Framework/Spring Framework 2023. 1. 18. (23.01.14.)Spring ํ๋ ์ ์ํฌ : ์๋ฌ ํ์ด์ง ๋ง๋ค๊ธฐ ์๋ฌ๊ฐ ๋จ๊ฒ ๋๋ฉด ์น์ ์ ๋ชจ๋ฅด๋ ์ด์ฉ์๋ ๋นํฉํ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฌ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๊ฐ๋ฐ์๊ฐ ์๋ฌํ์ด์ง๋ฅผ ๊พธ๋ฉฐ์ ์ด์ฉ์์๊ฒ ์ ์ค๋ช ํ ์ ์๋ค. ErrorHandler.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; i.. Framework/Spring Framework 2023. 1. 17. (23.01.13)Spring ํ๋ ์์ํฌ : ์ ๋ก๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ณด๊ธฐ(์ด๋ฏธ์ง ํ๊ทธ, Thymeleaf์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ) ์ ๋ก๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ณด๊ธฐ โ -WEB-INF ์๋์ ๋๋ ํ ๋ฆฌ๋ ์น๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผ ๋ถ๊ฐ(WEB-INF/files/) -์๋ฒ์ธก์์ WEB-INF ์๋์ ์ด๋ฏธ์ง๋ฅผ ์ ํด์ค ์๋ ์์ - -์์ ํ๊ทธ๊ฐ ์น๋ธ๋ผ์ฐ์ ์ ๋ก๋๋๋ฉด ์น๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์๋ฒ์ ์์ฒญํ๊ฒ ๋จ -์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ์๋ค๋ฉด ์ด ๋ ๊ทธ ๋ฉ์๋๊ฐ ์คํ๋จ -์ปจํธ๋กค๋ฌ์์๋ @ResponseBody๋ฅผ ์ฌ์ฉํ์ฌ byte[ ]์ด ๋ธ๋ผ์ฐ์ ๋ก ๋ฆฌํด๋๋๋ก ํจ -์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ๊ทธ๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ํ์ํ ์ ์์ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42.. Framework/Spring Framework 2023. 1. 16. (23.01.12) Spring ํ๋ ์ ์ํฌ : CRSF(Cross Site Request Forgery) CRSF(Cross Site Request Forgery) ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์ฌ๊ธฐ ์๋ ์ฌ์ดํธ์์ ๋ฐ์์ค์ง ์์ ์กฐ์ํ ์นํ์ด์ง๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ์์ ์์ฒญ url์ ์๊ณ ์๋ชป๋ ์์ฒญ์ ๋ณด๋ด๋ ค ํ ์ ์๋ค. CsrfTestConrtroller.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.spri.. Framework/Spring Framework 2023. 1. 13. ์ด์ 1 2 3 ๋ค์