week 8 incheol - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ˆ  ๋ฌธ์ œ

  • JAVA(์ตœ์ฃผ๋นˆ)
    • ์ž๋ฐ” 8 ํŠน์ง•
      1. Lambda expressions
        • ๋žŒ๋‹ค ํ‘œํ˜„์‹์€ Anonymous Function๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค
      2. Method Reference
        • ํŠน์ • ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ถ•์•ฝํ•œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค
      3. Stream
        • ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ปฌ๋ ‰์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ
        • ์œ„ Stream์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ
        • ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ„ํ• ํ•œ Stream ์ด๋‹ค
      4. Default Method
        • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต ๊ฐ€๋Šฅํ•˜๋‹ค
      5. Optional
        • ๊ฐ’์„ Optional๋กœ ์บก์Šํ™”ํ•˜์—ฌ NullPointerException์„ ๋ง‰๋Š”๋‹ค
      6. CompletaleFuture
        • Future์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅ์‹œ์ผœ์ค€๋‹ค
        • ๋‘ ๊ฐœ์˜ ๋น„๋™๊ธฐ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ๋‹ค
          • ๊ฐ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋…๋ฆฝ์ ์ด๊ฑฐ๋‚˜ ์ข…์†์ ์ผ ์ˆ˜ ์žˆ๋‹ค
        • Future ์ง‘ํ•ฉ์ด ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  ํƒœ์Šคํฌ์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค
        • Future ์ง‘ํ•ฉ์—์„œ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์™„๋ฃŒ๋˜๋Š” ํƒœ์Šคํฌ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค
        • Future๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค
      7. New date / time APIs
        • Joda-Time์˜ ๋งŽ์€ ๊ธฐ๋Šฅ์„ java.time ํŒจํ‚ค์ง€๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค
          • LocalDate, LocalTime, Instant, Duration, Period โ€ฆ
    • String, StringBuilder, StringBuffer ์ฐจ์ด
      • String : immutable ๋ฐ์ดํ„ฐ๋กœ์จ ์ถ”๊ฐ€ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒˆ๋กญ๊ฒŒ ํ• ๋‹น ๋˜๋ฏ€๋กœ ์—ฐ์‚ฐ์ด ๋ณต์žกํ• ์ˆ˜๋ก ๊ฐ€๋น„์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค.
      • StringBuilder : mutable ๋ฐ์ดํ„ฐ์ด๊ณ  ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™๊ธฐํ™” ๋ณด์žฅ์„ ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. (๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ๋” ์šฐ์ˆ˜ํ•˜๋‹ค)
      • StringBuffer : mutable ๋ฐ์ดํ„ฐ์ด๊ณ  ์ถ”๊ฐ€ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด์„œ ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™๊ธฐํ™”๋ฅผ ๋ณด์žฅํ•ด์ค€๋‹ค)
  • SPRING(์ •์ธ์ฒ )
    • dispatcherServlet์ด๋ž€?

      Dispatcher Servlet์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

      Dispatcher Servlet์ด๋ž€ ์™ธ๋ถ€์˜ ์š”์ฒญ์„ ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด Front Controller ํŒจํ„ด์„ ์ ์šฉํ•œ Servlet์ด๋‹ค.

      Q1. ๊ทธ๋ ‡๋‹ค๋ฉด Front Controller ํŒจํ„ด์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

      Front Controller๋Š” ์ฃผ๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ์ œ์ผ ์•ž์—์„œ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ธ๋ฐ, MVC ๊ตฌ์กฐ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ด๋‹ค. ์ด์ „์—๋Š” ์„œ๋ธ”๋ฆฟ์„ ์ปจํŠธ๋กค๋Ÿฌ ๋‹น ํ•˜๋‚˜์”ฉ ๋‘๊ณ  ์žˆ์–ด์„œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์„œ๋ธ”๋ฆฟ ์„ค์ •๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ dispatcher servlet์„ ๋‘๋ฉด์„œ ์ปจํŠธ๋กค๋Ÿฌ ์ถ”๊ฐ€์‹œ ๋ณ„๋„์˜ servlet ์„ค์ •์„ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  dispatcher servlet์„ ํ†ตํ•ด์„œ Tracking์ด๋‚˜ Security๋ฅผ ์ ์šฉํ•  ๋•Œ ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ณ , URL ๊ตฌ์„ฑ์ด ๊ฐ„ํŽธํ•ด์กŒ๋‹ค.

      Dispatcher Servlet ๋™์ž‘ ์ˆœ์„œ

      22

      1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๋ฉด DispatcherServlet์ด ๊ฐ€๋กœ์ฑˆ๋‹ค.

        Q2. ์–ด๋–ป๊ฒŒ dispatcherServlet์ด ์™ธ๋ถ€์˜ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๋Š”๊ฐ€?

        web.xml์— ๋“ฑ๋ก๋œ dispatcherServlet์˜ ์ด '/'์™€ ๊ฐ™์ด ํ•ด๋‹น ์–ดํ”Œ์„ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  URL๋กœ ๋“ฑ๋กํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŠน์ • URL๋งŒ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

        ์Šคํ”„๋ง์€ web.xml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด dispatcher servlet์ ์šฉ url pattern์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

        <servlet>
          <servlet-name>salesServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <!-- contextLoader๊ฐ€ ํ•ด๋‹น ์œ„์น˜์˜ ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด, ํ•ด๋‹น ํŒŒ์ผ์„ dispatcher servlet์œผ๋กœ ๋งŒ๋“ ๋‹ค. -->
          <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/salesServlet-servlet.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
        </servlet>
        
        <!-- /sales๋กœ ์‹œ์ž‘ํ•˜๋Š” url ์š”์ฒญ์„ ๋ฐ›์•„ salesServlet์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. -->
        <servlet-mapping>
          <servlet-name>salesServlet</servlet-name>
          <url-pattern>/sales</url-pattern>
        </servlet-mapping>

        ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” appliation.yml , application.propertiesํŒŒ์ผ์— server.servlet.context-path ์˜ต์…˜์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

      2. DispatcherServlet์€ ๊ฐ€๋กœ์ฑˆ ์ •๋ณด๋ฅผ HandlerMapping ์—๊ฒŒ ๋ณด๋‚ด ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Controller๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค. HandlerMapping์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ „๋žต์€ BeanNamUrlHandlerMapping๊ณผ DefaultAnnotationHandlerMapping์ด ๊ธฐ๋ณธ ์ „๋žต์ด๋‹ค.

        Q3. HandlerMapping์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š” ๋‹ค๋ฅธ ์ „๋žต์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€?

        1. DefaultAnnotationHandlerMapping : @RequestMapping ์ด๋ผ๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์— ์ง์ ‘ ๋ถ€์—ฌํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด ๋งคํ•‘ํ•˜๋Š” ์ „๋žต์ด๋‹ค.
        2. BeanNameUrlHandlerMapping : ๋นˆ ์ •์˜ ํƒœ๊ทธ์—์„œ name attribute์— ์„ ์–ธ๋œ URL๊ณผ class attribute์— ์ •์˜๋œ Controller๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
        3. ControllerClassNameHandlerMapping : Controller์˜ ํด๋ž˜์Šค ์ด๋ฆ„์ค‘ suffix์ธ Controller๋ฅผ ์ œ๊ฑฐํ•œ ๋‚˜๋จธ์ง€ ์ด๋ฆ„์˜ ์†Œ๋ฌธ์ž๋กœ url mappingํ•œ๋‹ค.
        4. SimpleUrlHandlerMapping : Ant-Style ํŒจํ„ด ๋งค์นญ์„ ์ง€์›ํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ Controller์— ์—ฌ๋Ÿฌ URL์„ mapping ํ•  ์ˆ˜ ์žˆ๋‹ค.
      3. ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์—… ์ˆ˜ํ–‰

      4. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์„ ์‘๋‹ต๋ฐ›์„ View์˜ ์ด๋ฆ„์„ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋•Œ View ์ด๋ฆ„์„ ViewResolver๊ฐ€ ๋จผ์ € ๋ฐ›์•„ ํ•ด๋‹นํ•˜๋Š” View๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

      5. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ณด๋‚ด์˜จ View ์ด๋ฆ„์„ ํ† ๋Œ€๋กœ ์ฒ˜๋ฆฌ View๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

      6. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ DispatcherServlet ์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.

      7. DispatcherServlet์€ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•œ๋‹ค.

        Q4. filter์™€ interceptor, aop์˜ ์ˆ˜ํ–‰ ์‹œ์ ์„ dispatcherServlet๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜์‹œ์˜ค

        11

        • filter : dispatcherServlet ์ด์ „๊ณผ ์ดํ›„์— ๋™์ž‘
        • interceptor : dispatcherServlet๊ณผ ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์ด์— ๋™์ž‘
        • aop : interceptor์™€ ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์ด์— ๋™์ž‘
    • JPA Persistence๋ž€?

      ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€?

      • Server side์™€ Database ์‚ฌ์ด์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ์˜์—ญ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.
      • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(Session)๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €(Session)์„ ํ†ตํ•ด์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

      ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ์–ป๊ฒŒ๋˜๋Š” ์žฅ์ 

      • 1์ฐจ ์บ์‹œ

        • Map ๊ฐ์ฒด๋กœ ์ €์žฅ : ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹๋ณ„์ž ๊ฐ’(@Id ๋งตํ•‘)์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. Key-value๋กœ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์ด๋•Œ key ๊ฐ’์ด @Id ๊ฐ’์ด ๋œ๋‹ค.
        • ์‹๋ณ„์ž ๊ฐ’ ํ•„์š” : ์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์‹๋ณ„์ž ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

        Q1. 1์ฐจ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๋‘๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ?

        • OSIV๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

        Q2. 2์ฐจ ์บ์‹œ๋Š” ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜?

        • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๊ฐ€ ์ง€์›ํ•˜๋Š” ์บ์‹œ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
          • ์—”ํ‹ฐํ‹ฐ ์บ์‹œ : ์—”ํ‹ฐํ‹ฐ ๋‹จ์œ„๋กœ ์บ์‹œํ•œ๋‹ค. ์‹๋ณ„์ž๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ปฌ๋ ‰์…˜์ด ์•„๋‹Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
          • ์ปฌ๋ ‰์…˜ ์บ์‹œ : ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ์ปฌ๋ ‰์…˜์„ ์บ์‹œํ•œ๋‹ค. ์ปฌ๋ ‰์…˜์ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉด ์‹๋ณ„์ž ๊ฐ’๋งŒ ์บ์‹œํ•œ๋‹ค. (ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ธฐ๋Šฅ)
            • ๋ฌธ์ œ๋Š” ์ฟผ๋ฆฌ ์บ์‹œ๋‚˜ ์ปฌ๋ ‰์…˜ ์บ์‹œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋Œ€์ƒ ์—”ํ‹ฐํ‹ฐ์— ์—”ํ‹ฐํ‹ฐ ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์„ฑ๋Šฅ์ƒ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
              • โ€œselect m from Member mโ€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์ฟผ๋ฆฌ ์บ์‹œ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค. ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์€ 100๊ฑด์ด๋‹ค.
              • ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—๋Š” ์‹๋ณ„์ž๋งŒ ์žˆ์œผ๋ฏ€๋กœ ํ•œ ๊ฑด์”ฉ ์—”ํ‹ฐํ‹ฐ ์บ์‹œ ์˜์—ญ์—์„œ ์กฐํšŒํ•œ๋‹ค.
              • Member ์—”ํ‹ฐํ‹ฐ๋Š” ์—”ํ‹ฐํ‹ฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•œ ๊ฑด์”ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ๋‹ค.
              • ๊ฒฐ๊ตญ 100๊ฑด์˜ SQL์ด ์‹คํ–‰๋œ๋‹ค.
          • ์ฟผ๋ฆฌ ์บ์‹œ : ์ฟผ๋ฆฌ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•ด์„œ ์บ์‹œํ•œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฉด ์‹๋ณ„์ž ๊ฐ’๋งŒ ์บ์‹œํ•œ๋‹ค. (ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ธฐ๋Šฅ)
      • ๋™์ผ์„ฑ ๋ณด์žฅ

        • ๋™์ผํ•œ ๊ฐ์ฒด ๋ฐ˜ํ™˜ : Collection์—์„œ ๊ฐ์ฒด๋ฅผ ๋นผ์˜ค๋“ฏ์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

        Q3. JPQL์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ฐฑ์‹ ๋˜๋‚˜?

      • ๋ณ€๊ฒฝ ๊ฐ์ง€

        • ์ž๋™ Update : ์˜์†์„ฑ ์ƒํƒœ์˜ ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๋ฉด, ์ž๋™ update ๋œ๋‹ค.
        • EntityManager์—์„œ flush๊ฐ€ ๋˜๊ณ , commit์ด ๋ฉ๋‹ˆ๋‹ค.
          • flush๊ฐ€ ๋˜๋Š” ์‹œ์ 
              1. ๊ฐ•์ œ Flush : EntityManager.flush()
              1. ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ์‹œ : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
              1. JPQL ์ฟผ๋ฆฌ ์‹คํ–‰ : JPQL์€ ์‹ค์ œ Database side์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด JPQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰ ์ „์— flush ๋œ๋‹ค.
      • ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ธํ•œ ์“ฐ๊ธฐ ์ง€์—ฐ

        • ์“ฐ๊ธฐ ์ง€์—ฐ : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ์•ˆ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜์•ผ Commit์ด ์ด๋ฃจ์–ด์ง€๊ณ  ๋ฐ˜์˜๋œ๋‹ค.
      • Lazy ๋กœ๋”ฉ

        • ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ง„ ์—”ํ‹ฐํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
        • ์„ฑ๋Šฅ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
    • JPA Persistence๋ž€?

  • Infra/์šด์˜(์ด๊ฒฝํฌ)
    • jwt๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ๊ตฌ์„ฑ์€ ์–ด๋–ป๊ฒŒ ๋˜์–ด ์žˆ๊ณ , oauth์™€ ์ฐจ์ด๋Š”?

      JWT๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ HTTP Request Header์— JSON ํ† ํฐ์„ ๋„ฃ์€ ํ›„ ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ์ธ์ฆ ๊ณผ์ •์—†์ด ํ—ค๋”์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” JWT ์ •๋ณด๋ฅผ ํ†ตํ•ด ์ธ์ฆํ•œ๋‹ค.

      JWT๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

      1. ๋ณด์•ˆ ์ด์Šˆ: ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋น„๋ฐ€ ๊ฐ’์œผ๋กœ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ํ•˜๊ฒŒ ๋˜๋ฉด, ์„œ๋ฒ„๋Š” JWT๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. token์„ ์ธ์ฆ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ์ฟ ํ‚ค/์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ๋งŽ์€ ๋ณด์•ˆ ์ด์Šˆ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” GUI๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ JWT๊ฐ€ ์œ ํšจํ•  ๊ฒฝ์šฐ, resouce๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ JWT๋Š” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, Cross-Origin Resource Sharing (CORS) ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      2. ๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰: JWT๋Š” ๊ธฐ์กด์˜ XML๋ณด๋‹ค ๋œ ๋ณต์žกํ•˜๊ณ  ์ธ์ฝ”๋”ฉ ๋œ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP์™€ HTML ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.
      3. ์‚ฌ์šฉ์„ฑ: JSON parser๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— XML์„ ์‚ฌ์šฉํ•˜๋Š” SAML ๋ณด๋‹ค ๋งŒ๋“ค๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

      ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ ์ ‘ํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ € ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์ด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ์ •๋‹ต๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด JWT๋Š” ํ† ํฐ ์œ ํ˜•์ด๊ณ  OAuth๋Š” ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ์ผ์ข…์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ /outh/token endpoint์— ์˜ํ•ด ๋ฐœ๊ธ‰๋˜๋Š” ๋ชจ๋“  ํ† ํฐ์€ ์ผ์ข…์˜ OAuth ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      OAuth๋Š” Open Authorization, Open Authentication ๋œปํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŽ˜์ด์Šค๋ถ,๊ตฌ๊ธ€,ํŠธ์œ„ํ„ฐ)(Service Provider)์˜ ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Third party์•ฑ์— ์ œ๊ณต ์—†์ด ์ธ์ฆ,์ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

      OAuth ์ธ์ฆ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ API๋ฅผ ์œ ์ €๋Œ€์‹ ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. OAuth๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์—๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ์™€ ์ธ์ฆ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๋™ํ•  ๋•Œ ์ธ์ฆ๋ฐฉ์‹์˜ ํ‘œ์ค€์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๊ธฐ๋ณธ์ธ์ฆ์ธ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ด๋Š” ๋ณด์•ˆ์ƒ ์ทจ์•ฝํ•œ ๊ตฌ์กฐ์˜€๋‹ค. ์œ ์ €์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋…ธ์ถœ๋  ๊ฐ€๋ง์„ฑ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

      ์ถœ์ฒ˜:

      https://tristan91.tistory.com/499

      [๊ฐœ๋ฐœ๋ชจ์Œ์ง‘]

      JWT ๊ตฌ์กฐ

      JWT ๋Š” . ์„ ๊ตฌ๋ถ„์ž๋กœ 3๊ฐ€์ง€์˜ ๋ฌธ์ž์—ด๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค:

      https://blog.kakaocdn.net/dn/dgmsn1/btqz4K9YW27/Qv25KQkx9nPSAQMkhsb3MK/img.png

      1. Header typ: ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ JWT ์ด์ฃ .

      alg: ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ๋ณดํ†ต HMAC SHA256 ํ˜น์€ RSA ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€, ํ† ํฐ์„ ๊ฒ€์ฆ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” signature ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

      2. Payload

      ํ† ํฐ์— ๋‹ด์„ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‹ด๋Š” ์ •๋ณด์˜ ํ•œ โ€˜์กฐ๊ฐโ€™ ์„ ํด๋ ˆ์ž„(claim) ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๋Š” name / value ์˜ ํ•œ ์Œ์œผ๋กœ ์ด๋ค„์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ ˆ์ž„ ๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ํด๋ ˆ์ž„ ์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํฌ๊ฒŒ ์„ธ ๋ถ„๋ฅ˜๋กœ ๋‚˜๋‰˜์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค:

      ๋“ฑ๋ก๋œ (registered) ํด๋ ˆ์ž„,๊ณต๊ฐœ (public) ํด๋ ˆ์ž„,๋น„๊ณต๊ฐœ (private) ํด๋ ˆ์ž„

      1. ์„œ๋ช…(signature)์ด ์„œ๋ช…์€ ํ—ค๋”์˜ ์ธ์ฝ”๋”ฉ๊ฐ’๊ณผ, ์ •๋ณด์˜ ์ธ์ฝ”๋”ฉ๊ฐ’์„ ํ•ฉ์นœํ›„ ์ฃผ์–ด์ง„ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด์‰ฌ๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์˜จํ”„๋กœ๋ฏธ์Šค ํ™˜๊ฒฝ๊ณผ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์˜ ์ฐจ์ด ๋ฐ ์žฅ๋‹จ์ 

      ํ”„๋ ˆ๋ฏธ์Šค(On-premise)๋ž€ ์†Œํ”„ํŠธ์›จ์–ด ๋“ฑ ์†”๋ฃจ์…˜์„ ํด๋ผ์šฐ๋“œ ๊ฐ™์ด ์›๊ฒฉ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ์ž์ฒด์ ์œผ๋กœ ๋ณด์œ ํ•œ ์ „์‚ฐ์‹ค ์„œ๋ฒ„์— ์ง์ ‘ ์„ค์น˜ํ•ด ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

      ํด๋ผ์šฐ๋“œ ํ•„์š”์„ฑ ๋Œ€๋‘

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

      ํด๋ผ์šฐ๋“œ์˜ ์žฅ์ 

      ์˜จํ”„๋ ˆ๋ฏธ์Šค(On-premise) ๊ธฐ์—…๋“ค์€ IT ์ธํ”„๋ผ์˜ ํ™•์ถฉ๊ณผ ์ปดํ“จํŒ… ํŒŒ์›Œ๋ฐ ์ €์žฅ๋Šฅ๋ ฅ ํ–ฅ์ƒ์— ๋Œ€ํ•œ ๋ถ€๋‹ด๊ฐ๊ณผ ๊ณ ๋„ํ™”๋˜๊ณ  ์ง€๋Šฅํ™”๋˜๋Š” ํ•ต์ปค๋“ค๋กœ๋ถ€ํ„ฐ ๊ธฐ์—… ์ž์‚ฐ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋Š์ž„์—†์ด ๋„คํŠธ์›Œํฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ๋ถ„์„ํ•  ๊ณ ์„ฑ๋Šฅ์˜ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜์„ ๊ตฌ์ž…ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฒฐ์ฝ” ๊ธฐ์—…์—๊ฒŒ ์ฆ๊ฑฐ์šด ์ผ์€ ์•„๋‹ˆ๋‹ค.ํด๋ผ์šฐ๋“œ๋Š” ๊ธฐ์—…์˜ ์ด๋Ÿฐ ๋ถ€๋‹ด๊ฐ์„ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์œผ๋กœ ๋–  ์˜ค๋ฅธ์ง€ ์˜ค๋ž˜์ด๋‹ค. ์žฅ์ ๋“ค์„ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‚˜์—ด ํ•ด ๋ณด์ž๋ฉด

      โ–ถ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ํ™˜๊ฒฝ ๋ณ€ํ™”์— ์‹ ์†ํ•˜๊ณ  ํƒ„๋ ฅ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.โ–ถ IT ์ธํ”„๋ผ ์šด์˜์— ๋Œ€ํ•œ ๋ถ€๋‹ด์—์„œ ๋ฒ—์–ด๋‚˜ ๊ธฐ์—…์˜ ํ•ต์‹ฌ ์—…๋ฌด์— ์—ญ๋Ÿ‰์„ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.โ–ถ ํด๋ผ์šฐ๋“œ๋Š” IT ํˆฌ์ž๋น„์šฉ(CAPEX)์„ ์ ˆ๊ฐํ•œ๋‹ค.

      ์‹ค์ œ๋กœ ์˜จํ”„๋ ˆ๋ฏธ์Šค(On-premise) ํ™˜๊ฒฝ์„ ํด๋ผ์šฐ๋“œ(Cloud) ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ”๊พผ ๊ธฐ์—…๋“ค์ด ๋Š˜์–ด๋‚˜๋ฉด์„œ ์„ฑ๊ณต์‚ฌ๋ก€๋“ค๋„ ์ ์ฐจ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ถ”์„ธ์ด๋‹ค.

Dispatcher Servlet

โš ๏ธ **GitHub.com Fallback** โš ๏ธ