Skip to content

Latest commit

ย 

History

History
152 lines (135 loc) ยท 8.57 KB

File metadata and controls

152 lines (135 loc) ยท 8.57 KB

Java Web Framework

Spring like Java web framework project
์Šคํ”„๋ง๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜ (Annotation, @)์œผ๋กœ์จ ๋นˆ (Bean) ๋“ฑ๋ก ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection, DI)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ ํ”„๋กœ์ ํŠธ

  • ๋ฐฐํฌ ๋ฐฉ์‹ : maven install ๋ช…๋ น์–ด๋กœ์จ ์ƒ์„ฑํ•œ jar ๋ฐ pom.xml

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ• :

    • ๋กœ์ปฌ์˜ maven ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ (Windows ๊ธฐ์ค€ ๊ธฐ๋ณธ๊ฐ’ : C:\Users\User\.m2\repository)์— jar ํŒŒ์ผ ์ถ”๊ฐ€ํ•œ ํ›„ pom.xml์— groupId, artifactId, version ์ถ”๊ฐ€
    • ๋ช…๋ น์ฐฝ์—์„œ mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> ์‹คํ–‰ ํ›„ pom.xml์— groupId, artifactId, version ์ถ”๊ฐ€
    • pom.xml์— maven-install-plugin ์‚ฌ์šฉ
    • ์‹œ์Šคํ…œ ์Šค์ฝ”ํ”„ (System Scope) <systemPath>${basedir}/lib/yourJar.jar</systemPath>๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€
      • ์ปดํ“จํ„ฐ ํŒŒ์ผ ๊ตฌ์กฐ์— ์ข…์†์ ์ด๋ฏ€๋กœ ๋น„๊ถŒ์žฅ
    • ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๋กœ์ปฌ์— ๋‹ค๋ฅธ maven ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ
      <repositories>
          <repository>
              <id>maven-repository</id>
              <url>file:///${project.basedir}/maven-repository</url>
          </repository>
      </repositories>
      
  • pom.xml ์ถ”๊ฐ€ ์˜ˆ์‹œ

    <dependency>
        <groupId>io.github.leeseungeun</groupId>
        <artifactId>java-web-framework</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    
  • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

    \src\main\java\io\github\leeseungeun\webframework
        \annotations                                    # ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์–ด๋…ธํ…Œ์ด์…˜ ํŒจํ‚ค์ง€
            \Bean.java                                  # ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
            \Inject.java                                # ์˜์กด์„ฑ ์ฃผ์ž…์ด ํ•„์š”ํ•œ ํ•„๋“œ์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
            \RequestMapping.java                        # ์š”์ฒญ URI์˜ ๋งคํ•‘ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
        \beans                                          # ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด ํŒจํ‚ค์ง€
            \RequestHandler.java                        # ์š”์ฒญ URI ํŒŒ์‹ฑํ•˜๊ณ  ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด
            \SqlSessionFactory.java                     # SqlSession์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” Factory
        \controller
            \Controller.java                            # ๋ชจ๋“  ์„ธ๋ถ€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
            \FrontController.java                       # ์„œ๋ฒ„ ์ธก ์ตœ์ „๋‹จ์—์„œ URI์— ๋”ฐ๋ผ ์š”์ฒญ์„ ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•˜๊ณ  ์ „๋‹ฌ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ „๋‹ฌ
        \enums                                          # ์–ด๋…ธํ…Œ์ด์…˜, ๋นˆ, JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ ์–ธํ•œ ENUM ํŒจํ‚ค์ง€
            \AnnotationType.java                        # ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ข…๋ฅ˜์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•œ ENUM
            \BeanType.java                              # ๋นˆ์˜ ์ข…๋ฅ˜์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ (ํŠนํžˆ SqlSessionFactory)๋ฅผ ์ •์˜ํ•œ ENUM
            \JsonifiedObjectType.java                   # JSON์œผ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ณ€ํ™˜ ๋กœ์ง์ด ์ •์˜๋œ ENUM
        \filter
            \CharacterEncodingFilter.java               # ํ•œ๊ธ€ UTF-8 ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•„ํ„ฐ
        \utils                                          # ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ์œ ์šฉํ•œ ํด๋ž˜์Šค ํŒจํ‚ค์ง€
            \AnnotationProcessor.java                   # ์ฃผ์–ด์ง„ ํด๋ž˜์Šค์— ํŠน์ • ์–ด๋…ธํ…Œ์ด์…˜์ด ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๋นˆ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์‹ค์งˆ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค
            \Initiator.java                             # Bean ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ , URI์™€ ์ปจํŠธ๋กค๋Ÿฌ ๋งคํ•‘์„ ์ง„ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค
            \Jsonifier                                  # ์‹ค์ œ JSON ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค
            \PackageScanner                             # ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด ์ฃผ์–ด์ง„ ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    
    
  • ํ•ด๋‹น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์š”ํ•œ ์ ˆ์ฐจ

    1. javax.servlet.ServletContextListener.java๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ contextInitialized ๋ฉ”์†Œ๋“œ์— ์•„๋ž˜์˜ ์ฝ”๋“œ ์ถ”๊ฐ€

      public void contextInitialized(ServletContextEvent event) {
      
          ServletContext servletContext = event.getServletContext();
          // ์ปดํฌ๋„ŒํŠธ ์Šค์บ”ํ•  ํŒจํ‚ค์ง€๋ช…, MyBatis ์„ค์ •์ด ๋‹ด๊ธด ํŒŒ์ผ์˜ ์œ„์น˜ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ
          String configLocation = servletContext.getInitParameter("configLocation");
      
          // ์ฝ”๋“œ ์‹คํ–‰ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ด
          URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation();
          // ํ˜„์žฌ ์ฝ”๋“œ ์‹คํ–‰ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์–ด์ง„ ํŒจํ‚ค์ง€์— ๋“ฑ๋ก๋œ ํด๋ž˜์Šค ๋ชฉ๋ก์„ ์–ป์–ด ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰
          Initiator initiator = new Initiator(url, configLocation);
      
          // ํ˜„์žฌ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ํ•„์š” ์ •๋ณด ๋“ฑ๋ก
          Map<String, Object> beans = initiator.getBeans();
          RequestHandler requestHandler = initiator.getRequestHandler();
          
          servletContext.setAttribute("beans", beans);
          servletContext.setAttribute("requestHandler", requestHandler);
      }
      
    2. web.xml ์„ค์ •

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
      <display-name>le-vin</display-name>
      <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <listener>
          <listener-class>project.common.listener.ServletContextListenerImplement</listener-class>
      </listener>
      <context-param>
          <param-name>configLocation</param-name>
          <param-value>drive:/path/config-file.xml</param-value>
      </context-param>
      <filter>
          <filter-name>CharacterEncodingFilter</filter-name>
          <filter-class>project.common.filter.CharacterEncodingFilter</filter-class>
          <init-param>
              <param-name>encoding</param-name>
              <param-value>utf-8</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      <servlet>
          <servlet-name>frontController</servlet-name>
          <servlet-class>project.common.controller.FrontControllerServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>frontController</servlet-name>
          <url-pattern>*.mall</url-pattern>
      </servlet-mapping>
      </web-app>
      
    3. ์˜ˆ์‹œ ํŒŒ์ผ @Bean(type=BeanType.Controller) @RequestMapping(value="/user/list") public class UserListController implements Controller {

       @Inject
       private UserService userService;
      
       public UserService getUserService() {
           return userService;
       }
      
       public void setUserService(UserService userService) {
           this.userService = userService;
       }
      
       @Override
       public Object handleRequest(HttpServletRequest request, HttpServletResponse response)
               throws ServletException, RequestException {
           
           List<User> list = null;
           try {
               list = userService.list();
               //throw new RequestBadRequestException();
           } catch (Exception e) {
               throw new ServletException("UserService.list() ์˜ˆ์™ธ ๋ฐœ์ƒ", e);
           }
           
           return list;
      
       }
      

      }