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>
- ๋ก์ปฌ์ maven ๋ ํ์งํ ๋ฆฌ (Windows ๊ธฐ์ค ๊ธฐ๋ณธ๊ฐ :
-
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 # ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ์ฃผ์ด์ง ํจํค์ง์ ํฌํจ๋๋ ๋ชจ๋ ํด๋์ค์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ฐํ -
ํด๋น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ ํ์ํ ์ ์ฐจ
-
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); } -
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> -
์์ ํ์ผ @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; }}
-