์ต์ ๊ธ ๐
์๋กญ๊ฒ ์์ฑ๋ ๊ธ๋ค์ ํ์ธํด๋ณด์ธ์.
-
์ฟ ํค vs ์ธ์ vs JWT, ์ค๋ฌด์์๋ ๋ญ๋ฅผ ์จ์ผํ ๊น?
์น ์ธ์ฆ์ ๊ณต๋ถํ๋ค ๋ณด๋ฉด ์ฟ ํค, ์ธ์ , ํ ํฐ(JWT)์ด ๋ค์์ฌ์ ํท๊ฐ๋ฆฐ๋ค. "์ ๋ค ๋น์ทํ ๊ฑฐ ์๋?"๋ผ๋ ์๊ฐ์ด ๋ค๊ธฐ๋ ํ๊ณ , "JWT๊ฐ ์ต์ ์ด๋๊น ๋ฌด์กฐ๊ฑด JWT"๋ผ๋ ๊ธ๋ ํํ๋ค. ํ์ง๋ง ๊ฐ ๋ฐฉ์์ด ์ ๋ฑ์ฅํ๋์ง๋ฅผ ์ดํดํ๋ฉด, ์ด๋ค ์ํฉ์์ ๋ฌด์์ ์จ์ผ ํ๋์ง๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ธ๋ค.์ด ๊ธ์์๋ "์ ์ด๋ฐ ๊ฒ๋ค์ด ํ์ํด์ก๋๊ฐ"๋ถํฐ ์ถ๋ฐํด์, ๊ฐ๊ฐ์ ๊ตฌ์กฐ์ ๋ณด์ ํน์ฑ, ํ๊ณ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ๊ทธ ํ๊ณ๋ฅผ ์ด๋ป๊ฒ ๋ณด์ํ๋์ง๊น์ง ์ ๋ฆฌํ๋ค. ์ค์ ์๋น์ค๋ฅผ ์ด์ํ๋ฉด์ ๊ฒช์ ๋์์ฑ ์ด์, ํ ํฐ ๊ด๋ฆฌ ์ ๋ต์ ์คํจ์ ๊ฐ์ ๊ณผ์ ๋ ํจ๊ป ๋ด์๋ค.0. ๋ฐฐ๊ฒฝ: Statelessํ HTTP์ State๊ฐ ํ์ํ๋ค๋ฉด๊ธฐ๋ณธ์ ์ผ๋ก HTTP ํ๋กํ ์ฝ์ ์ํ๋ฅผ ๊ธฐ์ตํ์ง ์๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๊ฐ ์๋ตํ๋ฉด ๋ ์ฌ์ด์ ๊ด๊ณ๋ ..
-
@Transactional ์ด๋ ธํ ์ด์ ํด์ฒด ๋ถํดํ๊ธฐ
์ต๊ทผ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ํ์ฉํ๋ฉด์, ํธ๋์ญ์ ์ด๋ ธํ ์ด์ ์ ๊น๊ฒ ๊ณต๋ถํ ๊ธฐํ๊ฐ ์๊ฒผ๋ค.@Transactional(propagation = Propagation.REQUIRES_NEW)@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) ์์ ๊ฐ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ, ๋ฌด์์์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ณด๋, ๊ฐ ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฌด์์๊ณ , ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ๋ฏ์ด๋ณด๊ณ ์ถ์ด์ ๋๋ฆ ํ๊ณ ๋ค์ด ๊ณต๋ถํด๋ดค๊ณ , ๊ทธ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.1. ํธ๋์ญ์ ์ ์ํธ๋์ญ์ ์ด๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ๋์ ๋ ผ๋ฆฌ์ ์์ ์ '์์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ'์ ์๋ฏธํ๋ค. ์ฌ์ค ์ ์๋ผ๋๊ฒ ์๋ ์ฌ๋์ด ๋ณผ๋ ์ดํด๊ฐ ์๋์ง๋ง, ์ฒ์ ์ ํ ๋๋ ๋๊ฒ ๋ฉ๊ฒ ๋๊ปด์ง๋ ๊ทธ๋ฐ๊ฒ ์๋ค. ๊ทธ๋ด..
-
[์์ฝํ ๋ฐฐ์ก ํ๋ก์ ํธ] ์ค์๊ฐ ๊ธฐ์ฌ ์์น ๊ฐฑ์ ์ฑ๋ฅ ๊ฐ์ ๊ธฐ
0. ํ์ค ์์ฝHTTP ๋จ๊ฑด ์กฐํ -> SSE & Kotlin Flow ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ์์ฝํ ๋ฐฐ์ก ํ๋ซํผ์ ์ ์ฝํ์ฌ์์ ์์ฐ๋ ์์ฝํ์ ๋ณ์,์ฝ๊ตญ ๋ฐ ๊ธฐํ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ B2B ์๋น์ค์ ๋๋ค.ํด๋น ์๋น์ค์ ๊ณ ๊ฐ์ ์์ฐ๋ ์์ฝํ์ด ์์ฝํ ๋ฐฐ์ก ๊ท์น ๋ฐ ๊ท์ ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐฐ์ก๋๊ณ ์๋์ง, ํ์ฌ ์ํฉ์ ์ด๋ ํ์ง ์งํ์ํฉ์ ํ์ ํ ์ ์๊ณ , ์ค์ ๋ก ์์ฝํ์ ๋ฐฐ์กํ๊ธฐ ์ํด ๋ฐฐ์ฐจ๋ฅผ ์์ฑํ์ฌ ๋ฐฐ์ก ๊ธฐ์ฌ๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค. (์์ฝํ ์ ๋ฌธ ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ์ด๋ผ๊ณ ๋ณด์๋ฉด...)1. ๋ฐฐ๊ฒฝ - ์๋ก๊ณ ์นจ์ ํด์ผ๋ง ๋ฐฐ์ก ๊ธฐ์ฌ์ ์ต์ ์์น๊ฐ ๋ณด์ด๋ ๋ฌธ์ ์์ฝํ ๋ฐฐ์ก ํ๋ซํผ์ ์ฌ์ฉ์ ๋ฐ ๊ด๋ฆฌ์ ํ๋ฉด์๋ ์ค์๊ฐ์ผ๋ก ๋ฐฐ์ก ๊ธฐ์ฌ์ ์์น๊ฐ ํ์๋๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.ํ์ง๋ง ๊ธฐ์กด ๊ตฌ์กฐ๋ ๋จ์ HTTP GET ์์ฒญ์ผ๋ก ํ๋ฉด ์ต์ด..
-
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฌธ์์ด ๊ฒน์ณ์ฐ๊ธฐ_ReplaceRange ํ์ฉ
์ฝํ ๋ฅผ ํ๋์ ๋๋ค๊ฐ... ์ฝํ๋ฆฐ์ผ๋ก ๋ค์ ์ค๋นํ ๊ฒธ ์์ํด๋ณธ๋ค.์ ๋ฌธ์ ๋ ์ฌ์ค ๊ต์ฅํ ๊ฐ๋จํ ๊ตฌํ ๋ฌธ์ ์ 1. ๋ด ํ์ดclass Solution { fun solution(my_string: String, overwrite_string: String, s: Int): String { var answer: String = "" for (i in 0..my_string.length - 1) { when { i answer+=my_string[i] s answer+=overwrite_string[i-s] i >= overwrite_string.length+s -> answer+..
-
[CANCER-FINE] ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ํ์ฉํด ํํํ Entity ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ
1. ๋ฐฐ๊ฒฝJPA๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ์์ฑํ ๋ ์ฐ๋ฆฌ๋ ๋ณดํต ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ํํ๊ฐ ์ผ๋ฐ์ ์ ๋๋ค.@Entity@Table( name = "board", indexes = [Index(name = "idx_fts", columnList = "title, content", unique = false)]) class Board( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null @Column(nullable = false) var title: String, @Column(columnDefinition = "TEXT", nul..
-
[CANCER-FINE] ํ๋ก์ ํธ init
1. ํ๋ก์ ํธ ๊ฐ์ํ์ฌ ์ํ์์ ๋ํ ์ ๋ณด๋ ์ฐ์ฌ๋์ด ์์ผ๋ฉฐ, ๊ฐ ํ์์๊ฒ fitํ ์ ๋ณด๋ฅผ ์ฐพ๋๊ฒ์ด ๋๋ฌด ์ด๋ ค์์ํ์๋ฅผ ์ํ ๋ง์ถคํ ์ ๋ณด ์ ๊ณต ์ฌ์ดํธ2. ERD ๋ค์ด์ด๊ทธ๋จERD๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋ณต์กํ์ง ์์ต๋๋ค.3. ๊ธฐ์ ์คํFrontEnd : React.js , html, css, javaScriptBackEnd : SpringBoot 3.3.4, Kotlin1.9, MySQL, Spring Data JPA, AOP, Functional Programming, JUnit54. ์ฐธ์ฌ ์ธ์์์ฑ์ ํผ์ ์งํ5. ํต์ฌ ๊ธฐ๋ฅ1) ํ์ํ์๊ฐ์ ๋ก๊ทธ์ธ๋ก๊ทธ์์ํ์์ ๋ณด์์ ํ์ ํํดSession ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ์ ์งAOP ํ์ฉํ SessionCheckํ์ ๋ณธ์ธ ์ ๋ณด์กฐํ2) ๊ฒ์๊ธ๊ฒ์๊ธ ์์ฑ๊ฒ์๊ธ ์กฐํ(์ ์ฒด ๊ฒ์๊ธ ..