QueryDSL gradle ์ค์ plugins { id 'java' id 'org.springframework.boot' version '3.0.6' id 'io.spring.dependency-management' version '1.1.0' // id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'dev.be' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation..
์คํ๋ง/๊ฒ์ํ ๋ง๋ค๊ธฐ
CSRF (Cross-Site Request Forgery) ์คํ๋ง ์ํ๋ฆฌํฐ์ ์ด๋
ธํ
์ด์
์ธ @EnableWebSecurity ๋ ๊ธฐ๋ณธ์ ์ผ๋ก CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๊ธฐ๋ฅ์ ์ง์ CSRF ๋? ๐ค ์ฌ์ดํธ ๊ฐ ์์ฒญ ์์กฐ
OSIV (Open Session In View) OSIV ๋ ์์์ฑ ์ปจํ
์คํธ๋ฅผ ๋ทฐ๊น์ง ์ด์ด๋๋ ๊ธฐ๋ฅ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ ์ง๋๋ฉด ์ํฐํฐ๋ ์์ ์ํ๋ก ์ ์ง๋จ ๋ทฐ๊น์ง ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ด์์๋ค๋ฉด ๋ทฐ์์๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉ ๊ฐ๋ฅ OSIV ๋์ ์๋ฆฌ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ OSIV๋ ๋น์ฆ๋์ค ๊ณ์ธต์์ ํธ๋์ญ์
์ ์ฌ์ฉํ๋ OSIV ์์์ฑ ์ปจํ
์คํธ๋ ์ฌ์ฉ์์ ์์ฒญ ์์ ์์ ์์ฑ๋์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฑฐ๋ ์์ ํ ์ ์๋ ํธ๋์ญ์
์ ๋น์ฆ๋์ค ๊ณ์ธต์์๋ง ์ฌ์ฉํ ์ ์๋๋ก ํธ๋์ญ์
์ด ์ผ์ด๋จ spring.jpa.open-in-view:true ๊ธฐ๋ณธ๊ฐ Spring Boot JPA ์์กด์ฑ์ ์ฃผ์
๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ ๊ฒฝ์ฐ spring.jpa.open-in-view์ ๊ธฐ๋ณธ๊ฐ์ธ true๋ก ์ง์ ๋์ด ์์ด OSIV๊ฐ ์ ์ฉ๋ ..
Thymeleaf Decoupled Template Logic ๐ค ํ์ฌ index ์์ ์ปดํฌ๋ํธ์ ๋ถ๋ฆฌ๋ฅผ ์ํด์ ๊ตฌ๋ฌธ์ ์์ฑํ๋๋ฐ, ์ ์ฐจ ๋์์ธ์ ์งํํ๋ค๋ณด๋ฉด ์ฌ๋ฌ ๊ตฌ๋ฌธ๋ค์ด ๋ถ์ด์ ์ฝ๋๊ฐ ๋ง์ด ์ปค์ง ์ ์๋ค. ๊ทธ๋์ thymeleaf ๊ตฌ๋ฌธ์ ๋ฐ๋ก ๋ถ๋ฆฌ์์ผ์ ์์ฑํ๊ณ , index๋ฅผ ์์ ๋งํฌ์
์ํ๋ก ์ ์ง์ํค๋ ๋ฐฉ๋ฒ ์์ ๋งํฌ์
๊ณผ Thymeleaf ๊ตฌ๋ฌธ์ผ๋ก ๋ฐ๋ก ๋๋จ ์ฐธ์กฐ-thymeleaf ์ธํ
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
ํ๋กํผํฐ์์ ์ค์ ํ ์ ์๋๋ก ์ ๊ณต๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ธํ
์ ๋ฐ๋ก ์งํํด์ผํจ ThymeleafConfig package com.example.springboardproject.config; import lombok.Getter; import lombok.RequiredArgsConstruc..
JpaAuditing ๐ค Java์์ ORM ๊ธฐ์ ์ธ JPA๋ฅผ ์ฌ์ฉํด์ ๋๋ฉ์ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋งคํํ ๋ ๊ณตํต์ ์ผ๋ก ๋๋ฉ์ธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ํ๋๋ ์ปฌ๋ผ๋ค์ด ์กด์ฌํ๋๋ฐ, ๋๋ฉ์ธ๋ง๋ค ๊ณตํต์ผ๋ก ์กด์ฌํ๋ค๋ ์๋ฏธ๋ ์ฝ๋๊ฐ ์ค๋ณต๋๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋๊ฐ, ์ธ์ ํ๋๊ฐ์ ๋ํ ๊ธฐ๋ก์ ๋จ๊ฒจ๋๋ ๊ฒ์ด ์ค์ํจ ๊ทธ๋์ JPA์์ ๊ฐ์ํ๋ค๋ผ๋ ๋ป์ ๊ฐ์ง Audit์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, Spring Data JPA์์ ์๊ฐ์ ๋ํด์ ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.. ๋๋ฉ์ธ์ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๊ฑฐ๋ ์กฐํ๋ฅผ ์ํํ ํ์ update๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋งค๋ฒ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด์ค์ผํ๋๋ฐ, audit์ ์ด์ฉํ๋ฉด ์๋์ผ๋ก ์๊ฐ์ ๋งคํํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋ฃ์ด์ฃผ๊ฒ ๋จ Article.java && Ar..
1. ๋๋ฉ์ธ ERD ๋ค์ด์ด๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ 2. ์๋ฐ ํด๋์ค๋ก ๋๋ฉ์ธ ํํ ERD ๐ค Entity Relationship Diagram ๊ฐ์ฒด-๊ด๊ณ ๋ชจ๋ธ ํ
์ด๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค๋ช
ํด์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ์ด๋ผ๊ณ ๋ณผ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ DB์ ๊ตฌ์กฐ๋ฅผ ํ ๋์ ํ์
๊ฐ๋ฅ ์ฆ, API๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฝ์๋ด๊ธฐ ์ํ ๋ชจ๋ธ ๊ตฌ์กฐ๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋จ
API ์ค๊ณ๋ ๊ตฌ๊ธ ๋ฌธ์๋ฅผ ์ด์ฉํด ์์ฑ ๋ทฐ์ API์ ์ด๋ค ๋ฐฉ์์ผ๋ก url ์ด๋ฆ์ ์ง์ ํ ๊ฒ์ธ์ง, method ๋ฐฉ์์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง, ํด๋น url์ ์ค๋ช
๊ณผ ํจ๊ป ์์ฑ URL์ ๋ค๋ฅธ ํ์
๊ฐ๋ฐ์๊ฐ ๋ดค์ ๋๋ ์ง๊ด์ ์ผ๋ก ์ด๋ค ํญ๋ชฉ์ ๊ด๋ จ๋ URL์ธ์ง ํ์
ํ ์ ์๊ฒ ์์ฑํ๋ ๊ฒ์ด ์ค์ ๐โ๏ธ ํฉ์๋ฅผ ํตํด ์ง์ ํด์ผํจ ์ฌ๊ธฐ์๋ ๊ฒฝ๋ก์ HTTP ๋ฉ์๋๋ง ์์ฑํ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์ API์ spec์ ์์ฑ API์ ์ ํํ ์ด๋ค ๋ฐ์ดํฐ๋ค์ ์ฃผ๊ณ ๋ฐ๋์ง๋ฅผ ์๊ฐํด๋ณผ ์ ์์
์ ์ฆ ์ผ์ด์ค ๐ค ์ ์ฆ์ผ์ด์ค๋ ์์คํ
์ ๋์์ ์ฌ์ฉ์์ ์
์ฅ์์ ํํํ ์๋๋ฆฌ์ค์ด๋ฉฐ, ์์คํ
์ ๊ด๋ จํ ์๊ตฌ์ฌํญ์ ์์๋ด๋ ๊ณผ์ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ค ๊ฐ๋ฐ์ ์ํ ์ํํธ์จ์ด์ ๊ธฐ๋ฅ์ ๊ฐ๋ต์ ์ผ๋ก ์ค๋ช
์ด ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํจ ์ ์ฆ์ผ์ด์ค๋ ์์คํ
์ ๋ถ์ํ๋ ์ฌ๋๊ณผ ์ฌ์ฉํ ์ฌ๋์ด ํจ๊ป ์์คํ
์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋๋ฐ์ ๋์์ ์ค ์ ์ฆ์ผ์ด์ค๋ฅผ ์์ฑํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ ์์คํ
์ ๊ฐ๋ฐํ๋ ์ฌ๋๋ณด๋ค๋ ์ฌ์ฉ์์ ์
์ฅ์์ ์ดํดํ๊ธฐ ์ํด ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ๋์ด์ผ ํจ https://www.diagrams.net ์ฌ์ฉ