๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

728x90

Spring๐Ÿƒ

(33)
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(2) ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ ์œ ๋‹›(๋‹จ์œ„) ํ…Œ์ŠคํŠธ : ๋ฉ”์„œ๋“œ ๋‹จ์œ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ : ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ˆ˜ํ–‰ F.I.R.S.T ์›์น™ Fast : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๋นจ๋ผ์•ผ ํ•œ๋‹ค. Independent : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์—ฐ๊ด€๋˜์ง€ ์•Š๊ณ , ๊ณ ๋ฆฝ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰ ๋…๋ฆฝ์  ์ด์–ด์•ผ ํ•œ๋‹ค. Repeatable : ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋Š” ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค. ๋ฐ˜๋ณต์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œํ–‰ํ•ด๋„, ๊ฒฐ๊ณผ๋Š” ๊ฐ™์•„์•ผ ํ•œ๋‹ค. Self-validating : ์ž์ฒด์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๋„์ถœ๋˜์•ผํ•œ๋‹ค. (๊ฐœ๋ฐœ์ž๊ฐ€ print ์ฐ์–ด์„œ ๋น„๊ตํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ ์„ฑ๊ณต/์‹คํŒจ ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ) Timely : ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. (TDD์ผ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น) Given-When-T..
Spring Security Architecture(1~5) + Form Login + Servlet Authenticaion Architecture(1~3) ํ•ด์„ https://docs.spring.io/spring-security/reference/servlet/architecture.html Architecture :: Spring SecuritySpring Security’s Servlet support is based on Servlet Filters, so it is helpful to look at the role of Filters generally first. The following image shows the typical layering of the handlers for a single HTTP request. The client sends a request to the apdocs.spring.io์ถœ์ฒ˜ : ์Šคํ”„๋ง ๊ณต์‹๋ฌธ์„œ 6.0.1 ๋ฒ„์ „ ์ œ..
๊ฒŒ์‹œํŒ์˜ ๋Œ“๊ธ€์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒŒ์‹œ๋ฌผ์„ ๋Œ“๊ธ€ ์‚ญ์ œ ์—†์ด ๊ฒŒ์‹œ๋ฌผ๋งŒ ์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ์™ธ Referential integrity constraint violation : 1) JPA ๋ถ€๋ชจ(๊ฒŒ์‹œ๋ฌผ) -> ์ž์‹(๋Œ“๊ธ€) ๊ด€๊ณ„๋กœ DB๊ฐ€ ์„ค์ •๋˜์–ด์žˆ์„ ๋•Œ, ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์šธ ๋•Œ ๋‚จ๊ฒจ์ง€๋Š” ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ณ ์•„ ๊ฐ์ฒด๋กœ ๋ณธ๋‹ค. ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘˜ ๊ฒฝ์šฐ Referential integrity constraint violation SQL ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๊ณ ์•„ ๊ฐ์ฒด ์ œ๊ฑฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. @OneToMany(mappedBy = "post", orphanRemoval = true) private List commentList = new ArrayList(); ์ถœ์ฒ˜ : ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ ์•„ ๊ฐ์ฒด ์ œ๊ฑฐ๋Š” ์ฐธ์กฐ๊ฐ€ ์ œ๊ฑฐ๋œ ์—”ํ‹ฐํ‹ฐ๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ณ ์•„ ๊ฐ์ฒด๋กœ ๋ณด๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ์—๋งŒ..
๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ(Primary, Replica) ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ DB๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ : ํšŒ์›์ •๋ณด, ์„œ๋น„์Šค ์ด์šฉ์ •๋ณด ๋“ฑ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฆฌ์†Œ์Šค -> DB์˜ ํ›ผ์† ๊ฐ€๋Šฅ์„ฑ : DB๊ฐ€ ์žˆ๋Š” ํ•˜๋“œ๋””์Šคํฌ์˜ ์†์ƒ ๋“ฑ ~ ์ผ๋ฐ˜์ ์œผ๋กœ 2๋Œ€ ์ด์ƒ์„ ์šด์šฉํ•˜๊ณ  ์ด๋ฅผ ๋™๊ธฐํ™”ํ•œ๋‹ค. ๋™๊ธฐํ™” ๋ฐฉ๋ฒ• : ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ DB์™€ ์“ฐ๊ธฐ ์ „์šฉ DB๋กœ ๋‚˜๋ˆ„๊ณ  ์“ฐ๊ธฐ ์ „์šฉ DB๋Š” ํ•˜๋‚˜, ์ฝ๊ธฐ ์ „์šฉ DB๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๊ณ  ์“ฐ๊ธฐ DB๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. -> Primary/Replica ๋ฐฉ์‹ Primary : ์“ฐ๊ธฐ ์ „์šฉ == @Transactional(readOnly = false) ~ readOnly ๊ธฐ๋ณธ๊ฐ’์€ false Replica : ์ฝ๊ธฐ ์ „์šฉ == @Transactional(readOnly = true) ์ „์ œ์กฐ๊ฑด : ์Šคํ”„๋ง์— Primary DB endpoint, Replic..
Spring Transaction ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ @Transactional
Spring Exception ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Http ์ƒํƒœ์ฝ”๋“œ๋„ Http ์‘๋‹ต ํ—ค๋” ์ฒซ ์ค„์— ์ถ”๊ฐ€๋˜์–ด ๋ฐ˜ํ™˜๋˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. https://ryanclaire.blogspot.com/2020/10/HTTP-Overview.html HTTP ํ”„๋กœํ† ์ฝœ ๊ตฌ์กฐ ๊ฐœ์š”์™€ ์˜ˆ์ œ HTTP ํ”„๋กœํ† ์ฝœ ๊ตฌ์กฐ ๊ฐœ์š”์™€ ์˜ˆ์ œ ryanclaire.blogspot.com ์ฃผ์š” ์‘๋‹ต์ƒํƒœ์ฝ”๋“œ ์ข…๋ฅ˜ 200๋ฒˆ๋Œ€ : ์„ฑ๊ณต 400๋ฒˆ๋Œ€ : ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ, ์ž˜๋ชป๋œ ์š”์ฒญ 500๋ฒˆ๋Œ€ : ์„œ๋ฒ„ ์—๋Ÿฌ, ์š”์ฒญ์€ ์ •ํ™•ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์—๋Ÿฌ๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ์ฝ”๋“œ ์ •๋ณด enum ํด๋ž˜์Šค public enum HttpStatus { // 1xx Informational CONTINUE(100, Series.INFORMATIONAL, "Continue"), // ....
Spring AOP ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Aspect Oriented Programming : ๊ด€์ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ AOP ๊ฐœ๋… ์ดํ•ด '๋‚˜๋งŒ์˜ ์…€๋ ‰์ƒต' ์— ์Šคํ”„๋ง AOP ์ ์šฉ Top5 ํšŒ์› ์ฐพ๊ธฐ ์ค‘๋ณต ํด๋”๋ช… ์ €์žฅ ์‹œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์Šคํ”„๋ง ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ„ ~ ๋ชจ๋“  API์— ์š”์ฒญ, ์‘๋‹ตํ•œ ์‹œ๊ฐ„์˜ ํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ 5์ธ ์„ ๋ฐœ ์Šคํฌ๋ž˜์น˜ ํŒŒ์ผ์„ ์ด์šฉํ•œ ์„œ๋ฒ„ ์‚ฌ์šฉ์‹œ๊ฐ„ ์ธก์ • + ์Šคํฌ๋ž˜์น˜ ํŒŒ์ผ์€ ๋ณ„๋„๋กœ ์ €์žฅ๋˜๋Š” ์ž„์‹œํŒŒ์ผ, ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ์—†๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๋‹ค class Scratch { public static void main(String[] args) { // ์ธก์ • ์‹œ์ž‘ ์‹œ๊ฐ„ long startTime = System.currentTimeMillis(); // ํ•จ์ˆ˜ ์ˆ˜ํ–‰ long output = sumFromOneT..
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ : ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์›์ธํŒŒ์•…์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ• ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค 1. ๊ฐœ๋ฐœ 2. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ : ๊ฐœ๋ฐœ์ž ํ…Œ์ŠคํŠธ 3. QA Testing : - ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŒ… : ์‚ฌ์šฉ์ž ๊ด€์  ํ…Œ์ŠคํŠธ 4. Production(๋ฐฐํฌ) TDD๋ž€? Test-Driven Development์˜ ์•ฝ์ž๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ›„ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ ~ ์„ค๊ณ„ - ํ…Œ์ŠคํŠธ - ๊ฐœ๋ฐœ ์ˆœ์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฐฉ๋ฒ•๋ก  : Given - When - Then ~ ์ค€๋น„ - ์‹คํ–‰ - ๊ฒ€์ฆ ํŒจํ„ด package com.sparta.myselectshop.entity; import com.sparta.myselectshop.dto.Product..

728x90