[Spring] ์Šคํ”„๋ง๋ถ€ํŠธ 3, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 6, ๋กœ๊ทธ์ธ ์„ธ์…˜ ์œ ์ง€, ๋กœ๊ทธ์ธ ํ’€๋ฆผ

[Spring] ์Šคํ”„๋ง๋ถ€ํŠธ 3, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 6, ๋กœ๊ทธ์ธ ์„ธ์…˜ ์œ ์ง€, ๋กœ๊ทธ์ธ ํ’€๋ฆผ

1. ๋ฌธ์ œ ์ƒํ™ฉ ์Šคํ”„๋ง ๋ถ€ํŠธ 3, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 6 ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉฐ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ WebSecurityConfigurerAdapter๋ฅผ ๋” ์ด์ƒ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ์— ๊ธฐ์กด์˜ WebSecurityConfigurerAdapter๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธํ™” ์‹œ์ผœ์„œ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. SecurityFilterChain์œผ๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ๊ตฌํ˜„ ์ค‘ (antMacher -> requestMacher, dispatcherTypeMatcher์„ค์ • ๋“ฑ ๊ธฐ๋ณธ Spring Security6.0 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋Š” ์ ์šฉ ์™„๋ฃŒ ) SecurityContext์— ๋กœ๊ทธ์ธ ์‹œ๋„ ์‹œ ์ •์ƒ์ ์œผ๋กœ ์ธ์ฆ์ •๋ณด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ์žˆ์œผ๋‚˜, ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์ธ์ฆ์ •๋ณด๊ฐ€ ์—†์–ด์ง€๋Š” ํ˜„์ƒ ๋ฐœ์ƒ 2. ํ•ด๊ฒฐ SecurityContextPersistenceFilter SecurityContext์˜ ์˜์†์„ฑ์„ ์ปจํŠธ๋กคํ•˜๋Š” SecurityContextPersistenceFilter์˜ ์„ค์ •์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์—ˆ๋‹ค.ย ...

[Spring] ์Šคํ”„๋ง๋ถ€ํŠธ 3 jstl ์ ์šฉ(maven), (์ ˆ๋Œ€ URI์ธ [http://java.sun.com/jsp/jstl/core]์„(๋ฅผ), web.xmlย ๋˜๋Š” ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ๋ฐฐ์น˜๋œ JAR ํŒŒ์ผ ๋‚ด์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

1. ๋ฌธ์ œ ์ƒํ™ฉ ์Šคํ”„๋ง๋ถ€ํŠธ 3 ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ์ค‘ jstl URI / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ํ˜„์ƒ ๋ฐœ์ƒ http://java.sun.com/jsp/jstl/core]์„(๋ฅผ), web.xmlย ๋˜๋Š” ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ๋ฐฐ์น˜๋œ JAR ํŒŒ์ผ ๋‚ด์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 2. ํ•ด๊ฒฐ ํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์ผํ•˜๊ฒŒ javax -> jakarta ๊ธฐ๋ฐ˜ jstl maven dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.el</groupId> <artifactId>jakarta.el-api</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.1</version> </dependency> ...

[Spring] Java 21 ๋กฌ๋ณต(lombok) ๋ฒ„์ „ ์„ค์ • (java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid')

1. ๋ฌธ์ œ ์ƒํ™ฉ JDK21 ๋ฒ„์ „ ์—… ์ค‘ย java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid' ๋ผ๋Š” ์—๋Ÿฌ์™€ ํ•จ๊ป˜ ๋นŒ๋“œ ์‹คํŒจ 2. ํ•ด๊ฒฐ JDK21๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋กฌ๋ณต(lombok) ๋ฒ„์ „ ๋ฌธ์ œ๋กœ ํ™•์ธ, (JDK21๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ตœ์†Œ ๋กฌ๋ณต(lombok) ๋ฒ„์ „์€ 1.18.30์ด๋‹ค.) <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> ๊ธฐ์กด ์‚ฌ์šฉ ์ค‘์ธ ๊ตฌ๋ฒ„์ „ ๋กฌ๋ณต(lombok)์„ ์ž‘์„ฑ์ผ ๊ธฐ์ค€ ์ตœ์‹ ๋ฒ„์ „์ด์ž JDK21 ํ˜ธํ™˜ ์ตœ์†Œ ๋ฒ„์ „์ธ 1.18.30์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋นŒ๋“œ๊ฐ€ ๋œ๋‹ค. ...

[Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Streams)์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

[Java] ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Streams)์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Streams)์ด๋ž€? ๊ธฐ์กด์˜ ๋ฐฐ์—ด ๋˜๋Š” ์ปฌ๋ ‰์…˜ ์ธ์Šคํ„ด์Šค๋Š” for, foreach ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ํ•˜๋‚˜์”ฉ ํ•ธ๋“ค๋งํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๊ธฐ์— ๋กœ์ง์ด ๋ณต์žกํ• ์ˆ˜๋ก ์ฝ”๋“œ์–‘๋„ ๋งŽ์•„์ง€๊ณ  ๋ฃจํ”„๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋„๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ์— ๋น„ํ•ด ์ž๋ฐ” 8์—์„œ ์ถ”๊ฐ€๋œ ์ŠคํŠธ๋ฆผ(Streams)์€ ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ŠคํŠธ๋ฆผ์€ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด๋ผ๋Š” ๋œป์œผ๋กœ ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œํŒจํ„ด์ด๋‹ค. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ๊ด€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•œ ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค. ๋ฐฐ์—ด/์ปฌ๋ ‰์…˜์˜ ํ•จ์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•„ํ„ฐ๋ง, ๊ฐ€๊ณต๋œ ๊ฒฐ๊ณผ ์ถ”์ถœ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋žŒ๋‹ค์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋‘˜ ์ด์ƒ ์ž‘์—…์œผ๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐœ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŽ์€ ์š”์†Œ๋“ค์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ๋‹ค.ย ์ปฌ๋ ‰์…˜์€ ํ˜„์žฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ๋ฐ ๋น„ํ•ด, ์ŠคํŠธ๋ฆผ์€ ์š”์ฒญํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณ ์ •๋œ ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์ŠคํŠธ๋ฆผ์— ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ...

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] 3. private ์ƒ์„ฑ์ž๋‚˜ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์žฅํ•˜๋ผ

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] 3. private ์ƒ์„ฑ์ž๋‚˜ ์—ด๊ฑฐ ํƒ€์ž…์œผ๋กœ ์‹ฑ๊ธ€ํ„ด์ž„์„ ๋ณด์žฅํ•˜๋ผ

์‹ฑ๊ธ€ํ„ด์ด๋ž€ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋กœ, ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ฌด์ƒํƒœ (stateless) ๊ฐ์ฒด๋‚˜ ์„ค๊ณ„์ƒ ์œ ์ผํ•ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ, ํ˜น์€ ์ต์ˆ™ํ•œ ์Šคํ”„๋ง ๋นˆ์ด ๋Œ€ํ‘œ์ ์ธ ์‹ฑ๊ธ€ํ„ด์˜ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‹ฑ๊ธ€ํ„ด์œผ๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ, (ํƒ€์ž…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•œ ํ›„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๋งŒ๋“  ์‹ฑ๊ธ€ํ„ด์ด ์•„๋‹ˆ๋ผ๋ฉด) ์‹ฑ๊ธ€ํ„ด ์ธ์Šคํ„ด์Šค๋ฅผ Mock์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๊ธฐ์— ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์‹ฑ๊ธ€ํ„ด์„ ๋งŒ๋“œ๋Š” ๋ณดํŽธ์ ์ธ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ, ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘์ƒ์„ฑ์ž๋Š” private์œผ๋กœ ๊ฐ์ถฐ๋‘๊ณ  ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์œผ๋กœ public static ๋ฉค๋ฒ„๋ฅผ ํ•˜๋‚˜ ๋งˆ๋ จํ•ด ๋‘”๋‹ค. ...