์Šคํ”„๋ง/๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ

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 ์‚ฌ์šฉ
KIMHYEYUN
'์Šคํ”„๋ง/๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก