์คํ๋ง ๊ฐ๋ฐ ์ด๊ธฐ ์ค์
1. facet ๋ฒ์ ๋ง์ถ๊ธฐ
ํ๋ก์ ํธ ์ฐ ํด๋ฆญ > Properties > Project Facets > Dynamic Web Module ๋ฒ์ ์ค์ , Java ๋ฒ์ ์ค์
2. pom.xml ์ค์
- Maven : ์๋ฐ ์๋ํ build tool.
- Project Object Model : ํ๋ก์ ํธ ๊ด๋ฆฌ ๋ฐ ๋น๋์ ํ์ํ ํ๊ฒฝ ์ค์ , ์์กด์ฑ ์ค์ , ๋ผ์ดํ ์ฌ์ดํด ๊ด๋ฆฌ ๋ฑ
์ฆ, maven์ ํตํด ๋น๋๋ฅผ ์๋ํํ๊ธฐ ์ํด ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ pom.xml์ด๋ผ๋ ์ค์ ํ์ผ์ ์ ์ํด๋๋ฉด, ๋คํธ์ํฌ๋ฅผ ํตํด ์๋์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ์ ํ๋ก์ ํธ๋ฅผ ์์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
ํ๋ก์ ํธ ์ด๊ธฐ ์์ฑ ์ดํ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ MVN Repository๋ฅผ ํตํด ์ถ๊ฐํ ์ ์๋ค.
์๋๋ ํ๋ก์ ํธ ๊ฐ๋ฐ ์ ์ค์ ๋ก ์ถ๊ฐํ๋ dependency๋ค์ด๋ค.
<!-- for MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!-- for Datasource -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
<!-- for mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- for Transaction -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- for jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- for File upload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload-version}</version>
</dependency>
<!-- for JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json-version}</version>
</dependency>
<!-- for lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
3. web.xml ์ค์
sts์ ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ์ ํ์ผ ๊ตฌ์กฐ๋ก ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ค.
- web.xml : ์น ํ๊ฒฝ ์ค์ ํ์ผ
- WAS(Web Application Server)๊ฐ ๊ตฌ๋๋๋ฉด ์ต์ด๋ก web.xml์ ์ฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ํ๊ฒฝ ์ค์ ์ ๋ง์น ๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ค.
- DispatcherServlet, Root Context์ ContextLoaderListener, Filter ๋ฑ์ ๋ฑ๋กํ๋ค.
DispatcherServlet ์ค์
DispatcherServlet์ ์ฌ๋ฌ๊ฐ ์ค์ ํ ์ ์์ผ๋ฉฐ, ๊ฐ DispatcherServlet ๋ง๋ค ์๋ก ๋ค๋ฅธ ApplicationContext๋ฅผ ์์ฑํ ์ ์๋ค.
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Root Context ์ค์
์ต์์ context๋ฅผ ์ค์ ํ๊ธฐ ์ํด ๋ก๋ํ ์ค์ ํ์ผ(root-context.xml)์ ์ง์ ํ๋ค. ์ด๋ฅผ ํฌํจํ context ์ค์ ํ์ผ๋ค์ ๋ก๋ํ๊ธฐ ์ํด ContextLoaderListener๋ฅผ ์ค์ ํ๋ค.
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Filter ์ค์
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด DispatcherServlet์ ์์ฒญ์ ์ ๋ฌํ๊ธฐ ์ ์ ํํฐ ๊ณผ์ ์ ๊ฑฐ์ณ ์์ฒญ์ ๋ง๋ ๋ถ๊ฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ญํ . ๋ง ๊ทธ๋๋ก โํํฐโ.
์๋๋ ๊ฑฐ์ ํ์์ ์ผ๋ก ์ค์ ํด์ผ ํ๋ ์ธ์ฝ๋ฉ ํํฐ
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. servlet-context.xml ์ค์
web๊ณผ ๊ด๋ จ๋ context ์ค์ ํ์ผ. Controller, View, Interceptor ๊ด๋ จ ์ค์ ์ ๋งก๋๋ค.
- Controller๋ฅผ ๋ฑ๋กํด๋๋ฉด ์๋์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ DI๋ฅผ ํ๋ค.
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:component-scan base-package="com.capo.myapp.controller" />
- Controller์ ์๋ต ํ๋ฉด(ํ์ด์ง)๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ViewResolver๋ฅผ ์ค์ ํ๋ค.
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<view-controller path="/user/loginView" view-name="login"/>
<view-controller path="/user/auth/listView" view-name="list"/>
<view-controller path="/user/registerView" view-name="register"/>
- Interceptor ์ค์ ๋ ์ฌ๊ธฐ์ ํ๋ค.
<interceptors>
<interceptor>
<mapping path="/*/auth/**"/>
<beans:ref bean="loginInterceptor"/>
</interceptor>
</interceptors>
5. root-context.xml ์ค์ (web์ด ์๋ ๊ฒ๋ค)
web ์ด์ธ์ ์ค์ ์ ์ํ ํ์ผ. ํนํ Model, AOP, Advice ๊ด๋ จ ์ค์ ์ ์ฌ๊ธฐ์ ํ๋ค.
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="com.capo.myapp.model"></context:component-scan>
<context:component-scan base-package="com.capo.myapp.advice"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- MyBatis๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ด๋ จ ๊ฐ์ฒด ์ฃผ์ ๋ ์ฌ๊ธฐ์ ์ค์ ํ๋ค.
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
p:driverClassName="${db_driver}"
p:url="${db_url}"
p:username="${db_username}"
p:password="${db_password}">
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:typeAliasesPackage="com.capo.myapp.model.dto"
p:mapperLocations="classpath:mapper/**/*.xml">
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"
c:sqlSessionFactory-ref="sqlSessionFactory">
</bean>
<mybatis-spring:scan base-package="com.capo.myapp.model.dao"/>
6. DI(Controller, Service, Repository)
์คํ๋ง ํ๋ก์ ํธ ํ์ผ ๊ตฌ์กฐ์์ ์ ๋ถ๋ถ์ ์ค์ ์น ์๋ฒ์ ๊ด๋ จ๋ ์๋ฐ ์์ค๋ค์ด ์๋ ๋๋ ํฐ๋ฆฌ๋ค. src/main ์๋์๋ ์ค์ ๋ฐฐํฌ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ จ ์๋ฐ ์์ค๋ฅผ, src/test ์๋์๋ ํ ์คํ ์ฉ๋์ ์๋ฐ ์์ค๋ฅผ ์ ์ฅํ๋ค.
์ค์ ์ ์ผ๋ก ๋ณผ ๋ถ๋ถ์ src/main/java ๋๋ ํฐ๋ฆฌ! MVC ํจํด์ ๋ฐ๋ผ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ ๋๋ Controller์ Model๋ถ๋ถ์ ๋๋๋ฉด servlet-context.xml๊ณผ root-context.xml ์ค์ ํ ๋๋ ์ฝ๋ค.
์ถ๊ฐ +
interceptor๋ Controller์ ํจ๊ป servlet-context.xml์ ์ค์ ํ์ฌ ๊ด๋ฆฌ ๋ฐ์์ผ ํ๋ฏ๋ก controller ํจํค์ง ์๋์ ๊ตฌ์ฑํ๋ค.์คํ๋ง์ ์ต๋ ๊ฐ์ ์ด์ ํน์ง์ธ DI๋ฅผ ์ํด XML์์ Bean์ผ๋ก ์ง์ ์ค์ ํ ์๋ ์๊ณ ํด๋์ค์ Annotation์ ํ์ํ ์๋ ์๋ค.
Annotation์ ์ปจํธ๋กค๋ฌ๋ @Controller
๋ก, ์๋น์ค๋ @Service
๋ก, ๋ชจ๋ธ์ @Repository
๋ก ์ค์ ํ๋ฉด ๋๋ค.