[๐Ÿ“˜์Šคํ”„๋ง5] 9. ์Šคํ”„๋ง MVC ์‹œ์ž‘ํ•˜๊ธฐ & 10. ์Šคํ”„๋ง MVC ํ”„๋ ˆ์ž„์›Œํฌ ๋™์ž‘ ๋ฐฉ์‹

์‘ค๋ฐยท2023๋…„ 3์›” 24์ผ

๊ธฐ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
7/10

Chapter 9. ์Šคํ”„๋ง MVC ์‹œ์ž‘ํ•˜๊ธฐ

์ด ์žฅ์€ ์Šคํ”„๋ง์—์„œ ์Šคํ”„๋ง MVC๋กœ ๋„˜์–ด๊ฐ€๋Š” ์žฅ์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์Šคํ”„๋ง์˜ ๊ธฐ์ดˆ์™€ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ์— DB ์—ฐ๋™ํ•˜๊ธฐ ๋“ฑ์˜ ๋‚ด์šฉ์„ ๋ฐฐ์› ๋‹ค๋ฉด ์ด์ œ๋Š” ์Šคํ”„๋ง์ด ์ง€์›ํ•˜๋Š” ์›น MVC ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ์›น ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. build.gradle์— ์˜์กด์„ค์ •์„ ํ•ด์ฃผ๊ณ  ์„œ๋ฒ„๋„ ์„ค์น˜ํ•˜๊ณ  ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ณ  web.xmlํŒŒ์ผ ์ž‘์„ฑํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ์ด๋ž‘ ํ™”๋ฉด์— ๋ณด์ผ jsp ํŒŒ์ผ๊นŒ์ง€ ์ž‘์„ฑํ•ด์ค€๋‹ค. ๊ทธ๋‹ค์Œ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ ์ ˆํ•œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด jspํŒŒ์ผ์— ์ž‘์„ฑํ•œ ๋Œ€๋กœ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค.

๊ทธ.๋Ÿฌ.๋‚˜. ์ฑ…์—์„œ ํ•˜๋ผ๋Š” ๋Œ€๋กœ ํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ๋™์ž‘์‹œํ‚ค๊ณ  ํ•ด๋‹น URL๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด 404 NOT FOUND๊ฐ€ ๋œฌ๋‹ค. ์™ค๊นŒ..?

์ผ๋‹จ ์ฑ…์—์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ eclipse๊ณ  ๋‚˜๋Š” VSCode์˜€๋‹ค. IDE๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๊ฒŒ ์‹œ์ž‘์ด์—ˆ๊ณ , java ๋ฒ„์ „๋„ ๋‹ค๋ฅด๊ฒŒ ์“ฐ๊ณ  ์žˆ๊ณ , gradle ๋ฒ„์ „, tomcat ๋ฒ„์ „, ....... ๊ทธ๋ƒฅ ๋˜‘๊ฐ™์ด ํ•˜๋Š” ๊ฒŒ ๊ฑฐ์˜ ์—†์„ ์ •๋„๋กœ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ž๋‹ค. ์ด ๋ง์€ ์–ด๋–ค ๊ฒƒ์ด ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ์–˜๊ธฐ์˜€๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ์šธ๋ฉด์„œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ–ˆ๋‹ค.

์ฑ…์—์„œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๊ณ  ์‹คํ–‰ํ•œ ํ›„ ์›น ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— localhost:8080/ํ”„๋กœ์ ํŠธ ํด๋”๋ช…/hello?name=์ด๋ฆ„ ์ด๋Ÿฐ URL๋กœ ์ ‘์†ํ•˜๋ฉด

์ด๋Ÿฐ ํ™”๋ฉด์ด ๋œฐ ๊ฑฐ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ.... ๋ถ„๋ช… ๊ทธ๋žฌ๋Š”๋ฐ........... ์—ญ์‹œ๋‚˜ ์•ˆ ๋–ด๋‹ค. ์ด์ œ ํ•œ ๋ฒˆ์— ๋˜๋ฉด ์ด์ƒํ•  ์ง€๊ฒฝ์ด๋‹ค. ํ™”๋ฉด์— ๋ญ๋ผ๊ณ  ๋–ด๋Š”์ง€ ๋ณด์ž.

๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๋œฌ๋‹ค. ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์™œ ํ•˜๋ผ๋Š” ๋Œ€๋กœ ํ–ˆ๋Š”๋ฐ ์•ˆ ๋ ๊นŒ...

์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค[/app/hello]์€(๋Š”) ๊ฐ€์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋˜ ๊ตฌ๊ธ€๋ง ํ•ด๋ดค๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์„œ๋ฒ„ ์„ค์ •์—์„œ CLASSPATH๋ฅผ ์ž˜๋ชป ์žก์•„์คฌ์„ ๋•Œ ๋‚˜์˜จ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๊ฑธ ํ•ด๊ฒฐํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ „๋ถ€๋‹ค eclipse๋ฅผ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚˜๊ฐ™์ด VSCode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์—ˆ๋‹ค.. VSCode๋กœ Spring Boot ๋ง๊ณ  Spring MVC๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ ์‚ฌ๋žŒ์€ ์—†๋Š” ๊ฑธ๊นŒ....? ๋” ์ด์ƒ VSCode๋กœ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์–ด ๋ณด์˜€๋‹ค.. ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ eclipse๋กœ ๊ฐˆ์•„ํƒ€๊ธฐ๋กœ ํ–ˆ๋‹ค. ์„œ๋ฒ„ ์„ค์ • ์˜ค๋ฅ˜์ธ๋ฐ ๊ตฌ๊ธ€๋งํ•ด๋„ ๋‚˜์˜ค์ง€ ์•Š๋Š” VSCode์—์„œ ์„œ๋ฒ„ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์•˜๋‹ค. (์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.. ์ €๋Š” ๋ชป ์ฐพ์•˜์–ด์š”....)

๊ทผ๋ฐ eclipse๋กœ ํ•ด๋ดค๋Š”๋ฐ๋„ 404๊ฐ€ ๋–ด๋‹ค...ใ…‹ ๋ธŒ๋ผ์šฐ์ €์— ๋‚˜์˜ค๋Š” ๋‚ด์šฉ์€ ๋˜‘๊ฐ™์•˜๋Š”๋ฐ ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ์ฝ˜์†” ์ฐฝ์— ์˜ค๋ฅ˜๊ฐ€ ๋–ด๋‹ค.

์‹ฌ๊ฐ: ํ•„ํ„ฐ [encodingFilter]๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
java.lang.ClassCastException: class org.springframework.web.filter.CharacterEncodingFilter cannot be cast to class jakarta.servlet.Filter

์—ฌ๊ธฐ์„œ encodingFilter๋Š” ๋‚ด๊ฐ€ web.xml์—์„œ ์„ค์ •ํ•œ ํ•„ํ„ฐ ์ด๋ฆ„์ด๋‹ค. org.springframework.web.filter.CharacterEncodingFilter๊ฐ€ jakarta.servlet.Filter๋กœ cast ๋  ์ˆ˜ ์—†๋‹จ๋‹ค. ๋˜ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค๋‹ค.

java.lang.ClassCaseException๋Š” ํ•ด๋‹น class๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค. ์–ด๋–ค ๋ธ”๋กœ๊ทธ(๋ฐ‘์— ์ถœ์ฒ˜ ์žˆ์Œ)์—์„œ๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์œผ๋กœ

  1. ํ”„๋กœ์ ํŠธ properties์— Deployment Assembly์— Java Build Path๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
    (gradle๋กœ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•œ Project and External Dependencies๋ฅผ tomcat ์„œ๋ฒ„ ๊ตฌ๋™ ์‹œ WEB-INF/lib๋กœ ๋Œ€์‘์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋“ฏํ•˜๋‹ค)
  2. web.xml ํŒŒ์ผ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ํ•„ํ„ฐ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํด๋ž˜์Šค ์ฃผ์†Œ๋ฅผ org.apache.catalina.filters.SetCharacterEncodingFilter๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๋‘ ๊ฐ€์ง€๋ฅผ ์ œ์‹œํ–ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ๋Š” ๋ณ„ ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๊ณ , ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ๋”๋‹ˆ ์˜ค๋ฅ˜ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค.

java.lang.ClassCastException: class org.springframework.web.servlet.DispatcherServlet cannot be cast to class jakarta.servlet.Servlet

์ด๋ฒˆ์—” dispatcher๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ ์„œ๋ธ”๋ฆฟ์ด cast ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์„œ dispatcher๋Š” ๋‚ด๊ฐ€ web.xml์—์„œ ์„ค์ •ํ•œ ์„œ๋ธ”๋ฆฟ ์ด๋ฆ„์ด๋‹ค. ์ด๋ฒˆ์—๋„ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ดค๋‹ค. jakarta.servlet.Servlet ์ด๋†ˆ์ด ๋ญ”๊ฐ€ ์ˆ˜์ƒํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ ์ง€๊ธˆ ๋‚ด๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” tomcat ๋ฒ„์ „์ด 10์ด์—ˆ๊ณ  9์™€ 10์€ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉฐ 9๊นŒ์ง€๋Š” API ๊ตฌํ˜„์ฒด๊ฐ€ JavaEE(javax.)์ด๊ณ  10๋ถ€ํ„ฐ๋Š” JakartaEE(jakarta.)๋ž€๋‹ค. ์ฆ‰, ๋‚ด๊ฐ€ ์ง€๊ธˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” API ๋ฐฉ์‹์€ JavaEE์ธ๋ฐ ์„œ๋ฒ„๋Š” jakartaEE ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋™์ด ์•ˆ ๋๋˜ ๊ฒƒ์ด์—ˆ๋‹ค. Homebrew๋กœ tomcat์„ ์„ค์น˜ํ•  ๋•Œ ๋ฒ„์ „๋ณ„๋กœ ํฐ ์ฐจ์ด๊ฐ€ ์—†๋Š” ์ค„ ์•Œ๊ณ  ๊ฐ€์žฅ ์ตœ์‹ ์˜ tomcat ๋ฒ„์ „์„ ์„ค์น˜ํ•œ ํƒ“์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ tomcat9๋ฅผ ๋‹ค์‹œ ๊น”๊ณ  tomcat9์— ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ฌ๋ฆฌ๋‹ˆ๊นŒ ์ž˜ ๊ตฌ๋™๋๋‹ค. ์œ„์˜ ํ•„ํ„ฐ๋„ ์‚ฌ์‹ค์€ tomcat์˜ ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฒฐ๊ตญ... ๋˜ ๋ฒ„์ „ ๋ฌธ์ œ์˜€๋‹ค. ๋ฒ„์ „๋ณ„ ์‚ฌ์–‘์ด๋‚˜ ์ฃผ์˜์ ์„ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ตํ›ˆ์„ ๋˜ ์–ป์—ˆ๋‹ค.

Chapter10. ์Šคํ”„๋ง MVC ํ”„๋ ˆ์ž„์›Œํฌ ๋™์ž‘ ๋ฐฉ์‹

์ด ์žฅ์€ 9์žฅ์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋กœ ์Šคํ”„๋ง MVC ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•œ ์žฅ์ด๋‹ค. ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ์—†์—ˆ๊ณ , ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ฉด์„œ ์ฝ๊ณ  ์ง€๋‚˜๊ฐ”๋‹ค.

Chapter9, 10์„ ๋งˆ์น˜๋ฉฐ..

์ด๋ฒˆ ์žฅ์€ ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์•˜๋˜ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ง„ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ์ค„ ์•Œ๊ณ  ๊ทธ๋ƒฅ Spring Boot๋กœ ๋„˜์–ด๊ฐˆ๊นŒ ์ˆ˜์ฒœ ๋ฒˆ ๊ณ ๋ฏผํ–ˆ๊ณ , ์‹ค์ œ๋กœ ์–ด์ œ๊นŒ์ง€๋งŒ ํ•ด๋„ ๊ทธ๋ƒฅ Spring Boot๋กœ ๋„˜์–ด๊ฐ€์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ž˜๋„ ๋๊นŒ์ง€ ์•ˆ ํ•ด๋ณด๋ฉด ์†์ด ์‹œ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด๋ณด์ž ํ•˜๊ณ  ๋„์ „ํ–ˆ๋‹ค. VSCode๋กœ ํ•ด๊ฒฐํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ ์ฐ์ฐํ•จ์ด ์กฐ๊ธˆ ๋‚จ๊ธด ํ–ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ด๊ฒŒ ์–ด๋””๋ƒ ์‹ถ๋‹ค. ์–ด์ฐจํ”ผ ์ฑ…์—์„œ๋„ eclipse๋กœ ํ–ˆ์œผ๋‹ˆ VSCode๋Š” ๋ชป ํ•˜๋Š” ๊ฒŒ ๋‹น์—ฐํ•œ๊ฐ€ ์‹ถ๊ธฐ๋„ ํ•˜๊ณ , VSCode๋กœ ์„œ๋ฒ„ ์—ฐ๋™ํ•˜๋Š” ๊ฑด ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฑด๊ฐ€ ์‹ถ๊ธฐ๋„ ํ•˜๊ณ ... ์–ด์จŒ๋“ ๊ฐ„ ์˜ˆ์ œ ์ฝ”๋“œ๋Œ€๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ์˜์˜๋ฅผ ๋‘๊ณ  ์ด๋ฒˆ ์žฅ์€ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ๋‹ค. (๊ทผ๋ฐ ์™œ VSCode๋กœ๋Š” ํ•ด๊ฒฐ์ด ์•ˆ๋˜๋Š”๊ฑธ๊นŒ.. ์•„์ง๋„ ๊ถ๊ธˆํ•˜๋‹ค. Deployment Assembly์— Java Build Path๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์–ด์„œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ..? ํ˜น์‹œ๋‚˜ ํ•ด์„œ tomcat9์— ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ฌ๋ ค๋ดค๋Š”๋ฐ ์—ญ์‹œ๋‚˜ ์•ˆ๋œ๋‹ค.. ์™ค๊นŒ.. ๋„ˆ๋ฌด ์•Œ๊ณ ์‹ถ๋‹ค...)

P.S. VSCode์˜ ์ฝ”๋“œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์€ ๋†“์น  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ ์ž‘์„ฑ์€ VSCode๋กœ, ์„œ๋ฒ„์— ์˜ฌ๋ ค์„œ ๊ตฌ๋™ํ•˜๋Š” ๊ฒƒ์€ eclipse๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. ์˜ˆ์ „์—๋Š” eclipse๋„ ์ž˜๋งŒ ์ผ๋Š”๋ฐ VSCode๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋„ˆ๋ฌด ๋ถˆํŽธํ•˜๋‹ค.. ์˜›๋‚ ์—๋Š” ์–ด๋–ป๊ฒŒ ์ผ์—ˆ์„๊นŒ...?

[์ถœ์ฒ˜]

java.lang.ClassCastException: class org.springframework.web.filter.CharacterEncodingFilter ํ•ด๊ฒฐ๋ฐฉ๋ฒ•- https://jeaha.dev/73
cannot be cast to jakarta.servlet.Servlet ํ•ด๊ฒฐ๋ฐฉ๋ฒ• - https://velog.io/@softpeter/cannot-be-cast-to-jakarta.servlet.Servlet-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95
tomcat 9/10 ๋ฒ„์ „๋ณ„ ์ฐจ์ด - https://blog.itcode.dev/posts/2022/02/12/tomcat-9-and-10

profile
๊ฐœ๋ฐœ์ž์ง€๋ง์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€