๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SpringMVCStudy/๋ฉ”๋ชจ

SpringMVCStudy ๋ฉ”๋ชจ

by ๋‹‰๋„ค์ž„์—†๋Š” ๋‹‰๋„ค์ž„ 2024. 2. 8.
TOP

๋ชฉ์ฐจ

    โ–ถ SpringMVC Study

    1. Spring MVC.txt

    ๋”๋ณด๊ธฐ
    โ– โ– โ–  Spring MVC โ– โ– โ– 

    1. ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ MVC ํŒจํ„ด์ด ์ ์šฉ๋œ Spring Framework.
       Spring ์—์„œ๋Š” DispatcherServlet ํด๋ž˜์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

    2. Spring MVC ์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ
    - DispatcherServlet
    - HandlerMapping
    - Controller : ์‚ฌ์šฉ์ž ์ •์˜ Controller. ์•ก์…˜ ์ฒ˜๋ฆฌ. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑ
    - ModelAndView
    - ViewResolver 
    - view : ๊ฒฐ๊ณผ ์ถœ๋ ฅ. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑ.
    - web.xml : DispatcherServlet ๊ฐ์ฒด ๋“ฑ๋ก. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑ
    - dispatcher-servlet.xml : Controller ๊ฐ์ฒด ๋“ฑ๋ก. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑ.

    3. Spring MVC ์‹คํ–‰ ํ๋ฆ„
    - ์‚ฌ์šฉ์ž ์š”์ฒญ → DispatcherServlet
    - DispatcherServlet → HandlerMapping ์— ์ฃผ์†Œ ๋ถ„์„ ์š”์ฒญ
    - DispatcherServlet → ํŠน์ • Controller ๊ฐ์ฒด ํ˜ธ์ถœ ๋ฐ ๊ฒฐ๊ณผ ์ˆ˜์‹ 
           ๊ฒฐ๊ณผ๋Š” ModelAndView ๊ฐ์ฒด
    โ€ป ModelAndView ๊ฐ์ฒด
        : View ๊ฐ์ฒด ์ •๋ณด์™€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด.

    - DispatcherServlet → ViewResolver ์— View ๊ฐ์ฒด ๋ถ„์„ ์š”์ฒญ
    - Dispatcherservelt → ํŠน์ • View ๊ฐ์ฒด์— Model ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ 
           ๊ฒฐ๊ณผ ์ถœ๋ ฅ.

    4. Spring MVC ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ

    - Controller
      ์•ก์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Controller ํด๋ž˜์Šค ์ž‘์„ฑ.
      Annotation ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Controller ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ž‘์„ฑ

    - View
      ๊ฒฐ๊ณผ ์ถœ๋ ฅ์šฉ JSP ํŽ˜์ด์ง€ ์ž‘์„ฑ.

    - web.xml
      ์„œ๋ธ”๋ฆฟ ์ฃผ์†Œ์™€ DispatcherServlet ํด๋ž˜์Šค ๋“ฑ๋ก

    - dispathcer-servlet.xml
      ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ Controller ๊ฐ์ฒด ๋“ฑ๋ก
      URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก

    - ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—…๋ฌด ๋กœ์ง ์ ์šฉ ๋ฐ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ 
              Model ๊ด€๋ จ ๊ณ„์ธต ์„œ๋น„์Šค ๊ตฌ์„ฑ
       ·Connection 
       ·DTO
       ·DAO
          :

    โ€ป Spring ์ด ์ŠคํŠธ๋Ÿฟ์ธ ๋ฅผ ๋น„๋กฏํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์™€
       ๋น„๊ต์  ์—ฐ๋™์ด ์ž˜ ๋˜๋Š” ํŽธ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ
       ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
       ์„ค์ •์˜ ์ค‘๋ณต ๋“ฑ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํŽธํ•จ์ด ์กด์žฌํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. 
       ๋”ฐ๋ผ์„œ Spring ์ด ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” MVC ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด
       Spring ์ด ์ œ๊ณตํ•˜๋Š” AOP, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ, IoC / DI ๋“ฑ์˜ ๊ธฐ๋Šฅ์„
       ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ MVC ํŒจํ„ด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.
       ๋˜ํ•œ, ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ Spring ์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ
       ์„ค์ •์„ ์ค‘๋ณตํ•ด์„œ ์ ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜.. ํ•˜๋Š” ๊ฐœ๋ฐœ๊ณผ์ •์—์„œ ๋‚˜ํƒ€๋‚˜๋Š”
       ๋ถˆํŽธ์„ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

    ----------------------------------------------------------------------------------
    โ– โ– โ–  Spring MVC ํ”„๋กœ์ ํŠธ ์‹ค์Šต 01 โ– โ– โ– 

    โ—‹ Perspective
       : JavaEE

    โ—‹ ๋‹ค์ด๋‚˜๋ฏน ์›น ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (๋น„STS ๋ฒ„์ „)
       : Mvc01

    โ—‹ ํ†ฐ์บฃ ์„œ๋ฒ„ ๋“ฑ๋ก ๋ฐ ํฌํŠธ(port) ์„ค์ • (์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ ์ ์šฉ ์ด์ „)
       : port 3306 / URIEncoding="UTF-8"

    โ—‹ ๊ธฐํƒ€ ํ™˜๊ฒฝ ์„ค์ •
       : ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ค์ •์€ ใ€Žweb_standard.epfใ€๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ
         (ํฐํŠธ, ์ค„๋ฒˆํ˜ธ, ํŽธ์ง‘ํฌ๋งท, ์ธ์ฝ”๋”ฉ๋ฐฉ์‹, ํ…œํ”Œ๋ฆฟ ๋“ฑ...)

    โ—‹ Spring MVC ํ™˜๊ฒฝ ์„ค์ •์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋ก
       : WebContent > WEB-INF > lib ๊ฒฝ๋กœ์— ๋“ฑ๋ก
         - ๊ฒฝ๋กœ 1 → C:\s-f-3.0.2-with-docs\dist
           ·ํŒŒ์ผ1 → org.springframework.aop-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ2 → org.springframework.asm-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ3 → org.springframework.beans-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ4 → org.springframework.context-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ5 → org.springframework.core-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ6 → org.springframework.expression-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ7 → org.springframework.jdbc-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ8 → org.springframework.transaction-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ9 → org.springframework.web.servlet-3.0.2.RELEASE.jar
           ·ํŒŒ์ผ10 → org.springframework.web-3.0.2.RELEASE.jar

         - ๊ฒฝ๋กœ2 → C:\s-f-3.0.2-dependencies\org.apache.commons\cohttp://m.springsource.org.apache.commons.logging\1.1.1
    ·ํŒŒ์ผ11 → cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar

         - ๊ฒฝ๋กœ3 → C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
            ·ํŒŒ์ผ12 → ojdbc6.jar
         - ๊ฒฝ๋กœ4 → C:\Downloads\12_JSTL\jakarta-taglibs-standard-1.1.2\lib
                    (JSTL ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ)
            ·ํŒŒ์ผ13 → jstl.jar
            ·ํŒŒ์ผ14 → standard.jar

    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ
        - HelloController.java
        - Hello.jsp
        - dispatcher-servlet.xml
        - web.xml
        - hello.action

        โ€ป ใ€Ždispatcher-servlet.xmlใ€ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ์„ค์ • ๋‚ด์šฉ(ํ…œํ”Œ๋ฆฟ)์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด
            ์Šคํ”„๋ง DOC ์˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
            · ๊ฒฝ๋กœ → C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf
            · ํŒŒ์ผ → spring-framework-reference.pdf 
            · ๋‚ด์šฉ(์œ„์น˜) → ํ•ด๋‹น pfd ๋ฌธ์„œ์˜ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ์ƒ 425 ํŽ˜์ด์ง€  
     ํŒŒ์ผ ๊ตฌ์กฐ์˜ ๋ฐ”๋กœ๊ฐ€๊ธฐ ์ธ๋ฑ์Šค ์ƒ 450/805 ํŽ˜์ด์ง€
            ·ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ฉด XML ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ(ํ…œํ”Œ๋ฆฟ) ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.
        ์ด ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ dispatcher-servlet.xml ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๋‚ด์šฉ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
        http://localhost:3306/Mvc01/hello.action


    โ€ป ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ Mvc01 ํ”„๋กœ์ ํŠธ์˜ ์‹คํ–‰ ๋ฐ ์ฒ˜๋ฆฌ ๊ณผ์ • ์ •๋ฆฌ

    โ‘  ์™ธ๋ถ€ ์š”์ฒญ
               http://localhost:3306/Mvc01/hello.action
       ===========================
    http://www.test.co.kr

      → web.xml ๊ด€์—ฌ
         (→ Front Controller ๋“ฑ๋ก → DispatcherServlet ๋“ฑ๋ก)

    โ‘ก DispatcherServlet ์š”์ฒญ ์ ‘์ˆ˜

       → web.xml → DispatcherServlet ๋“ฑ๋ก
          web.xml → URL ํŒจํ„ด ๋“ฑ๋ก

       → ์‚ฌ์šฉ์ž ์š”์ฒญ ๋ถ„์„ → ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ ์ง€์ •

    โ‘ข ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์˜ ํŠน์ • ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (์•ก์…˜์ฒ˜๋ฆฌ, ModelAndView ๊ฐ์ฒด ๋ฐ˜ํ™˜)

       → ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋งž๋Š” ์•ก์…˜ ์ฒ˜๋ฆฌ

       → ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ชจ๋ธ ๊ฐ์ฒด ์ค€๋น„

       → ๋ทฐ ์ •๋ณด (JSP ํŽ˜์ด์ง€ ์ •๋ณด) ๋ฐ˜ํ™˜

    โ€ป JSP ํŽ˜์ด์ง€ ์ •๋ณด
        - ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒฝ๋กœ ํฌํ•จ๋œ View ํŽ˜์ด์ง€์˜ ์ด๋ฆ„

    โ‘ฃ ๋ทฐ ํŽ˜์ด์ง€์—์„œ ์ตœ์ข… ์›น ํŽ˜์ด์ง€๋ฅผ ์ž‘์„ฑ

       → JSP ํŽ˜์ด์ง€ ๋‚ด์—์„œ ELL ์ด๋‚˜ JSTL ๋“ฑ์˜ ํ‘œ๊ธฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    โ‘ค ์‘๋‹ต ์™„๋ฃŒ~!!! 
    ----------------------------------------------------------------------------------

    โ– โ– โ–  Spring MVC ํ”„๋กœ์ ํŠธ ์‹ค์Šต 02 โ– โ– โ– 

    โ—‹ Perspective
       : JavaEE

    โ—‹ ๋‹ค์ด๋‚˜๋ฏน ์›น ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (๋น„STS ๋ฒ„์ „)
       : Mvc02

    โ—‹ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •
       :Mvc00 (์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ ๊ตฌ์„ฑํ•ด๋‘” ์ƒ˜ํ”Œ)๋กœ ๋ถ€ํ„ฐ
        src, WebContent ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ & ๋ฎ์–ด์“ฐ๊ธฐ

    โ—‹ ์‹ค์Šต ์„ฑ๊ฒฉ
       : ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๊ด€๋ จ ์‹ค์Šต (Spring MVC ํŒจํ„ด)

    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ
        - SendController.java  → ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด
        - Send.jsp → ๋ทฐ ๊ฐ์ฒด

        - ReceiveController.java → ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด
        - Receive.jsp → ๋ทฐ ๊ฐ์ฒด

        - web.xml → DispatcherServlet ๊ฐ์ฒด ๋“ฑ๋ก / URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก
        - dispatcher-servlet.xml → ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด ๋“ฑ๋ก / URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก

        - send.do → ์ดํด๋ฆฝ์Šค ์‹คํ–‰ ๊ณผ์ •์—์„œ ์š”์ฒญ์„ ์œ„ํ•œ ๋นˆ ํŒŒ์ผ

        
    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
        http://localhost:3306/Mvc02/send.do


    ----------------------------------------------------------------------------------

    โ– โ– โ–  Spring MVC ํ”„๋กœ์ ํŠธ ์‹ค์Šต 03 โ– โ– โ– 

    โ—‹ Perspective
       : JavaEE

    โ—‹ ๋‹ค์ด๋‚˜๋ฏน ์›น ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (๋น„STS ๋ฒ„์ „)
       : Mvc03

    โ—‹ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •
       :Mvc00 (์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ ๊ตฌ์„ฑํ•ด๋‘” ์ƒ˜ํ”Œ)๋กœ ๋ถ€ํ„ฐ
        src, WebContent ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ & ๋ฎ์–ด์“ฐ๊ธฐ

    โ—‹ ์‹ค์Šต ์„ฑ๊ฒฉ
       : ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๊ด€๋ จ ์‹ค์Šต (Spring MVC ํŒจํ„ด)
         JDBC ๋ชจ๋“ˆ ์ถ”๊ฐ€ ํ™œ์šฉ
         SimpleDriverDataSource ํด๋ž˜์Šค(๊ฐ์ฒด) ํ™œ์šฉ

    โ—‹ ๊ธฐ๋Šฅ ๊ตฌํ˜„
        : ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ
          ์ €์žฅ๋œ ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ ํ•ญ๋ชฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์ฝ์–ด ํ™”๋ฉด์— ๊ตฌ์„ฑ

    โ—‹ ์‚ฌ์ „ ์ž‘์—…
        - TBL_MEMBERLIST ํ…Œ์ด๋ธ” ์ƒ์„ฑ
        - MEMBERLISTSEQ ์ƒ์„ฑ
        - ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์กฐํšŒ

    โ—‹ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ (ํŽ˜์ด์ง€ํ™”๋ฉด ๊ตฌ์„ฑ)
       ์ด๋ฆ„ [ ] → <input type="text">
       ์ „ํ™” [ ]  → <input type="text">
         <ํšŒ์› ์ถ”๊ฐ€> → <button type="button">

       ์ „์ฒด ์ธ์› ์ˆ˜ : 2๋ช…   → <p>...</p>
       ------------------   → <table>...</table>
       ๋ฒˆํ˜ธ ์ด๋ฆ„ ์ „ํ™”๋ฒˆํ˜ธ
        1   ๋…ธ..  010..
        2   ๊น€..  010..
       ------------------



    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ
        - Mvc03_scott.sql  → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๊ฐ์ฒด ๊ตฌ์„ฑ ๋ฐ ์‹ค์Šต ๋ฐ์ดํ„ฐ ์ค€๋น„
        
        - MemberDTO.java  → ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋ฃŒํ˜• ํด๋ž˜์Šค (DTO ํ™œ์šฉ)

        - IMemberDAO.java  → ์ธํ„ฐํŽ˜์ด์Šค
        - MemberDAO.java  → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์…˜ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค 
     → Connection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
             (์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์ค€๋น„ ํ•„์š”)   

        - MemberListController.java  → ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
        ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ์•ก์…˜
           DAO ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…   
        (์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์ค€๋น„ ํ•„์š”) 

        - MemberList.jsp   → ํšŒ์› ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ์šฉ ๋ทฐ
         ํšŒ์› ๋ฐ์ดํ„ฐ ์ž…๋ ฅ(์ถ”๊ฐ€) ํผ ํ™”๋ฉด ๊ตฌ์„ฑ

        - MemberInsertController.java → ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ
                                         ํšŒ์› ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
         DAO ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…   
         (์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์ค€๋น„ ํ•„์š”)

        - web.xml   → DispatcherServlet ๊ฐ์ฒด ๋“ฑ๋ก 
         URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก

        - dispatcher-servlet.xml   → ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด ๋“ฑ๋ก 
         URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก
         SimpleDriverDataSource ๊ฐ์ฒด ๋“ฑ๋ก
         ์˜์กด ๊ฐ์ฒด ์ฃผ์ž… ์„ค์ •
         DAO ๊ฐ์ฒด ๋“ฑ๋ก

        - memberlist.do   → ์ดํด๋ฆฝ์Šค ์‹คํ–‰ ๊ณผ์ •์—์„œ ์š”์ฒญ์„ ์œ„ํ•œ ๋นˆ ํŒŒ์ผ

        
    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
        http://localhost:3306/Mvc03/memberlist.do


    ----------------------------------------------------------------------------------

    โ– โ– โ–  Spring MVC ํ”„๋กœ์ ํŠธ ์‹ค์Šต 04 โ– โ– โ– 

    โ—‹ Perspective
       : JavaEE

    โ—‹ ๋‹ค์ด๋‚˜๋ฏน ์›น ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (๋น„STS ๋ฒ„์ „)
       : Mvc04

    โ—‹ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •
       :Mvc00 (์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ ๊ตฌ์„ฑํ•ด๋‘” ์ƒ˜ํ”Œ)๋กœ ๋ถ€ํ„ฐ
        src, WebContent ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณต์‚ฌ & ๋ฎ์–ด์“ฐ๊ธฐ

    โ—‹ ์‹ค์Šต ์„ฑ๊ฒฉ
       : ์ง์› ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ (Spring MVC ํŒจํ„ด)
         JDBC ๋ชจ๋“ˆ ์ถ”๊ฐ€ ํ™œ์šฉ
         SimpleDriverDataSource ํด๋ž˜์Šค(๊ฐ์ฒด) ํ™œ์šฉ

    โ—‹ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (๋ฐ์ดํ„ฐ ๊ฐ ์œ ํ˜•๋ณ„ CRUD ์‹ค์Šต)
        - ์ง์› ์ •๋ณด ์ž…๋ ฅ, ์ถœ๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„.
        - ์ง€์—ญ ์ •๋ณด ์ž…๋ ฅ, ์ถœ๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„.
        - ๋ถ€์„œ ์ •๋ณด ์ž…๋ ฅ, ์ถœ๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„.
        - ์ง์œ„ ์ •๋ณด ์ž…๋ ฅ, ์ถœ๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„.
        - ๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„
          → ๊ด€๋ฆฌ์ž ๋ฐ ์ผ๋ฐ˜ ์ง์› ๋กœ๊ทธ์ธ ๊ตฌ๋ถ„.
        ==> Spring MVC, JSP/Servlet, Oracle, HTML/CSS/Javascript, AJAX
            , jQuery, EL, JSTL ํ‘œํ˜„ ๋“ฑ ์‚ฌ์šฉ.

    โ—‹ ์‚ฌ์ „ ์ž‘์—… → ํ…Œ์ด๋ธ” ๋ฐ ์‹œํ€€์Šค, ์ฃผ์š” ์ฟผ๋ฆฌ๋ฌธ, ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๋“ฑ ๊ตฌ์„ฑ
       - EMPLOYEE   ์ง์›
       - REGION     ์ง€์—ญ
       - DEAPRTMENT ๋ถ€์„œ
       - POSITION   ์ง์œ„
       - ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ...

    โ—‹ ์‚ฌ์ „ ์ž‘์—…
        - TBL_MEMBERLIST ํ…Œ์ด๋ธ” ์ƒ์„ฑ
        - MEMBERLISTSEQ ์ƒ์„ฑ
        - ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์กฐํšŒ

    โ—‹ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ (ํŽ˜์ด์ง€ํ™”๋ฉด ๊ตฌ์„ฑ)
       ์ด๋ฆ„ [ ] → <input type="text">
       ์ „ํ™” [ ]  → <input type="text">
         <ํšŒ์› ์ถ”๊ฐ€> → <button type="button">

       ์ „์ฒด ์ธ์› ์ˆ˜ : 2๋ช…   → <p>...</p>
       ------------------   → <table>...</table>
       ๋ฒˆํ˜ธ ์ด๋ฆ„ ์ „ํ™”๋ฒˆํ˜ธ
        1   ๋…ธ..  010..
        2   ๊น€..  010..
       ------------------



    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ
        #00. Mvc04_scott.sql  → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๊ฐ์ฒด ๊ตฌ์„ฑ ๋ฐ ์‹ค์Šต ๋ฐ์ดํ„ฐ ์ค€๋น„
        
        #01. Employee.java  → DTO ๊ณ„์ธต, ์ง์› ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• ํด๋ž˜์Šค.
        #02. Department.java  → DTO ๊ณ„์ธต, ๋ถ€์„œ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• ํด๋ž˜์Šค.
        #03. Region.java  → DTO ๊ณ„์ธต, ์ง€์—ญ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• ํด๋ž˜์Šค.
        #04. Position.java  → DTO ๊ณ„์ธต, ์ง์œ„ ๋ฐ์ดํ„ฐ ์ž๋ฃŒํ˜• ํด๋ž˜์Šค.

        #05. IEmployeeDAO.java  → ์ธํ„ฐํŽ˜์ด์Šค.
        #06. IDepartmentDAO.java    → ์ธํ„ฐํŽ˜์ด์Šค.
        #07. IRegionDAO.java  → ์ธํ„ฐํŽ˜์ด์Šค.
        #08. IPositionDAO.java  → ์ธํ„ฐํŽ˜์ด์Šค.

        #09. EmployeeDAO.java     → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์…˜ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค
                  ์ง์› ๋ฐ์ดํ„ฐ CRUD ์•ก์…˜
                         Connection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์ค€๋น„
                   (์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ตฌ์„ฑ / setter ๊ตฌ์„ฑ)


        #10. DepartmentDAO.java     → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์…˜ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค
          ์ง์› ๋ฐ์ดํ„ฐ CRUD ์•ก์…˜
                          Connection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์ค€๋น„
              (์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ตฌ์„ฑ / setter ๊ตฌ์„ฑ)


        #11. RegionDAO.java     → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์…˜ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค
              ์ง์› ๋ฐ์ดํ„ฐ CRUD ์•ก์…˜
                        Connection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์ค€๋น„
              (์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ตฌ์„ฑ / setter ๊ตฌ์„ฑ)

        #12. PostionDAO.java   →  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์…˜ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค
            ์ง์› ๋ฐ์ดํ„ฐ CRUD ์•ก์…˜
                             Connection ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์ค€๋น„
                      (์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ตฌ์„ฑ / setter ๊ตฌ์„ฑ)

       
        #13. EmployeeMenu.jsp    → ๋ฉ”์ธ ๋ฉ”๋‰ด ๋ทฐ ํŽ˜์ด์ง€.
          ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ํฌํ•จ.
        #14. menuStyle.css    → ๋ฉ”๋‰ด ์Šคํƒ€์ผ ๊ตฌ์„ฑ.

        #15. EmployeeList.jsp      → ์ง์› ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ํŽ˜์ด์ง€.
        #16. main.css    → ๋ฉ”์ธ ์Šคํƒ€์ผ ๊ตฌ์„ฑ
     

        #17. EmployeeListController.java  → ์‚ฌ์šฉ์ž ์ •์˜ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
          (employeelist.action)       ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ์•ก์…˜
             DAO ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด์„ฑ ์ฃผ์ž…   
          (์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์ค€๋น„ ํ•„์š”)


       #18. web.xml   → DispatcherServlet ๊ฐ์ฒด ๋“ฑ๋ก 
         URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก

       #19. dispatcher-servlet.xml   → ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด ๋“ฑ๋ก 
         URL ๋งคํ•‘ ์ฃผ์†Œ ๋“ฑ๋ก
         SimpleDriverDataSource ๊ฐ์ฒด ๋“ฑ๋ก
         ์˜์กด ๊ฐ์ฒด ์ฃผ์ž… ์„ค์ •
         DAO ๊ฐ์ฒด ๋“ฑ๋ก

       #20. employeelist.action   → ์ดํด๋ฆฝ์Šค ์‹คํ–‰ ๊ณผ์ •์—์„œ ์š”์ฒญ์„ ์œ„ํ•œ ๋นˆ ํŒŒ์ผ

       #21. EmployeeInsertForm.jsp   → 
       

       #22. EmployeeInsertFormController.java
            (employeeinsertform.action)

       #23. jquery-ui.js
       #24. jquery-ui.css
       #25. images
       
       #26. AjaxController.java
            (ajax.action)

       #27. Ajax.jsp

       #28. EmployeeInsertController.java
            (employeeinsert.action)


       #29. EmployeeUpdateForm.jsp

       #30. EmployeeUpdateFormController.java
          (employeeupdateform.action)

       #31. EmployeeUpdateController.java
          (employeeupdate.action)

       #32. EmployeeDeleteController.java
          (employeedelet.action)

       #33. LoginForm.jsp

       #34. LoginFormController.java
    (loginform.action)
       
       #35. LoginController.java
    (login.action)

       #36. LogoutController.java

       #37. EmpList.jsp

       #38. EmpListController.java
            (emplist.action)

    :
          :
    ==========================================
      #39. DepartmentList.jsp
      #40. DepartmentInsertForm.jsp
      #41. DepartmentUpdateForm.jsp

      #42. DepartmentListController.java
          (departmentlist.action)
      #43. DepartmentInsertFormController.java
          (departmentinsert.action)
      #44. DepartmentInsertController.java
          (departmentinsertcontroller.action)

      #45. DepartmentUpdateFormController.java
          (departmentupdateform.action)
      #46. DepartmentUpdateController.java
          (departmentupdate.action)
      #47. DepartmentDeleteController.java

      #48. DeptList.jsp
      #49. DeptListController.java

    :
    :

      #50. RegionList.jsp
      #51. RegionInsertForm.jsp
      #52. RegionUpdateForm.jsp

      #53. RegionListController.java
      #54. RegionInsertFormController.java
      #55. RegionInsertController.java
      #56. RegionUpdateFormController.java
      #57. RegionUpdateController.java
      #58. RegionDeleteController.java

      #59. RegList.jsp            
      #60. RegListController.java
    :
    :

      #61. PositionList.jsp
      #62. PositionInsertForm.jsp
      #63. PositionUpdateForm.jsp   

      #64. PositionListController.java
           (positionlist.action)
      #65. PositionInsertFormController.java
          (positioninsertform.action)
      #66. PositionInsertController.java
      #67. PositionUpdateFormController.java
      #68. PositionUpdateController.java
      #69. PositionDeleteController.java

    :
    :

      #70. PosList.jsp
      #71. PosListController.java
    ==========================================    

        
    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
        http://localhost:3306/Mvc04/employeelist.action → ๊ด€๋ฆฌ์ž
        http://localhost:3306/Mvc04/emplist.action → ์ผ๋ฐ˜์ง์›

    โ€ป ์ถ”ํ›„ ์šฐ๋ฆฌ๋Š”... ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ...
       ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์•ก์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ, ์—…๋ฌด ๋‹จ์œ„๋กœ ๋ฌถ์–ด ์ž‘์—… ๋ฐ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
       ์ดํ›„, ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ง€์ •ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
       ํ•˜์ง€๋งŒ, ์ด๋ฒˆ ์‹ค์Šต ๊ณผ์ •์—์„œ๋Š” ๊ธฐ๋ณธ ์•ก์…˜ ๋‹จ์œ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•ด ๋ด„์œผ๋กœ์จ
       Model-View-Controller ์˜ ๊ธฐ๋Šฅ ๋ฐ ์ฒ˜๋ฆฌ ํ๋ฆ„์— ๋Œ€ํ•œ ์ดํ•ด์™€ ํŒŒ์•…์„ ์ œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.


    2. Annotation.txt

    ๋”๋ณด๊ธฐ
    โ– โ– โ–  Annotation(์–ด๋…ธํ…Œ์ด์…˜) โ– โ– โ– 

    โ—‹ ๊ฐœ์š”
    - ์ผ์ข…์˜ ์ฃผ์„(์‚ฌ์ „์ ์ธ ์˜๋ฏธ :  ์ฃผ์„๋‹ฌ๊ธฐ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)
    - ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ : ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€์—ฐ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ
    - ์ฃผ์„์˜ ์ง€์†์„ฑ
      : *.java(์†Œ์Šค ๋ ˆ๋ฒจ) → [์ปดํŒŒ์ผ๋Ÿฌ(Compiler)] → *.class → [JVM:Runtime]
        ์ด ๊ณผ์ •์—์„œ ๋ณดํ†ต ์ปดํŒŒ์ผ์ด ์ˆ˜ํ–‰๋˜๋ฉด ์ฃผ์„์ด ์ œ๊ฑฐ
             (//, /*...*/, /**...*/)
    - ใ€Ž@ใ€ : Annotation, JDK 1.5(JavaSE 5.0)๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, Runtime ๊นŒ์ง€๋„ ์กด์žฌ
    - AT(Annotation Type)


    โ—‹ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ๊ฐ€์น˜

    ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ํšจ์šฉ์€ ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    ๋ฌธ์„œํ™”, ์ปดํŒŒ์ผ๋Ÿฌ ์ฒดํฌ, ์ฝ”๋“œ ๋ถ„์„

    - ๋ฌธ์„œํ™”
      ๋ชจ๋“  ๋ ˆ๋ฒจ์˜ ๋ฌธ์„œํ™”๋Š” ์ž์ฃผ ์ธ์šฉ๋˜๋Š” ์‚ฌ์šฉ๋ฒ•์ด๋‹ค.
        ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š”
      ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. 
         ๋˜ํ•œ ๊ทธ๋“ค์ด ๋ถˆ์™„์ „ํ•œ์ง€, ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋ ˆํผ๋Ÿฐ์‹ฑ ํ•˜๋Š”์ง€
      ๋“ฑ์„ ์•Œ๋ ค์ค€๋‹ค.
      ์ด๋Š” ์œ ์šฉํ•˜์ง€๋งŒ ๋ฌธ์„œํ™”๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ€์žฅ ๊ด€๋ จ์ด
        ์ ์€ ํ•ญ๋ชฉ์ด๋‹ค. 
      ์ฝ”๋“œ ๋ฌธ์„œํ™”์— ์žˆ์–ด์„œ๋Š” Javadoc ๋ผ๋Š” ์‚ฌ์šฉ์ด ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•œ ๋ฐฉ์‹์„ 
      ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    - ์ปดํŒŒ์ผ๋Ÿฌ ์ฒดํฌ
      ๋ณด๋‹ค ์ค‘์š”ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ์žฅ์ ์€
      ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฉ”ํƒ€ ๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ฒดํฌ๋ฅผ
      ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
      ์˜ˆ๋ฅผ ๋“ค์–ด, Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€
      ์žฌ์ •์˜๋œ ๊ฒƒ์„ ๊ธฐ์ˆ , ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์—์„œ ์•Œ๋ ค์ฃผ๋Š” ์ž‘๋™์ด
      ์‹ค์ œ๋กœ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      ์ด๋Š” ์‹ค์ˆ˜๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

    - ์ฝ”๋“œ ๋ถ„์„
      ์ข‹์€ ์–ด๋…ธํ…Œ์ด์…˜ ๋˜๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํ‹€์˜ ์ตœ๊ณ ์˜ ๊ธฐ๋Šฅ์€
      ์—ฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ, ์ฝ”๋“œ ๋ชฉ๋ก์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ•„์š”ํ•œ ์ธํ’‹ ์œ ํ˜•์„ ์ œ๊ณตํ•˜๊ณ 
      ๋ฆฌํ„ด ์œ ํ˜•์„ ์ œ์‹œํ•œ๋‹ค.
      ์ž๋ฐ” ๋ฆฌํ”Œ๋ ‰์…˜๋„ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
      ๊ฒฐ๊ตญ ์ด ๋ชจ๋“  ์ •๋ณด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
      ํ‘œ๋ฉด์ ์œผ๋กœ ๋ณผ ๋•Œ ๊ทธ๋Ÿด๋“ฏ ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
      ๋งŽ์€ ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ๋Š” ์ธํ’‹์œผ๋กœ ๋ฐ›์•„๋“ค์ด๊ฑฐ๋‚˜ ์•„์›ƒํ’‹์œผ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.
      ์ด๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
      ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด Object ์ด์ง€๋งŒ ๋ฉ”์†Œ๋“œ๋Š”  Integer ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค.
      ์ด๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฒน์ณ์“ฐ๊ธฐ๋œ ๊ณณ์—์„œ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
      ๊ทธ๋ฆฌ๊ณ  ์Šˆํผ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋˜๊ฐ€
      ๋งŽ์€ ์ง๋ ฌํ™”๊ฐ€ ์ง„ํ–‰๋˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
      ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” ์ฝ”๋“œ ๋ถ„์„ ํ‹€์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
          ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด Object ์ด๋”๋ผ๋„ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ Integer ๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
      ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ถ„์„์€ ์ƒ๋‹นํžˆ ์œ ์šฉํ•˜๋ฉฐ ๊ทธ ๊ฐ€์น˜๋Š” ์ƒ๋‹นํ•˜๋‹ค.
     
      ๋ณด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ ๋ถ„์„ ํˆด์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ถ”๊ฐ€ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 
      ๊ทธ ์˜ˆ ์ค‘ ํ•˜๋‚˜๊ฐ€ EJB(Enterprise JavaBean) ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
      ์‹ฌ์ง€์–ด ๊ฐ„๋‹จํ•œ EJB ์‹œ์Šคํ…œ๋„ ์˜์กด์„ฑ๊ณผ ๋ณต์žก์„ฑ์€ ์ƒ๋‹นํ•˜๋‹ค.
      ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉด์„œ ๋กœ์ปฌ ํ™ˆ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•จ๊ป˜ 
      ํ™ˆ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์›๊ฒฉ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ป๋Š”๋‹ค.
      ์ด ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์„ ์—ฐ๋™์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ฝค ํž˜๋“ค๋‹ค.
      ํ•˜์ง€๋งŒ, ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•œ๋‹ค.
      ์ข‹์€ ํˆด์€ ์ด ๋ชจ๋“  ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ฝ”๋“œ-๋ ˆ๋ฒจ ์—ฐ๊ฒฐ์ด ์—†์ง€๋งŒ
        ์ฝ”๋“œ-๋ ˆ๋ฒจ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค์ด ์—ฐ๋™๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
      ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์˜ ์ง„์ •ํ•œ ๊ฐ€์น˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

    โ—‹ Annotation์˜ ์ข…๋ฅ˜

    1) Mark Annotation
     ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์—†์ด ๋‚˜ํƒ€๋‚œ๋‹ค.
     ์˜ˆ๋ฅผ ๋“ค์–ด, @ Mark Annotation์€  marker ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
     ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉฐ ๋‹จ์ง€ ์–ด๋…ธํ…Œ์ด์…˜ ์ด๋ฆ„๋งŒ ์žˆ์„ ๋ฟ์ด๋‹ค. 
     ex) @Stateless

    2) Single Annotation
    marker ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    ์‹ฑ๊ธ€ ๋น„ํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ ์‹ ํƒ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    (๋‹จ, ์–ด๋…ธํ…Œ์ด์…˜ ์œ ํ˜•์ด ์ด ๋ฌธ๋ฒ•์„ ์ˆ˜์šฉํ•ด์•ผ ํ•จ)
    : @SingleValueAnnotation("my data")
     → ์ด๋Š” @ ํ‘œ์‹œ๋งŒ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ” ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ๋น„์Šทํ•˜๋‹ค.

    3) Full Annotation(Multi value Annotation)
    ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ „์ฒด ์‹ ํƒ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 
    (๊ทธ๋ฆฌ๊ณ , ์–ด๋…ธํ…Œ์ด์…˜์€ ์ผ๋ฐ˜ ์ž๋ฐ” ๋ฉ”์†Œ๋“œ์™€ ๋”์ด์ƒ ๋น„์Šทํ•˜์ง€ ์•Š๋‹ค. )
    : @FullAnnotation(var1="dataValue1", var2="dataValue2", var3="dataValue3")

    4) Custom Annotation ๊ตฌํ˜„
    : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ Annotation์„ ๊ตฌํ˜„
    ex)
    public @interface TODO // Single Value Annotation
    {
      String Value(); // value ๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด
    } // ์‚ฌ์šฉ์‹œ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์จ์ค€๋‹ค.

    // @TODO("Something todo")

    public @interface TODO // Single-value Annotation
    {
      String msg(); // value ๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
      }

    // @TODO(msg="Something todo")


    โ—‹ Annotation ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ์ค€
     
    1) Simple Annotation
       ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณ€์ˆ˜ ์œ„์— ๋ถ™์ด๋Š” ์ผ๋ฐ˜์ ์ธ Annotation

    2) Meta Annotation
       Annotation ์˜ Annotation
       (ํ•œ Annotation ์œ„์— ๋‹ค๋ฅธ Annotation ์„ค์ •)

    โ€ป Meta Annotation

     1) @Target Annotation
       ์ž‘์„ฑํ•œ Annotation ์ด ์–ด๋””์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ์ง€๋ฅผ ๊ฒฐ์ •
     
       @Target(
       {
         ElementType.type // ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, enum
        , ElementType.METHOD // ์ƒ์„ฑ์ž๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ
        , ElementType.CONSTRUCTOR // ์ƒ์„ฑ์ž
        , ElementType.ANNOTATION_TYPE // ๋ฉ”ํƒ€ Anntation
       })

    2) @Retention Annotation
       @Retention Annotation([์†์„ฑ๊ฐ’])
       ์ž‘์„ฑํ•œ Annotation์˜ ์ง€์†์„ฑ์„ ์„ค์ •

      - RententionPosicy.SOURCE
        : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ ์‚ญ์ œํ•˜์—ฌ ํด๋ž˜์Šค ํŒŒ์ผ์— ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. 
      - RententionPosicy.CLASS
        : ํด๋ž˜์Šค ํŒŒ์ผ์— ์ €์žฅ๋˜์ง€๋งŒ JVM ์€ ๋ฌด์‹œ
      - RententionPosicy.RUNTIME
        : ํด๋ž˜์Šค ํŒŒ์ผ์— ์ €์žฅ๋˜๋„ JVM ์€ ์œ ์ง€

    โ—‹ ๋‚ด์žฅ(Built-in) Annotation (โ€ป java.lang.* ์— ์ •์˜๋œ 3๊ฐœ์˜ ํ‘œ์ค€ ์–ด๋…ธํ…Œ์ด์…˜)

    1) @Override
       ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ

      public class OverrideTest
      {
        public OverrideTest() { }

        @Override
        public String toString()
        {
            return super.toString() + "[Override Test Implementation]";
        }
      

        @Override
        public int hashCode()
        {
          return super.toString().hashCode();
        }

      }

    2) @Deprecated
       @Override ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ @Deprecated ๋Š” marker ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.
       @Deprecated๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ๋ง์•„์•ผ ํ•  ๋ฉ”์†Œ๋“œ์— ์ฃผ์„์„ ๋ถ€์—ฌํ•œ๋‹ค.
       @Override์™€ ๋‹ค๋ฅธ ์ ์€, @Deprecated๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” (deprecated)
       ๋ฉ”์†Œ๋“œ์™€ ๋™์ผํ•œ ๋ผ์ธ์ƒ์— ๋†“์—ฌ์ ธ์•ผ ํ•œ๋‹ค.

       public class Deprecated
       {
         @Deprecated public void doSomethig()
         {
    //.. ์‹คํ–‰ ์ฝ”๋“œ
      // doSomethig() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค
    // ํ–ฅ์ƒ๋œ ํ˜•ํƒœ์˜ ์ฝ”๋“œ
           }
       }

    3) @SuppressWarnings
       ๋ฒˆ๊ฑฐ๋กœ์šด ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
       Override ๋‚˜ Deprecated ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ @SuppressWarnings ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
       ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด Single-value Annotation ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
       ๊ฐ’ ์–ด๋ ˆ์ด๋กœ์„œ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
       ๊ฐ๊ฐ ์‚ญ์ œํ• (Suppress) ํŠน์ • ์œ ํ˜•์˜ ๊ฒฝ๊ณ ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

       @SuppressWarnings(value="unchecked")
       public void nonGenericMethod()
       {
         List wordList = new ArrayList();
         wordList.add("foo");
       }





    ------------------------------------------------------------------------------------------------------

    โ– โ– โ–  Spring Annotation โ– โ– โ– 

    โ—‹ ๊ฐœ์š”
    Spring Framework ๋Š” JAVA 5+ ๋ถ€ํ„ฐ Annotation์„ ์ œ๊ณตํ•˜๋ฉฐ,
    Annotation ์˜ ์‚ฌ์šฉ์œผ๋กœ ์„ค์ • ํŒŒ์ผ์„ ๊ฐ„๊ฒฐํ™”ํ•˜๊ณ 
    ๊ฐ์ฒด ๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋งคํ•‘์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

    โ—‹ @Component
    - ํŒจํ‚ค์ง€ : org.springframework.stereotype
    - ๋ฒ„์ „ : spring2.5
    - ๊ฐœ์š”
      : ใ€Ž<context:component-scan>ใ€ํƒœ๊ทธ๋ฅผ ์„ค์ • ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๋ฉด
         ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ฒŒ ๋œ๋‹ค.
         ๋ฒ”์œ„๋Š” ๋””ํดํŠธ๋กœ ์‹ฑ๊ธ€ํ†ค(Singleton)์ด๋ฉฐ ใ€Ž@Scopeใ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    - ์„ค์ • ์œ„์น˜ : ํด๋ž˜์Šค ์„ ์–ธ๋ถ€ ์œ„
    - ์ถ”๊ฐ€ ์„ค์ •
      : XML ์„ค์ • ํŒŒ์ผ์— ใ€Ž<context:component-scan>ใ€์„ ์ •์˜ํ•˜๊ณ 
        ์ ์šฉํ•  ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๋ฅผ ใ€Ž<base-package>ใ€์†์„ฑ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
        ใ€Ž<context:component-scan>ใ€ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
          @Component, @Required, @Autowired ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•จ๊ป˜ ์ ์šฉ๋œ๋‹ค.

       ์˜ˆ๋ฅผ ๋“ค๋ฉด, ใ€Ž<context:component-scan base-package="xxx">ใ€ ์—์„œ
       xxx ํŒจํ‚ค์ง€์˜ ํ•˜์œ„์—์„œ @Component ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค๋Š” Bean ์œผ๋กœ ์ž๋™ ๋“ฑ๋กํ•œ๋‹ค.
       Bean ์˜ ์ด๋ฆ„์€ ํ•ด๋‹น ํด๋ž˜์Šค๋ช…(์ฒซ ๊ธ€์ž๋Š” ์†Œ๋ฌธ์ž)์ด ์‚ฌ์šฉ๋œ๋‹ค.

       ใ€Ž<context:component-scan>ใ€ ์š”์†Œ์—๋Š” scoped-proxy ์†์„ฑ์ด ์กด์žฌํ•œ๋‹ค.
       scoped-proxy ์†์„ฑ์€ <aop:scoped-proxy/> ์š”์†Œ์ฒ˜๋Ÿผ
       WebApplicationContext ์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ
       " session", "globalSession", "request" ์ด์™ธ์˜ scope ๋Š” ๋ฌด์‹œ๋˜๋ฉฐ
       ๋‹ค์Œ์˜ 3๊ฐ€์ง€ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
       ·no : proxy ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.(๊ธฐ๋ณธ๊ฐ’)
           ·interfaces : JDK Dynamic Proxy๋ฅผ ์ด์šฉํ•œ proxy ์ƒ์„ฑ
         ·targetClass : ํด๋ž˜์Šค์— ๋Œ€ํ•ด ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑ(CGLIB ๋ฅผ ์ด์šฉํ•œ Proxy ์ƒ์„ฑ) 

    - ์‚ฌ์šฉ ์˜ˆ
      @Component
      @Scope("prototype") //-- ์ƒ๋žตํ•˜๋ฉด ์‹ฑ๊ธ€์ฝ˜
      public class Test
      {
                 //...
      }


    โ—‹ @Required
    - ํŒจํ‚ค์ง€ : org.springframework.beans.factory.annotation
    - ๋ฒ„์ „ : spring 2.0
    - ๊ฐœ์š”
      : @Required ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•„์ˆ˜ ํ”„๋กœํผํ‹ฐ์ž„์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ
        ํ•„์ˆ˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋นˆ ์ƒ์„ฑ ์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.
    - ์„ค์ • ์œ„์น˜ : setter ๋ฉ”์†Œ๋“œ
    - ์ถ”๊ฐ€ ์„ค์ •
      : <bean class="org.springframeword.beans.factory.annotation"
        .RequiredAnnotationBeanPostProcessor"> ํด๋ž˜์Šค๋ฅผ
        ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ ์ค˜์•ผ ํ•œ๋‹ค.
        ํ•ด๋‹น ์„ค์ • ๋Œ€์‹ ์— ใ€Ž<context:annotation-config>ใ€ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋œ๋‹ค.

        ใ€Ž<context:annotation-config>ใ€ ํƒœ๊ทธ๋Š”
        ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ์˜ BeanPostProcessor ๋ฅผ ํ•จ๊ป˜ ๋“ฑ๋กํ•œ๋‹ค.
        ·@Required(RequiredAnnotationBeanPostProcessor)
        ·@Autowired(AutowiredAnnotationBeanPostProcessor)
                ·@Resource, @PostConstruct, @PreDestroy(CommonAnnotationBeanPostProcessor)
        ·@Configuration(ConfigurationClassPostProcessor)
       
    โ‘  1 ๋‹จ๊ณ„ : ์ฝ”๋“œ ๋‚ด์— ํ”„๋กœํผํ‹ฐ ์„ค์ • ๋ฉ”์†Œ๋“œ์— ใ€Ž@Requiredใ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.

      public class TestBean
      {
         private TestDAO testDAO;
         
         @Required
             public void setTestDAO(TestDAO testDAO)
                 {
    this.testDAO = testDAO;
                 }

        }

    โ‘ก 2 ๋‹จ๊ณ„ : ์Šคํ”„๋ง ์„ค์ • ํŒŒ์ผ์— RequiredAnnotationBeanPostProcessor ํด๋ž˜์Šค๋ฅผ
        ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

       <bean class="org.springframework.beans.factory.annotation
       .RequriedAnnotationBeanPostProcessor"/>

       <bean name="testBean" class="com.test.TestBean">
    <!-- ใ€Ž@Requiredใ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•˜์˜€์œผ๋ฏ€๋กœ
    ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒจ์›… ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค. -->
    <property name="testDAO" ref="testDAO"/>
       </bean>

      RequiredAnnotationBeanPostProcessor ํด๋ž˜์Šค๋Š”
      ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ bean ๊ฐ์ฒด๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ
      @Required ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด
      ๊ฐ’์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ 
      ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด bean ์ƒ์„ฑ ์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

      RequiredAnnotationBeanPostProcessor ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ณ 
      ใ€Ž<context:annotation-config>ใ€ ์™€ ๊ฐ™์ด ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
              <context:annotation-config />  <!-- โ—€โ—€โ—€ -->

           </beans>


    โ—‹ @Autowired
    - ํŒจํ‚ค์ง€ : org.springframework.beans.factory.annotation
    - ๋ฒ„์ „ : spring 2.5
    - ๊ฐœ์š”
      : @@Autowired ์–ด๋…ธํ…Œ์ด์…˜์€ ์˜์กด๊ด€๊ณ„๋ฅผ ์ž๋™ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ
        ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•ด ์ฃผ๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค.
        ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•ด๋‹น ํƒ€์ž…์˜ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜
        ๋˜๋Š” 2๊ฐœ ์ด์ƒ ์กด์žฌํ•  ๊ฒฝ์šฐ, ์Šคํ”„๋ง์€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.
    - ์„ค์ • ์œ„์น˜ : ์ƒ์„ฑ์ž, ํ•„๋“œ, ๋ฉ”์†Œ๋“œ(setter ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.)
    - ์ถ”๊ฐ€ ์„ค์ •
      : <bean class="org.springframework.beans.factory.annotation"
        .AutowiredAnnotationBeanPostProcessor"/> ํด๋ž˜์Šค๋ฅผ
       ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.
       ํ•ด๋‹น ์„ค์ • ๋Œ€์‹ ์— ใ€Ž<context:annotation-config/>ใ€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
    - ์˜ต์…˜
      ·required
        @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•œ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด
        ์„ค์ •ํ•œ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— false ๊ฐ’์„ ๋ถ€์—ฌํ•˜๋ฉฐ,
        ์ด ๋•Œ , ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ์Šคํ”„๋ง์€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
        ใ€Ž@Autowired(required=false)ใ€๋กœ ์„ ์–ธํ•œ๋‹ค. (๊ธฐ๋ณธ๊ฐ’์€ true)

    - ํŠน์ง•
      byType ์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ
      ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
      @Autowired ๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      ์ด๋Ÿด ๊ฒฝ์šฐ, @Qualifier ๋ฅผ  ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ ์ค‘
      ํŠน์ • ๋นˆ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

      @Autowired
      @Qualifier("test")
      private Test test;

    โ—‹ @Qualifier
    - ํŒจํ‚ค์ง€ : org.springframework.beans.factory.annotation
    - ๋ฒ„์ „ : spring 2.5
    - ๊ฐœ์š”
      : @Qualifier ์–ด๋…ธํ…Œ์ด์…˜์€  @Autowired ์˜ ๋ชฉ์ ์—์„œ
        ๋™์ผ ํƒ€์ž…์˜ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ํŠน์ • ๋นˆ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
        @Qualifier("mainBean")์˜ ํ˜•ํƒœ๋กœ @Autowired ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉฐ
        ํ•ด๋‹น <bean>ํƒœ๊ทธ์— <quaulifier value="mainBean"/> ํƒœ๊ทธ๋ฅผ ์„ ์–ธํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
        ๋ฉ”์†Œ๋“œ์—์„œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š”
        ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.
    - ์„ค์ • ์œ„์น˜ : @Autowired ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ.
    - ์ถ”๊ฐ€ ์„ค์ • : ๋™์ผ ํƒ€์ž…์˜ ๋นˆ ๊ฐ์ฒด ์„ค์ •์—์„œ
    ใ€Ž<qualifier value="[alias๋ช…]"/>ใ€๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.
    - ์˜ต์…˜ : name -alias๋ช…

    โ—‹ @Resource
    - ๊ฐœ์š”
    : Java 6 ๋ฒ„์ „ ๋ฐ JEE 5 ๋ฒ„์ „์— ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ
      ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์ž์›์„ ์ž๋™ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      ์Šคํ”„๋ง 2.5 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ
      ์Šคํ”„๋ง์—์„œ๋Š” ์˜์กดํ•˜๋Š” ๋นˆ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      @Autowired์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ
      @Autowired ์™€์˜ ์ฐจ์ด์ ์€ @Autowired๋Š” ํƒ€์ž…์œผ๋กœ(byType)
      @Resource ๋Š” ์ด๋ฆ„์œผ๋กœ (byName) ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    - ์„ค์ • ์œ„์น˜ : ํ”„๋กœํผํ‹ฐ, setter ๋ฉ”์†Œ๋“œ
    - ์ถ”๊ฐ€ ์„ค์ •
      : ใ€Ž<bean class="org.springframework.beans.factory.annotation
    .CommonAnnotationBeanPostProcessor"/>ใ€ ํด๋ž˜์Šค๋ฅผ
        ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.
        ํ•ด๋‹น ์„ค์ • ๋Œ€์‹ ์— ใ€Ž<context:annotation-config/>ใ€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
    - ์˜ต์…˜ : name
      name ์†์„ฑ์— ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋นˆ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•œ๋‹ค.
      @Resource(name="testDAO")
      CommonAnnotationBeanPostProcessor ํด๋ž˜์Šค๋ฅผ
      ์„ค์ • ํŒŒ์ผ์— ๋นˆ ๊ฐ์ฒด๋กœ ๋“ฑ๋กํ•˜์—ฌ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

    โ—‹ @PostConstruct
    - ํŒจํ‚ค์ง€ : javax.annotation
    - ๋ฒ„์ „ : jdk 1.6, spring 2.5
    - ๊ฐœ์š”
      : ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•œ ์ดํ›„์— ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ,
    - ์„ค์ • ์œ„์น˜ : ์ดˆ๊ธฐํ™” ์ž‘์—… ์ˆ˜ํ–‰ ๋ฉ”์†Œ๋“œ
    - ์ถ”๊ฐ€ ์„ค์ •
      : ใ€Ž<bean class="org.springframework.beans.factory.annotation
        .CommomnAnnotationPostProcessor"/>ใ€ ํด๋ž˜์Šค๋ฅผ
        ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.
        ํ•ด๋‹น ์„ค์ • ๋Œ€์‹ ์— ใ€Ž<context:annotation-config/>ใ€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.


    โ—‹ @PreDestory
    - ํŒจํ‚ค์ง€ : javax.annotation
    - ๋ฒ„์ „ : jdk 1.6, spring 2.5
    - ๊ฐœ์š”
      : ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ํ•ด์•ผํ•  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    - ์„ค์ • ์œ„์น˜ : ํ•ด๋‹น ์ž‘์—… ์ˆ˜ํ–‰ ๋ฉ”์†Œ๋“œ
    - ์ถ”๊ฐ€ ์„ค์ •
      : ใ€Ž<bean class="org.springframework.beans.factory.annotation
        .CommomnAnnotationPostProcessor"/>ใ€ ํด๋ž˜์Šค๋ฅผ
        ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.
        ํ•ด๋‹น ์„ค์ • ๋Œ€์‹ ์— ใ€Ž<context:annotation-config/>ใ€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

    ------------------------------------------------------------------------------------------------

    โ– โ– โ–  Spirng AOP ๊ด€๋ จ Annotation โ– โ– โ– 

    โ€ป spring AOP Annotation ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ จ ์šฉ์–ด
    - advice : ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค
    - target : advice ๊ฐ€ ์ ์šฉ๋  ๊ฐ์ฒด
    - joinpoint : advice ๊ฐ€ ์ ์šฉ๋  ์ง€์ (์ฆ‰, target ์˜ ๋ฉ”์†Œ๋“œ)
    - pointcut : ์‹ค์ œ๋กœ advice ๊ฐ€ ์ ์šฉ๋œ joinpoint(pointcut ์€ joinpoint์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ)
    - advisor(=aspect) : advice + pointcut
    - weaving : advice ๋ฅผ ํ•ต์‹ฌ ๋กœ์ง ์ฝ”๋“œ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ

    โ—‹ @Aspect
    - ๊ฐœ์š”
      : AspectJ 5 ๋ฒ„์ „์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ 
        @Apspect ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์ • ํŒŒ์ผ์— Advice ๋ฐ Pointcut ๋“ฑ์˜ ์„ค์ •์„
         ํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋™์œผ๋กœ Advice ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    - ์„ค์ • ์œ„์น˜
      : ํด๋ž˜์Šค ์„ ์–ธ๋ถ€ ์œ„
    - ์ถ”๊ฐ€ ์„ค์ •
        : XML ์„ค์ • ํŒŒ์ผ์— ใ€Ž<aop:aspectj-autoproxy/>ใ€๋ฅผ ์ •์˜ํ•œ๋‹ค.
        ใ€Ž<aop:aspectj-autoproxy/>ใ€ํƒœ๊ทธ๋Š” @Aspect ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํด๋ž˜์Šค๋ฅผ
        ๋กœ๋”ฉํ•˜์—ฌ ํด๋ž˜์Šค์— ๋ช…์‹œ๋œ Advice ๋ฐ Pointcut ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ
        ์•Œ๋งž์€ ๋นˆ ๊ฐ์ฒด์— Adivce๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

    โ€ป @Aspect ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ํด๋ž˜์Šค 
    Advice ๋กœ ์‚ฌ์šฉ๋  ๋ฉ”์†Œ๋“œ์—๋Š” Advice ๋ฅผ ์˜๋ฏธํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค.
     
    1) @Before ์–ด๋…ธํ…Œ์ด์…˜
       Before Advice๋กœ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ์— ์ ์šฉ
    2) @After ์–ด๋…ธํ…Œ์ด์…˜
       Afer Advice๋กœ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ์— ์ ์šฉ
    3) @AfterReturning ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @AfterThrowing ์–ด๋…ธํ…Œ์ด์…˜
       ๊ฐ๊ฐ ๋ฆฌํ„ด๊ฐ’๊ณผ ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•˜๋ฉฐ
       Advice ๋ฉ”์†Œ๋“œ์—์„œ ๋ฆฌํ„ด๊ฐ’๊ณผ ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    4) @Around ์–ด๋…ธํ…Œ์ด์…˜
       ProceedingJoinPoint.proceed() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ
       ํ”„๋ก์‹œ ๋Œ€์ƒ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    5) @Around ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ Advice๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค
       ๋ฉ”์†Œ๋“œ๋Š” ํ”„๋ก์‹œ ๋Œ€์ƒ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
       ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ JoinPoint ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    โ€ป AspectJ์˜ ํ‘œํ˜„์‹
       AspectJ ๋Š” Pointcut์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ช…์‹œ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ,
       ์Šคํ”„๋ง์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จํ•œ ๋ช…์‹œ์ž๋งŒ์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.
       execution ๋ช…์‹œ์ž๋Š” Advice ๋ฅผ ์ ์šฉํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์‹œํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, 
       ๊ธฐ๋ณธํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

      execution(์ˆ˜์‹์–ดํŒจํ„ด ๋ฆฌํ„ดํƒ€์ž…ํŒจํ„ด ํŒจํ‚ค์ง€ํŒจํ„ด.ํด๋ž˜์ŠคํŒจํ„ด.๋ฉ”์†Œ๋“œํŒจํ„ด(ํŒŒ๋ผ๋ฏธํ„ฐํŒจํ„ด))
    - ์ˆ˜์‹์–ดํŒจํ„ด : ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋ฉฐ public, protected ๋“ฑ์ด ์˜จ๋‹ค.
    - ๋ฆฌํ„ดํƒ€์ž…ํŒจํ„ด : ๋ฆฌํ„ด ํƒ€์ž…์„ ๋ช…์‹œํ•œ๋‹ค.
    - ํŒจํ‚ค์ง€ํŒจํ„ด, ํด๋ž˜์ŠคํŒจํ„ด, ๋ฉ”์†Œ๋“œํŒจํ„ด : ํด๋ž˜์Šค ์ด๋ฆ„ ๋ฐ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ํŒจํ„ด์œผ๋กœ ๋ช…์‹œ
    - ํŒŒ๋ผ๋ฏธํ„ฐํŒจํ„ด : ๋งค์นญ๋  ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๋ช…์‹œํ•œ๋‹ค.

    ๊ฐ ํŒจํ„ด์€ ใ€Ž*ใ€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
    ใ€Ž..ใ€์„ ์ด์šฉํ•˜์—ฌ 0๊ฐœ ์ด์ƒ์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ใ€Žwithinใ€๋ช…์‹œ์ž๋Š” ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ํŠน์ • ํƒ€์ž…์— ์†ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ
    Pointcut ์œผ๋กœ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
    ๊ฐ๊ฐ์˜ ํ‘œํ˜„์‹์€ ใ€Ž&&ใ€๋‚˜ ใ€Ž||ใ€์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ใ€Ž@Aspectใ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

    @AfterThrowing(pointcut="execution(public * get*())
        && execution(public void set*(..))")
    public void throwingLogging()
    {
      //...
    }

    ------------------------------------------------------------------------------------------------------------

    โ– โ– โ–  Spring MVC ๊ด€๋ จ Annotation โ– โ– โ– 

    โ—‹ ๊ฐœ์š”
    Spring Web MVC Framework ๋Š” JAVA 5+ ๋ถ€ํ„ฐ Annotation ์„ ์ œ๊ณตํ•˜๋ฉฐ,
    Annotation ์˜ ์‚ฌ์šฉ์œผ๋กœ ์„ค์ • ํŒŒ์ผ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ ,
    View ํŽ˜์ด์ง€์™€ ๊ฐ์ฒด ๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋งคํ•‘์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    โ€ป 4๊ฐœ์˜ ์Šคํ…Œ๋ ˆ์˜ค(stereo)ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜
    - @Component
      : ์Šคํ…Œ๋ ˆ์˜ค ํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜์˜ ์กฐ์ƒ
    - @Controller
      : Spring NVC ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ธ์‹
    - @Service
      : ์—ญํ•  ๋ถ€์—ฌ ์—†์ด ์Šค์บ” ๋Œ€์ƒ์ด ๋˜๋Š”๋ฐ... ๋น„์ฆˆ๋‹ˆ์Šค ํด๋ž˜์Šค์— ์‚ฌ์šฉ
    - @Repository
      : @Repository ์–ด๋…ธํ…Œ์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ DAO ์— ์‚ฌ์šฉ๋˜๋ฉฐ
        DB Exception ์„ DataAccessException์œผ๋กœ ๋ณ€ํ™˜


    โ€ป Spring Annotation ์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์—... ์ถ”๊ฐ€ ++

    โ—‹ @Service
    - ๊ฐœ์š”
      : @Service ๋ฅผ ์ ์šฉํ•œ ํด๋ž˜์Šค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” Service ๋กœ ๋“ฑ๋ก์ด ๋œ๋‹ค.
        Controller ์— ์žˆ๋Š” @Autowired ๋Š” @Servic("xxxService")์— ๋“ฑ๋ก๋œ
        ใ€ŽxxxServiceใ€์™€ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ
        Service ์— ์žˆ๋Š” @Autowired ๋Š” @Repository("xxxDao")์— ๋“ฑ๋ก๋œ
                ใ€ŽxxxDaoใ€ ์™€ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

        @Service("helloService")
        public class HelloServiceImpl implements HelloService
          {
    @Autowired
    private HelloDAO helloDao;

    public void hello()
    {
      System.out.println("HelloServiceImpl :" + hello());
      helloDao.selectHello(); // โ—€โ—€โ—€
    }
        }

      // ใ€ŽhelloDao.selectHello();ใ€์™€ ๊ฐ™์ด @Autowired, ๋ฅผ ์ด์šฉํ•œ
      // ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ DAO  ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    โ—‹ @Repository
    - ํŒจํ‚ค์ง€ : org.springframework.stereotype
    - ๋ฒ„์ „ : spring 2.0
    - ๊ฐœ์š”
      : @Repository ์–ด๋…ธํ…Œ์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ DAO ์— ์‚ฌ์šฉ๋˜๋ฉฐ 
        DB Exception ์„ DataAccessException ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    โ—‹ @Controller
    - ํŒจํ‚ค์ง€ : org.springframework.stereotype
    - ๋ฒ„์ „ : spring 2.5
    - ๊ฐœ์š”
      : Spring MVC ์˜ Controller ํด๋ž˜์Šค ์„ ์–ธ์„ ๋‹จ์ˆœํ™”์‹œ์ผœ์ค€๋‹ค.
        ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ ๋“ฑ์„ ์ƒ์†ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ,
        @Controller ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ bean ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.
        @Controller ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์— @Controller ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด
        Component-scan ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.
    - ์ถ”๊ฐ€ ์„ค์ •(java)
      : package com.test;
      
        import org.springframework.sterotype.Controller;

        @Controller
        public class SpringC
        {
                  //..
        }


    โ—‹ @RequestMapping
    - ๊ฐœ์š”
       : @RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์€ URL ์„ class ๋˜๋Š” method ์™€
         mapping ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
             Annotation ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์ง€์ •ํ–ˆ๋˜ Controller ๋“ฑ๋ก์„ ์œ„ํ•œ
         URL bean ์„ค์ •์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
         ํด๋ž˜์Šค์— ํ•˜๋‚˜์˜ url mapping  ์„ ํ•  ๊ฒฝ์šฐ
         class  ์œ„์— ใ€Ž@RequestMapping("/url")ใ€์„ ์ง€์ •ํ•˜๋ฉฐ,
         GET ๋˜๋Š” POST ๋ฐฉ์‹ ๋“ฑ์˜ ์˜ต์…˜์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
         ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋œ ํ›„ return ํŽ˜์ด์ง€๊ฐ€ ๋ณ„๋„๋กœ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด
         @RequestMapping("/url")์—์„œ ์„ค์ •๋œ url ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ„๋‹ค.

        @Controller
        @RequestMapping("/com/test/*")
        public class HelloController
        {
    @RequestMapping(method=RequestMethod.GET, value="go")
    public returntype getMethodBName()
    {
      //...
    }

    @RequestMapping(method=RequestMethod.GET, value="go2")
    public returntype getMethodBName2()
    {
      //...
    }
        }

    โ—‹ @RequestParam
    - ๊ฐœ์š”
       : @RequestParam ์–ด๋…ธํ…Œ์ด์…˜์„ key=value ํ˜•ํƒœ๋กœ
         ํ™”๋ฉด์—์„œ ๋„˜์–ด์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งคํ•‘๋œ ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.
         ์ฃผ๋กœ get ๋ฐฉ์‹์œผ๋กœ ๋“ค์–ด์˜ค๋Š” request์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

       @Controller
       public class BlogController
       {
    //...

    @RequestMapping("/editBlog")
    public ModelMap eidtBlogHandler(@RequestParam("blogId") int blogId)
    {
      blog = blogService.findBlog(blogId);
      return new ModelMap(blog);
    }

    //...
       }

      // ใ€Ž.../editblog.action?blogId=3ใ€ ๊ณผ ๊ฐ™์€ ์š”์ฒญ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ 
      // editBlogHandler() ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ blogId ์—๋Š” 3 ์ด ์„ธํŒ…๋œ๋‹ค.
      // ํ•„์ˆ˜์š”๊ฑด์ด ์•„๋‹ ๊ฒฝ์šฐ, @RequestParam(value="id", required="false")์™€ ๊ฐ™์ด
      // ์˜ต์…˜์„ ๋ถ€์—ฌํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    โ—‹ @ModelAttribute
    - ๊ฐœ์š”
    : @ModelAttribute ์–ด๋…ธํ…Œ์ด์…˜์€ ํ™”๋ฉด์˜ form ์†์„ฑ์œผ๋กœ ๋„˜์–ด์˜จ model์„
        ๋งคํ•‘๋œ method์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
       ์ฃผ๋กœ post ํƒ€์ž…์œผ๋กœ ๋„˜์–ด์˜ค๋Š” form ์†์„ฑ์˜ model ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
       (ํ•˜์ง€๋งŒ ์ฃผ๋กœ get / post ๋ชจ๋“œ๋กœ ํ†ต์šฉ๋œ๋‹ค.)

    @Controller
      public class BlogController
    {
      // ...
      @RequestMapping("/updateBlog")
      public String updateBlogHandler(@ModelAttribute("blog") Blog blog)
      {
         blogService.updateBlog(blog);
         return "redirect:fingBlog.action";
      }
         // ...
    }

    โ—‹ @SessionAttribute
    - ๊ฐœ์š” 
    : @SessionAttribute ์–ด๋…ธํ…Œ์ด์…˜์€ ์„ธ์…˜ ์ƒ์—์„œ model์˜ ์ •๋ณด๋ฅผ 
      ์œ ์ง€ํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


    @Controller
    @SessionAttributes("blog")
      public class BlogController
    {
      // ...
      @RequestMapping("/createBlog")
      public ModelMap creatBlogHandler
      {
         blog = new Blog();
         blog.setRegDate(new Date());
         // ...    
         return new ModelMap(blog);
      }
         // ...
    }


    โ—‹ @InitBinder
    - ๊ฐœ์š”
    : WebDateBinder ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” method ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •์„ ์ œ๊ณตํ•œ๋‹ค
      ์ผ๋ฐ˜์ ์œผ๋กœ WebDateBinder ๋Š” Annotation Handler ๋ฉ”์†Œ๋“œ์˜
      command ์™€ form  ๊ฐ์ฒด ์ธ์ž๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 
      initBinder ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ’์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์œผ๋ฉฐ,
      ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— voide๋ฅผ ์„ ์–ธํ•œ๋‹ค.
      ํŠน๋ณ„ํžˆ ์ธ์ž๋Š” WebDataBinder ์™€ WebRequest ๋˜๋Š” Locale ์˜ ์กฐํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ
      ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด context-specific eidtors๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค. 

    ·WebDateBinder 
      : WebDateBinder ๋Š” web request parameter๋ฅผ
        ์ž๋ฐ” ๋นˆ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ํŠน์ •ํ•œ DataBinder, dlek.
        WebDateBinder ๋Š” ์›น ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜์ง€๋งŒ
          Servlet API์— ์˜์กด์ ์ด์ง€ ์•Š๋‹ค.
          Servlet API์— ์˜์กด์ ์ธ Servlet RequestDatatBinder์™€ ๊ฐ™์ด
        ํŠน์ •ํ•œ DataBinder ๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ bass class๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    · RequestMapping
       : RequestMapping ์–ด๋…ธํ…Œ์ด์…˜์€ web request ๋ฅผ
         ํŠน์ •ํ•œ handelr class ์™€ handelr method ์— mapping ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
         ๋Œ€์‘ํ•˜๋Š” handlerMapping(for type level annotation)๊ณผ
         handlerAdatpter(for method level anntation) ๊ฐ€ dispath ์— ์กด์žฌํ•œ๋‹ค๋ฉฐ๋Š
         @RequestMapping์ด ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด๋‹ค. 
    ·WebRequest
      : WebRequest๋Š” ์›น ์š”์ฒญ์— ๋Œ€ํ•œ Generic interface ์ด๋‹ค.
        ์ฃผ๋กœ ์ผ๋ฐ˜ request metadata  ์— generic web request interseptors ์˜
        ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜์—ฌ metadate ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด์ง€
        request ์ž์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

    โ€ป Annotation ๊ธฐ๋ฐ˜ Controller ์—์„œ ServletContext ๊ตฌํ•˜๊ธฐ

    // ...

      @Controller
    public class downloadController
    {
      @Autowired
      private ServletContext sc;

      @RequestMapping
      public ModelAndView download(@RequestParam("filePath") String filePath) theows Exception
      {
        String path = sc.getRealPath(filePath);
        return new ModelAndView("common.download", "downloadfile", new file(path));
      }
    }

     

    3. Mybatis Framework.txt

    ๋”๋ณด๊ธฐ
    โ– โ– โ–  Mybatis Framework ๊ฐœ๋… ์ •๋ฆฌ โ– โ– โ– 

    โ€ป ORM(Object Relational Mapping : ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘)
       ORM ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๋“ค์„ ๊ฐ์ฒดํ™”ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
       PreparedStatement์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ResultSet ์˜ ๊ฐ’๋“ค์„
       ์ž๋ฐ” ๋นˆ๊ณผ ๊ฐ์ฒดํ™”๊ฐ€ ์‰ฌ์šด ๋งคํ•‘์„ ์‹œ์ผœ์ฃผ์–ด
       ์ž๋ฐ” ์ฝ”๋“œ์˜ ๊ฐ์†Œ์— ๋„์›€์„ ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, 
       ์˜คํ”ˆ ์†Œ์Šค๋กœ๋Š” mybatis(ibatis), Hibernate ๋“ฑ์ด ์žˆ๋‹ค.

    โ€ป SQL Mapper
       - ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์‹ค์ œ SQL ๋ฌธ์žฅ์— ๋งคํ•‘. (์ž๋ฐ” ์ฝ”๋“œ์—์„œ SQL ๊ด€๋ จ ๋ถ€๋ถ„์„ ์ œ๊ฑฐ)
       - SQL ๋ฌธ์žฅ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์ˆ ํ•ด์ค€๋‹ค.
       - ๋งคํ•‘ ์ž์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๊ณ„์— ๋…๋ฆฝ์ ์ด๋‹ค.
         (mapping ์ž์ฒด๊ฐ€ SQL ๋ฌธ์— ๊ตญํ•œ)
       - ์‹ค์ œ์ ์œผ๋กœ ๋ชจ๋“  ์ž„๋ฒ ๋””๋“œ SQL ์‹œ์Šคํ…œ์€ ๋ชจ๋‘ SQL Mapper๋กœ ๊ฐ„์ฃผ ๊ฐ€๋Šฅ
       - ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis) SQL Map ์˜ ๊ฒฝ์šฐ
         XML ์— ์ž„๋ฒ ๋””๋“œ๋œ SQL. (์ž๋ฐ” ์ฝ”๋“œ์˜ SQL์„ XML ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ)

    โ—‹ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis) ๊ฐœ์š”
       mybatis ๋Š” persistence(์˜์†์ ์ธ, ์†Œ๋ฉธ๋˜์ง€ ์•Š๊ณ  ์˜ค๋ž˜๋„๋ก ์ง€์†๋˜๋Š”) ๊ณ„์ธต์˜
       ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ
       ์ •ํ˜•ํ™”๋œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ 
       SQL ๊ตฌ๋ฌธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ
       ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์ •๊ทœํ™”๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„ ํ…Œ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์ด
       ๊ธฐ์กด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์—์„œ ์‚ฌ์šฉํ•œ SQL ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ,
       SQL ์— ์ ์šฉํ•œ ๊ฐ๊ฐ์˜ ํŠœ๋‹ ํ•ญ๋ชฉ๋“ค๋„ ๋ชจ๋‘ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

       mybatis ํ”„๋กœ์ ํŠธ๋Š” mybatis SQL Map ๊ณผ mybatis DAO ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
       ์ด ์ค‘, mybatis SQL Map ์€ SQL ๋ฌธ ๊ด€๋ฆฌ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค.
       mybatis DAO ์ปดํฌ๋„ŒํŠธ๋Š” hibernate ์™€ mybatis SQL Map ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
       ํŠธ๋žœ์žญ์…˜ ํ†ตํ•ฉ๊ณผ ๊ฐ™์€ ์ €์žฅ ๋งค์ปค๋‹ˆ์ฆ˜์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค.

       mybatis Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ 
       ํ•„์š”ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ํ˜„์ €ํ•˜๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ
       ๊ฐ„๋‹จํ•œ XML ์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž๋ฐ” ๋นˆ์ฆˆ๋ฅผ SQL Statement ์— ๋งคํ•‘์‹œํ‚จ๋‹ค.
       ๊ฐ„๋‹จํ•จ(Simpleicity)์ด๋ž€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘ ๋„๊ตฌ์™€ ๋น„๊ตํ•˜์—ฌ
       mybatis์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋‹ค. 
       mybatis Data Mapper ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋ฐ” ๋นˆ์ฆˆ์™€ XML ๊ทธ๋ฆฌ๊ณ  SQL ์— ๋Œ€ํ•œ
       ์„ ์ˆ˜์ง€์‹์ด ํ•„์š”ํ•˜๋ฉฐ Data Mapper ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด
       ์‹ค์ œ SQL ๋ฌธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

       ๊ฐ์ฒด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„ ๋งคํ•‘์„ ์„ค์ •ํ•˜๋ฉด
       SQL ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” hibernate ์— ๋น„ํ•ด SQL ๋ฌธ ์ž๋™ ์ƒ์„ฑ ๊ธฐ๋Šฅ์ด ์—†๋Š”
       mybtis ์˜ SQL Mapper ๋Š” ์ง„์ •ํ•œ ์˜๋ฏธ์˜ ORM ์ด ์•„๋‹ˆ๋ผ๋Š” ๋ถ„์œ„๊ธฐ๋„ ์žˆ์—ˆ์ง€๋งŒ
       ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋งค๊ฐœ์ฒด์ธ SQL ๋ฌธ๊ณผ ๊ฐ์ฒด๋ฅผ
       ๋งคํ•‘์‹œ์ผœ์ค€๋‹ค๋Š” ์˜๋ฏธ์—์„œ SQL Mapper ๋˜ํ•œ ORM ์œผ๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

    โ—‹ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis)์˜ ํŠน์ง•
      
       - ํ”„๋ ˆ์ž„์›Œํฌ(ํ™˜๊ฒฝ, ํˆด, ์•ฝ์†)
         ·mybatis ๋Š” JDBC ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.
         ·๊ฐœ๋ฐœ์ž๋Š” SQL ์„ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ์•ฝ์†ํ•˜๊ณ 
    ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” JDBC ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ๋กœ ์•ฝ์†ํ•œ๋‹ค. 

       - ๊ฐ„๋‹จํ•œ 
    ·๊ฐ„๋‹จํ•œ ํผ์‹œ์Šคํ„ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ
    ·JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ try / catch / finally ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

       - ์ƒ์‚ฐ์„ฑ
    ·JDBC์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ 62%์ •๋„ ์ค„์–ด๋“œ๋Š” ์ฝ”๋“œ์™€ ๊ฐ„๋‹จํ•œ ์„ค์ •
      (๊ทผ๊ฑฐ : ์ดํƒˆ๋ฆฌ์•„๋‚˜์ž๋ฐ” ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์˜ ์—ฐ๊ตฌ)

       - ์„ฑ๋Šฅ
    ·๊ตฌ์กฐ์  ๊ฐ•์ (๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” join๋งคํ•‘)
    ·์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „๋žต.(๊ฐ€์ ธ์˜ค๊ธฐ ๋ฏธ๋ฃจ๊ธฐ, SQL ์ค„์ด๊ธฐ ๊ธฐ๋ฒ• ๋“ฑ)

       - ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ
    ·์„ค๊ณ„๋ฅผ ํ–ฅ์ƒ(์ฐจํ›„ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด)
    ·๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๊ณ„์ธตํ™”๋ฅผ ์ง€์›(Connection, PrepareStatement, ResultSet ๋“ฑ)

       - SQL ๋ฌธ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ๋ถ„๋ฆฌ.

       - ์ž‘์—…์˜ ๋ถ„๋ฐฐ : ํŒ€์„ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ์—…๋ฌด ๊ตฌ๋ถ„์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๊ฒƒ์„ ๋„์›€
     
       - ์ด์‹์„ฑ : ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ๋„ ๊ตฌํ˜„๊ฐ€๋Šฅ (JAVA, C#, RUBY ๋“ฑ)
       
       - ์˜คํ”ˆ์†Œ์Šค : ๋ฌด๋ฃŒ + ์ปค๋ฎค๋‹ˆํ‹ฐ

       - SQL Mapper
    ·๊ธฐ๋ณธ์ ์œผ๋กœ ORM์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•จ์œผ๋กœ์จ
      ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ์ง€๋งŒ,
        ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค๋Š” SQL์„ ์ž‘์„ฑ ๋ฐ ๋ช…์‹œํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

       - ์Šคํ”„๋ง๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
     
       - ์Šคํ”„๋ง ์—ฐ๋™ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง๊ณผ ์—ฐ๋™ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


    โ—‹ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis) ์ž‘๋™ ์›๋ฆฌ

       Data Mapper ๋Š” ์ž๋ฐ” ๋นˆ์ฆˆ, Map ๊ตฌํ˜„, ์›์‹œ ๋ž˜ํผ ํƒ€์ž… (String, Integer, ...)
       ๊ทธ๋ฆฌ๊ณ   SQL ๋ฌธ์„ ์œ„ํ•ด XML ๋ฌธ์„œ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ XML ์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š”
       ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

       1) ํŒŒ๋ผ๋ฏธํ„ฐ(์ž๋ฐ” ๋นˆ์ฆˆ, Map ๋˜๋Š” ์›์‹œ๋ž˜ํผ)๋กœ์จ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
          ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋Š” update ๋ฌธ ๋‚ด๋ถ€์— ์ž…๋ ฅ ๊ฐ’์„ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜
          ์ฟผ๋ฆฌ๋ฌธ์˜ where ์ ˆ์„ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

       2) ๋งคํ•‘๋œ statement๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
          Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ๋Š” PrepareStatement ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
          ์ œ๊ณต๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ธํŒ…ํ•œ๋‹ค.
          ๊ทธ๋ฆฌ๊ณ  statement ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ResultSet ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

       3) update๋ฌธ์˜ ๊ฒฝ์šฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ rows์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
          ์กฐํšŒ๋ฌธ์ผ ๊ฒฝ์šฐ์— ํ•œ ๊ฐœ (single)์˜ ๊ฐ์ฒด ๋˜๋Š” ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
          ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋Š” ์ž๋ฐ” ๋นˆ์ฆˆ, Map, ์›์‹œ ๋ž˜ํผ, XML ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

    โ—‹ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis) ์ž‘๋™ ํ๋ฆ„

       - ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด DAO ๋Š” mybatis ์— ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
       - mybatis ๋Š” SQL ๋ฌธ์ด ์ €์žฅ๋œ ๋งคํผ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ SQL๋ฌธ์„ ์ฐพ๋Š”๋‹ค.
       - mybatis ๋Š” ๋งคํผ ํŒŒ์ผ์—์„œ ์ฐพ์€ SQL๋ฌธ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ ์ž JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
       - JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” SQL ๋ฌธ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ ์ „์†กํ•œ๋‹ค.
       - mybatis๋Š” select๋ฌธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ’ ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
         (insert, update, delete ๋ฌธ์ธ ๊ฒฝ์šฐ ์ž…๋ ฅ, ๋ณ€๊ฒฝ, ์‚ญ์ œ๋œ ๋ ˆ์ฝ”๋“œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.)

    โ—‹ ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค(mybatis)๊ด€๋ จ ์‚ฌ์ดํŠธ

       - ibatis์ด์ „ ํ™ˆํŽ˜์ด์ง€
         http://ibatis.apache.org/

       - mybatis ์ƒˆ ํ™ˆํŽ˜์ด์ง€
         http://www.mybatis.org/

       - ๋‹ค์šด๋กœ๋“œ
         ·mybatis
           http://blog.mybatis.org/p/products/html
         ·spring ์—ฐ๋™
           http://github.com/mybatis/spring/release

       - ๋„์›€๋ง
          http://mybatis.github.io/mybatis-3/ko/getting-starged.html

       - API
          http://ibatis.apache.org/docs/java/dev

    โ€ป ์ฐธ๊ณ 

       - 2.3.0.677 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” jarํŒŒ์ผ๋“ค(/lib ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด)์ด
         ibatis-2.3.0.677.jar ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ๋˜์—ˆ๋‹ค.
       - ibatis-common-2.jar
         : SQL Maps์™€ DAO ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ํฌํ•จ
       - ibatis-sqlmap-2.jar
         : SQL Maps ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ
       - ibatis-dao-2.jar
         : DAO ํ”„๋ ˆ์ž„์›Œํฌ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ

    โ—‹ ์ฃผ์š” ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค

      - SqlSessionFactoryBuilder
        ·SqlSessionFactory ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
          ๊ณ„์† ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

      - SqlSessionFactory
        ·SqlSessionFactory ๊ฐ์ฒด๊ฐ€ mybatis ์˜ ์ „๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์ œ์–ดํ•œ๋‹ค.
        ·SqlSessionFactory ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด SqlSessionFactoryBuilder ๊ฐ์ฒด๋ฅผ
          ๋จผ์ € ์ƒ์„ฑํ•œ๋‹ค.
        ·SqlSessionFactory ๊ฐ์ฒด๋Š” SqlSessionFactoryBuilder ์˜ build ๋ฉ”์†Œ๋“œ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
        ·SqlSessionFactory ๊ฐ์ฒด๊ฐ€  mybatis ์˜ ์ „๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ–๋Š” ํŠน์„ฑ์œผ๋กœ ์ธํ•ด
          ์ด ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํ•œ ๊ฐœ๋งŒ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

      - SqlSessionFactory ์—์„œ SqlSession ๊ฐ์ฒด ์ƒ์„ฑ
        ·SqlSessionFactory ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด SqlSession ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
        ·SqlSession ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด  SQL ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด
          ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
          ๊ทธ๋ž˜์„œ SqlSssion ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์ง์ ‘ SQL๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

          ex)
          Reader reader = Resource.getResourceAsReader("mybatis/mybatis-config.xml");
          SqlSessionFactory factory = new SqlSessionFactoryBuilder().builder(reader);
          SqlSession session = factory.openSession();

       - SqlSession
         ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋Š” ์ž์ฒด์ ์œผ๋กœ SqlSession ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
         SqlSession ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ ์š”์ฒญ์„ ๋ฐ›์€ ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
         ๋”ฐ๋ผ์„œ SqlSession ์ธ์Šคํ„ด์Šค๋Š” ๊ณต์œ ๋˜์ง€ ์•Š๊ณ , 
         thread safetyํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง€์ง€๋„ ์•Š์•˜๋‹ค.
         (์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ์ •๋ณด๊ฐ€ ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ)
         ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ธ์Šคํ„ด์Šค๋ฅด ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
         ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ํด๋ž˜์Šค ์•ˆ์— static๋ณ€์ˆ˜๋‚˜, ์„œ๋ธ”๋ฆฟ์˜ HttpSession  ๊ณผ ๊ฐ™์€
         ๊ด€๋ฆฌ ๋ฒ”์œ„ ์•ˆ์— ์ €์žฅํ•ด์„œ๋„ ์•ˆ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
         ๋งŒ์•ฝ, ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” Http ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ๋งŒ๋“ค๊ณ 
         ์‘๋‹ต์„ ๋ฆฌํ„ดํ•  ๋•Œ ๋งˆ๋‹ค SqlSession ์„ ๋‹ซ์•„์•ผ(๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜๋‚ฉํ•ด์•ผ)ํ•œ๋‹ค.
         SqlSession ์ด ๋‹ซํžˆ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜๋ฏ€๋กœ
         ๊ผญ ๋‹ซ์•„์•ผ ํ•œ๋‹ค.

         ex)
        
         ...
         SqlSession session = SqlSessionFactory.openSession();
         try
         {
    ...
         }
         finally
         {
            session.close();    // โ—€โ—€โ—€โ—€
         }

       - Mapper ์ธ์Šคํ„ด์Šค
         Mapper ๋Š” SQL ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•ด๋†“์€๋Œ€๋กœ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
         Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” SqlSession ์—์„œ ์ƒ์„ฑํ•œ๋‹ค. 
         ๊ทธ๋ž˜์„œ Mapper ์ธ์Šคํ„ด์Šค์˜ ๊ฐ€์žฅ ์ข‹์€ ์Šค์ฝ”ํ”„๋Š” SqlSession ๊ณผ ๋™์ผํ•˜๋‹ค.
         ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๋ฉด ์ƒ์„ฑ๋˜๊ณ  ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์—
         ๋ช…์‹œ์ ์œผ๋กœ ๋‹ซ์„ ํ•„์š”๋Š” ์—†๋‹ค.

         ex)
         ...
         SqlSession session = SqlSessionFactory.openSession();
         try
         {
            BolgMapper mapper = session.getMapper(BlogMapper.class);
         }
         finally
         {
            session.close();
         }

       - Mapper XML ํŒŒ์ผ
         mybatis์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋งคํ•‘๋œ ๊ตฌ๋ฌธ์ด๋ฉฐ,
         SQL Map XML ํŒŒ์ผ์„ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๋‹ค.
         ๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ๊ธฐ๋Šฅ์˜ JDBC ์ฝ”๋“œ์™€ ๋น„๊ตํ•˜๋ฉด ๋‹ค๋Ÿ‰์˜ ์ฝ”๋“œ๊ฐ€ ๊ฐ์†Œํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
         ์ฆ‰, mybatis ๋Š” SQL ์„ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•˜๋Œ๊ณ  ๋งŒ๋“ค์–ด์กŒ๋‹ค.

         โ€ป SQL Map XML ํŒŒ์ผ์€ ์ฒซ ๋ฒˆ์งธ (first class)์š”์†Œ๋งŒ์„ ๊ฐ€์ง„๋‹ค.

         ·cache     : ํ•ด๋‹น ๋ช…๋ช…๊ณต๊ฐ„์„ ์œ„ํ•œ ์บ์‹œ ์„ค์ •
         ·cache-ref    : ๋‹ค๋ฅธ ๋ช…๋ช…๊ณต๊ฐ„์˜ ์บ์‹œ ์„ค์ •์— ๋Œ€ํ•œ ์ฐธ์กฐ
         ·resultMap    : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ์š”์†Œ
         ·parameterMap : ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ
             ๊ณผ๊ฑฐ์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์œผ๋‚˜
          ํ˜„์žฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
         ·sql      : ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ SQL ์กฐ๊ฐ
         ·insert      : ๋งคํ•‘๋œ insert ๊ตฌ๋ฌธ
         ·update      : ๋งคํ•‘๋œ update ๊ตฌ๋ฌธ
         ·delete      : ๋งคํ•‘๋œ delete ๊ตฌ๋ฌธ
         ·select     : ๋งคํ•‘๋œ select ๊ตฌ๋ฌธ 

     

    4. Mybatis Framework ํ™˜๊ฒฝ์„ค์ •.txt

    ๋”๋ณด๊ธฐ

    โ– โ– โ–  Mybatis Framework ํ™˜๊ฒฝ์„ค์ • โ– โ– โ– 

    1. ใ€Žhttp://blog.mybatis.org/ใ€ ์—์„œ mybatis ๋‹ค์šด๋กœ๋“œ

      - Products ๋ฉ”๋‰ด ์„ ํƒ(ํด๋ฆญ)
        → ใ€Žhttps://blog.mybatis.org/p/products.htmlใ€ ๋กœ ์ด๋™
      
      - ์ด๋™ํ•œ ํŽ˜์ด์ง€์˜ Products ํ•ญ๋ชฉ์˜ ๋ฆฌ์ŠคํŠธ๋“ค ์ค‘
        ใ€ŽMyBatis 3 SQL Mapping Framework for Javaใ€์—์„œ
         download ๋ฉ”๋‰ด ์„ ํƒ(ํด๋ฆญ)
         → ใ€Žhttps://github.com/mybatis/mybatis-3/releasesใ€๋กœ ์ด๋™
      
      - ์ด๋™ํ•œ ํŽ˜์ด์ง€์—์„œ ใ€ŽMybatis 3.5.10ใ€ ํ•ญ๋ชฉ์˜
        ใ€Žโ–ถ Assetsใ€ ์„ ํƒ(ํด๋ฆญ) → ใ€Žโ–ผ Assetsใ€ ํ˜•ํƒœ๋กœ ๋…ธ๋“œ ํ™•์žฅ

      - ํ™•์žฅ๋œ ๋…ธ๋“œ์˜ ๋ชฉ๋ก๋“ค ์ค‘ ใ€Žmybatis-3.5.10.zip 3.69 MB May 24, 2022ใ€ ์„ ํƒ (ํด๋ฆญ)
        → ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์ง„ํ–‰

      - ๋‹ค์‹œ ์›น๋ธŒ๋ผ์šฐ์ € ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์„ ํƒ(ํด๋ฆญ)
        → ใ€Žhttps://blog.mybatis.org/p/products.htmlใ€๋กœ ์ด๋™

      - ์ด๋™ํ•œ ํŽ˜์ด์ง€์˜ Integration ํ•ญ๋ชฉ์˜ ๋ฆฌ์ŠคํŠธ๋“ค ์ค‘
        ใ€ŽSpring Integration with Springใ€์—์„œ
         download ๋ฉ”๋‰ด ์„ ํƒ(ํด๋ฆญ)
         → ใ€Žhttps://github.com/mybatis/spring/releasesใ€๋กœ ์ด๋™

      - ์ด๋™ํ•œ ํŽ˜์ด์ง€์—์„œ ใ€Žmybatis-spring-1.3.2ใ€ ํ•ญ๋ชฉ์˜
        ใ€Žโ–ถ Assetsใ€ ์„ ํƒ(ํด๋ฆญ) → ใ€Žโ–ผ Assetsใ€ ํ˜•ํƒœ๋กœ ๋…ธ๋“œ ํ™•์žฅ

      - ํ™•์žฅ๋œ ๋…ธ๋“œ์˜ ๋ชฉ๋ก๋“ค ์ค‘ ใ€Žmybatis-spring-1.3.2.zip 52.1 KB Mar 14, 2018ใ€ ์„ ํƒ(ํด๋ฆญ)
        → ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์ง„ํ–‰

    2. ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ๋œ ํŒŒ์ผ์„ ์••์ถ• ํ•ด์ œํ•˜์—ฌ ์•„๋ž˜์˜ ํŒŒ์ผ์„ ์ค€๋น„ํ•œ๋‹ค.

      - mybatis-3.5.10.jar
      - mybatis-spring-1.3.2.jar

    3. SpringMVC + mybatis ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋ก
       - org.springframework.aop-3.0.2.RELEASE.jar
       - org.springframework.asm-3.0.2.RELEASE.jar
       - org.springframework.beans-3.0.2.RELEASE.jar
       - org.springframework.context-3.0.2.RELEASE.jar
       - org.springframework.core-3.0.2.RELEASE.jar
       - org.springframework.expression-3.0.2.RELEASE.jar
       - org.springframework.jdbc-3.0.2.RELEASE.jar
       - org.springframework.transaction-3.0.2.RELEASE.jar
       - org.springframework.web-3.0.2.RELEASE.jar
       - org.springframework.web.servlet-3.0.2.RELEASE.jar
     
       - cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar
       
       - ojdbc6.jar
       
       - jstl.jar
       - standard.jar

         +

       - mybatis-3.5.10.jar
       - mybatis-spring-1.3.2.jar

    โ€ป ๋งคํผ XML ์ƒ˜ํ”Œ
     
       ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ pdf ํŒŒ์ผ(mybatis-3.5.10.pdf)์˜ ๋‚ด์šฉ ์ค‘
       ใ€Ž2.1.5 Exploring Mapped SQL Statementsใ€ํ•ญ๋ชฉ์˜
       XML ๊ด€๋ จ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์—ฌ ์ƒ˜ํ”Œ DTD ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
       (→ pdf ํŒŒ์ผ์˜ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ 4)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
    </select>
    </mapper>

    -------------------------------------------------------------------------------------
    โ– โ– โ–  Spring MVC + Annotation + mybatis ํ”„๋กœ์ ํŠธ ์‹ค์Šต 01 โ– โ– โ– 

    โ—‹ ํ”„๋กœ์ ํŠธ
       : MybatisWork01

    โ—‹ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋ก ๋ฐ ํ™˜๊ฒฝ๊ตฌ์„ฑ (โ€ป ์œ„์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ฐธ์กฐ)
       ..

    โ—‹ ๊ธฐ๋Šฅ ๊ตฌํ˜„
       : ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค ํ™˜๊ฒฝ ๊ตฌ์„ฑ ํ›„ ํ”„๋กœ์ ํŠธ ์ •์ƒ ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ


    -------------------------------------------------------------------------------------
    โ– โ– โ–  Spring MVC + Annotation + mybatis ํ”„๋กœ์ ํŠธ ์‹ค์Šต 02 โ– โ– โ– 

    โ—‹ ํ”„๋กœ์ ํŠธ
       : MybatisWork02

    โ—‹ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋ก ๋ฐ ํ™˜๊ฒฝ๊ตฌ์„ฑ (โ€ป ์œ„์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ฐธ์กฐ)
       ..

    โ—‹ ๊ธฐ๋Šฅ ๊ตฌํ˜„
       : ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ์–ด๋‚ด์–ด ํ™”๋ฉด์— ์ถœ๋ ฅ
         ์ด ๊ณผ์ •์—์„œ mybatis ํ™œ์šฉ.

    โ—‹ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๊ฐ์ฒด ์ค€๋น„
       - ์‚ฌ์šฉ ๊ณ„์ • : scott
       - ํ…Œ์ด๋ธ” : TBL_MEMBERLIST
       - ํ…Œ์ด๋ธ” ๊ตฌ์กฐ : MID NUMBER      --PK
                       , NAME VARCHAR2(30)
       , TELEPHONE VARCHAR2(40)
       - ์‹œํ€€์Šค : MEMBERLISTSEQ

    โ—‹ ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ
       ํšŒ์› ๊ด€๋ฆฌ
     
       ์ด๋ฆ„ [ ]
       ์ „ํ™” [  ]

        < ํšŒ์› ์ถ”๊ฐ€ >

        ์ „์ฒด ์ธ์› ์ˆ˜ : 2๋ช…
        ----------------------
         ๋ฒˆํ˜ธ  ์ด๋ฆ„     ์ „ํ™”
          1    ๋…ธ์€ํ•˜   010-11..
          2    ์ด์ฃผํ˜•   010-22..
        ----------------------

    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ

       - MybatisWork02_scott.sql → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ์ž‘์—…
       
       - MemberDTO.java → ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํด๋ž˜์Šค(DTO)
       - IMemberDAO.java → ์ธํ„ฐํŽ˜์ด์Šค
       - MemberDAO.xml → mybatis ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ํ™œ์šฉ
       - MemberMain.java         → mybatis ๊ฐ์ฒด ํ™œ์šฉ(Controller)
       - MemberList.jsp         → view ํŽ˜์ด์ง€ ํ™œ์šฉ

       - dispatcher-servlet.xml → mybatis ๊ฐ์ฒด ๋“ฑ๋ก ๋ฐ ํ™œ์šฉ
       - web.xml → front Controller ๋“ฑ๋ก ๋ฐ ์ธ์ฝ”๋”ฉ ์„ค์ • (ํ•„ํ„ฐํ™œ์šฉ)

    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
       http://localhost:3306/MybatisWork02/memberlist.action



    -------------------------------------------------------------------------------------
    โ– โ– โ–  Spring MVC + Annotation + mybatis ํ”„๋กœ์ ํŠธ ์‹ค์Šต 03 โ– โ– โ– 

    โ—‹ ํ”„๋กœ์ ํŠธ
       : MybatisWork03

    โ—‹ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๋ก ๋ฐ ํ™˜๊ฒฝ๊ตฌ์„ฑ (โ€ป ์œ„์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ฐธ์กฐ)
       ..

    โ—‹ ๊ธฐ๋Šฅ ๊ตฌํ˜„
       : ๊ธฐ๋ณธ์ ์ธ ์„ฑ์  ๊ด€๋ฆฌ
         ์ด ๊ณผ์ •์—์„œ mybatis ํ™œ์šฉ

    โ—‹ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๊ฐ์ฒด ์ค€๋น„
       - ์‚ฌ์šฉ ๊ณ„์ • : scott
       - ํ…Œ์ด๋ธ” : TBL_STUDENT
       - ํ…Œ์ด๋ธ” ๊ตฌ์กฐ : SID NUMBER      --PK
                       , NAME VARCHAR2(30)
       , TEL VARCHAR2(40)

       - ํ…Œ์ด๋ธ” : TBL_GRADE
       - ํ…Œ์ด๋ธ” ๊ตฌ์กฐ : SID NUMBER      --PK
                       , SUB1 NUMBER(3)
       , SUB2 NUMBER(3)
       , SUB3 NUMBER(3)

       - ๋ทฐ : STUDENTVIEW
          ·๋ทฐ ๊ตฌ์กฐ : SID, NAME, TEL, SUB
      ---- ์ฐธ์กฐ ๋ ˆ์ฝ”๋“œ ์ˆ˜
       - ๋ทฐ : GRADEVIEW
          ·๋ทฐ ๊ตฌ์กฐ : SID, NAME, SUB1, SUB2, SUB3, TOT, AVG, CH
           ---- ---  ---
           ์ด์  ํ‰๊ท  ๋“ฑ๊ธ‰(ํ•ฉ๊ฒฉ, ๊ณผ๋ฝ, ๋ถˆํ•ฉ๊ฒฉ)



    โ—‹ ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ตฌ์„ฑ

       - MybatisWork03_scott.sql → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ์ž‘์—…
       
       - StudentDTO.java → ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํด๋ž˜์Šค(DTO)
       ํ•™์ƒ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ „์†ก

       - GradeDTO.java → ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํด๋ž˜์Šค(DTO)
       ์„ฑ์  ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ „์†ก

       - IStudentDAO.java → ์ธํ„ฐํŽ˜์ด์Šค
       ํ•™์ƒ ๋ฐ์ดํ„ฐ ์•ก์…˜ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ์„ ์–ธ
       - IGradeDAO.java → ์ธํ„ฐํŽ˜์ด์Šค
       ์„ฑ์  ๋ฐ์ดํ„ฐ ์•ก์…˜ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ์„ ์–ธ

       - StudentDAO.xml → mybatis ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ํ™œ์šฉ
       - GradeDAO.xml → mybatis ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ ํ™œ์šฉ

       - StudentController.java     → Controller
       - GradeController.java → Controller

       - StudentList.jsp       → View ํŽ˜์ด์ง€
           (ํ•™์ƒ ๋ช…๋‹จ ์ถœ๋ ฅ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ)
       - StudentInsertForm.jsp → View ํŽ˜์ด์ง€
           (ํ•™์ƒ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ํผ ๊ตฌ์„ฑ)
       - GradeList.jsp       → View ํŽ˜์ด์ง€
           (์„ฑ์  ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ)
       - GradeInsertForm.jsp → View ํŽ˜์ด์ง€
           (์„ฑ์  ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ํผ ๊ตฌ์„ฑ)


       - dispatcher-servlet.xml → mybatis ๊ฐ์ฒด ๋“ฑ๋ก ๋ฐ ํ™œ์šฉ
       - web.xml → front Controller ๋“ฑ๋ก ๋ฐ ์ธ์ฝ”๋”ฉ ์„ค์ • (ํ•„ํ„ฐํ™œ์šฉ)

    โ—‹ ์‚ฌ์šฉ์ž ์ตœ์ดˆ ์š”์ฒญ ์ฃผ์†Œ
       http://localhost:3306/MybatisWork03/studentlist.action

    5. ํŒŒ์ผ์‹œ์Šคํ…œ ๋ฐ ํŒŒ์ผ์—…๋กœ๋“œ.txt

    ๋”๋ณด๊ธฐ

    โ– โ– โ–  ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฐ ํŒŒ์ผ ์—…๋กœ๋“œ.txt โ– โ– โ– 

    โ—‹ java.io.FileInputStream ํด๋ž˜์Šค

      ์ž๋ฐ”์—์„œ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ž…์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด
      FileInputStream ํด๋ž˜์Šค์™€ FileOutputStream ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

      โ€ป  FileInputStream ํด๋ž˜์Šค
    : ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ์–ด๋“ค์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
      โ€ป  FileInputStream ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์ผ ๋•Œ์—๋Š”
          ๋ฐ์ดํ„ฐ์†Œ์Šค์ธ ํŒŒ์ผ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
          (์ด ๋•Œ, ์ง€์ •ํ•œ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ IOExcepion ๋ฐœ์ƒ)
      โ€ป  FileInputStream ํด๋ž˜์Šค๋Š” Inputstream ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฏ€๋กœ
          InputStream ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
          (InputStream ํด๋ž˜์Šค๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ด๋ฉฐ ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค.)

      - ์ƒ์„ฑ์ž
      · FileInputStream(File file)
         : ์ฃผ์–ด์ง„ File ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ๊ธฐ ์œ„ํ•œ
           FileInputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      · FileInputStream(FileDescriptor fdObj)
         : ์ฃผ์–ด์ง„ FileDescriptor ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ๊ธฐ ์œ„ํ•œ
           FileInputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      · FileInputStream(String name)
         : ์ฃผ์–ด์ง„ ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ๊ธฐ ์œ„ํ•œ
           FileInputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    โ—‹ java.io.FileOutputStream ํด๋ž˜์Šค

       FileOutputStream ํด๋ž˜์Šค๋Š”
       ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
       ํŒŒ์ผ๋ช…์ด๋‚˜ File ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ
       ์‹œ์Šคํ…œ์— ํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
       ๊ธฐ๋ณธ์ ์œผ๋กœ(default) ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฎ์—ˆ๊ธ”๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—
       ๊ธฐ์กด์˜ ๋‚ด์šฉ์€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

       โ€ปFileOutputStream ํด๋ž˜์Šค๋Š” OutputStream ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฏ€๋กœ
         OutputStream ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.   

      - ์ƒ์„ฑ์ž
      · FileOutputStream(File file)
         : ์ฃผ์–ด์ง„ File ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ
           FileOutputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
           ๊ธฐ์กด์˜ ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ (default) ๊ทธ ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ 
           ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.(๋ฎ์–ด์“ฐ๊ธฐ)
      · FileOutputStream(FileDescriptor fdObj)
         : ์ฃผ์–ด์ง„ FileDescriptor ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ
           FileOutputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
           ๊ธฐ์กด์˜ ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ (default) ๊ทธ ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ 
           ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.(๋ฎ์–ด์“ฐ๊ธฐ)
      · FileOutputStream(String name)
         : ์ฃผ์–ด์ง„ ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ
           FileOutputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
           ๊ธฐ์กด์˜ ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ (default) ๊ทธ ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ 
           ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.(๋ฎ์–ด์“ฐ๊ธฐ)
      · FileOutputStream(String name, boolean append)
         : ์ฃผ์–ด์ง„ ์ด๋ฆ„์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•œ
           FileOutputStream ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
           ๊ธฐ์กด์˜ ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ append ๋กœ ์„ค์ •๋œ ๊ฐ’์— ๋”ฐ๋ผ(true / false)
           ๊ทธ ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜(false) ๊ธฐ์กด์˜ ๋‚ด์šฉ์— ์ถ”๊ฐ€ํ•œ๋‹ค.(true)

    โ—‹ java.io.FileReader ํด๋ž˜์Šค

      FileReader ํด๋ž˜์Šค๋Š”
      ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ๋ฅผ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฝ์–ด๋“ค์ด๊ณ ,
      ํŒŒ์ผ ์“ฐ๊ธฐ ํด๋ž˜์Šค์ธ FileWriter ํด๋ž˜์Šค๋Š”
      ์ถœ๋ ฅํ•  ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ์‹œ์Šคํ…œ์— ๋งž๋Š” ๋””ํดํŠธ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ
      ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

      FileReader ํด๋ž˜์Šค๋Š”
      ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฌธ์ž์—ด์„ ์ฝ์–ด๋“ค์ด๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ,
      ์ด ํด๋ž˜์Šค๋Š” InputStreamReader ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ๊ฒƒ์œผ๋กœ
      ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์ฝ์–ด์„œ ๊ทธ ๋ฐ”์ดํŠธ๋ฅผ ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ํƒ€์ž…์˜ ๊ฐ’์œผ๋กœ
      ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

      FileReader ํด๋ž˜์Šค ์—ญ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์ผ ์†Œ์Šค์ธ ํŒŒ์ผ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋ฉฐ,
      ์ง€์ •ํ•œ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ FileNotFoundException ์„ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

      - ์ƒ์„ฑ์ž 
    ·FileReader(File file)
      : ์ฃผ์–ด์ง„ File ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ FileReader ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
    ·FileReader(FileDescriptor fd)
      : ์ฃผ์–ด์ง„ FileDescriptor ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ FileReader ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
    ·FileReader(String fileName)
      : ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์—ด์–ด FileReader ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

    โ—‹ java.io.FileWriter ํด๋ž˜์Šค

      FileWriter ํด๋ž˜์Šค๋Š”
      ํŒŒ์ผ ๋ฌธ์ž ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ถœ๋ ฅํ•  ๋ฌธ์ž๋ฅผ ๋””ํดํŠธ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ
      ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      ์ด ํด๋ž˜์Šค๋Š” OutputStreamWriter ํด๋ž˜์Šค์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋กœ
      ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.
      FileOutputStream ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
      ํŒŒ์ผ๋ช…์ด๋‚˜ File ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ
      ์‹œ์Šคํ…œ์— ํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
      ๊ธฐ๋ณธ์ ์œผ๋กœ(default) ํ•ด๋‹น ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฎ์–ด์“ฐ๊ธฐ ํ•˜๊ฒŒ ๋œ๋‹ค.

      - ์ƒ์„ฑ์ž
    ·FileWriter(File file)
      : ์ฃผ์–ด์ง„ File ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ FileWriter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ·FileWriter(FileDescriptor fd)
      : ์ฃผ์–ด์ง„ FileDescriptor ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ FileWriter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ·FileWriter(String fileName)
      : ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์—ด์–ด FileWriter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ·FileWriter(String fileName, boolean append)
      : ์ฃผ์–ด์ง„ ํŒŒ์ผ์„  append ๊ฐ’์— ๋”ฐ๋ผ(true / false)
            ์ฝ๊ธฐ / ์ถ”๊ฐ€ ๋ชจ๋“œ๋กœ ์—ด์–ด FileWriter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    โ€ป ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ด€๋ จ(๊ด€๋ฆฌ) ํด๋ž˜์Šค → java.io.File ํด๋ž˜์Šค

      File ํด๋ž˜์Šค๋Š” ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋กœ
      ํŒŒ์ผ์˜ ๋ณต์‚ฌ ๋˜๋Š” ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์กฐ์ž‘์„ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ๋  ๋ฟ
      ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ž…์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค.
      ์ž๋ฐ”์—์„œ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ์„ ใ€Ž์Šค.ํŠธ.๋ฆผใ€์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 
      File ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค.
      ๋‹จ, File ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
      ์ฆ‰, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด File ๊ฐ์ฒด์— ์˜ํ•ด ํ‘œํ˜„๋˜๋Š” ์ถ”์ƒ ๊ฒฝ๋กœ๋ช…์€ ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    โ€ป ํŒŒ์ผ ์—…๋กœ๋“œ

      ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ํผ์„ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ
      - form ํƒœ๊ทธ ์•ˆ์—.. input ํƒœ๊ทธ์˜ type ์†์„ฑ์˜ ์†์„ฑ๊ฐ’์ด
        file ์ธ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”์ฐฝ์„ ์ œ๊ณตํ•œ๋‹ค.
      - ์ด ๋•Œ, method ์˜ ์†์„ฑ์€ post ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ,
        enctype ์†์„ฑ์˜ ์†์„ฑ๊ฐ’์€ ใ€Ž"multipart/form-data"ใ€๋กœ ์ง€์ •ํ•œ ํผ์„ ์ „์†กํ•  ๊ฒฝ์šฐ
      - ๋‹จ, ใ€Ž"multipart/form-data"ใ€๋กœ ์ง€์ •ํ•œ ํผ์„ ์ „์†กํ•  ๊ฒฝ์šฐ
        request ๊ฐ์ฒด๋กœ ์–ป์–ด๋‚ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์œผ๋กœ ๊ฐ’์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์—†๋‹ค.
        ์ด ๋ง์€ ใ€Ž<input type="file">ใ€๋กœ ์ง€์ •๋œ ํŒŒ์ผ์„
        ์„œ๋ฒ„ ์ƒ์˜ ํŠน์ • ๊ฒฝ๋กœ์— ์—…๋กœ๋“œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ใ€ŽํŠน๋ณ„ํ•œ ์ปดํฌ๋„ŒํŠธใ€๊ฐ€
        ํ•„์š”ํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.


    โ€ป ํŠน๋ณ„ํ•œ ์ปดํฌ๋„ŒํŠธ : ใ€Žcos.jarใ€
     
      - ๋‹ค์šด๋กœ๋“œ URL → http://www.servlets.com/cos
      - ๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ → cos-22.05.zip