SPRING_SUMMARY
๐ SPRING
๐ SPRING_SUMMARY
Mybatis ๋ฅผ ์ด์ฉํ Spring Project๋ฅผ ์งํํ ๋ ํด์ผํ ๊ฒ์ ๋ด๊ฐ ์์๋ณผ ์ ์๊ฒ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค. (spring boot ์๋)
spring + mybatis_spring + tomcat ..
Project ์์ฑ
- STS์์ ๋จผ์ Server ( tomcat 9.0 )๋ฅผ ์ฐ๊ฒฐํ๋ค.
- Spring Legact Project ์์ฑ ( Spring MVC Project -> package๋ช ์์ฑ )
- pom.xml ์ค์ ( ๋ฒ์ ํ์ธ - ํ๋ก์ ํธ์์ mybatis, spring โฆ ์ ์ฐ๋ ค๊ณ ํ๋ ๊ฒ๋ค์ ์ค์ ํด์ฃผ๋ xml -> dependency, maven ์ผ๋ก ๋ฒ์ ์ค์ )
- Maven Update ( force ์ฒดํฌ ) -> java 1.8๋ก ๋ฐ๋ ๊ฒ ํ์ธ
DB ๊ด๋ จ ์ ๋ฌด
- project/res ํด๋ ์์ฑ -> DB ์ ๋ณด ์ ์ฅ ( sql, mwb .. ) , res ๋ ๋ถ๊ฐ์ ์ธ ํ์ผ์ด๋ผ๋ ๋ป์ ๊ฐ์ง๋ค.
- webapp ์ META-INF ํด๋ ๋ง๋ค๊ธฐ
-
context.xml ์์ฑ : DB์ฐ๊ฒฐ์ค์ - ์ด๋ฆ ์ฝ์
username ์๋ ๋ด DB ์ด๋ฆ, password ๋ ๋ด DB ๋น๋ฒ
url์์ '&'๋ฅผ '&'๋ก ์์ฑํด์ผํ๋ค.
testweb์ DB ์คํค๋ง ๋ช
์ด๋ค.
๋ง์ง๋ง ๊ตฌ๋ฌธ์ ๋ค์์ผ๋ก web.xml์ ๋ณธ๋ค๋ ๋ป
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/practice" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="root" password="1234" driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/testweb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
web ์ค์
web.xml
web.xml
ํ๊ธ ํํฐ ์ค์ , throwException ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
- ํ๊ธ ํํฐ ์ค์
<!-- POST ๋ฐฉ์์ ํ๊ธ ์ฒ๋ฆฌ. -->
<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>
- throwException ์ฒ๋ฆฌ
<!-- DispatcherServlet์ด ํด๋น mapping์ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ NoHandlerFoundException๋ฅผ throwํ๊ฒ ์ค์ -->
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
web ํ๊ฒฝ์ด ๋ ๋ฆฝ์ ์ธ bean ( ๋น ์น )
root-context.xml
service, mapper(dao), mybatis, aop. transaction ๋ฑ ๊ด๋ จ bean์ ๋ฑ๋กํ๋ค.
์ค์ ์ ํ์ํ ๊ฒ๋ค์ namespace์์ ์ ์ฒดํฌํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋์ผ ์ค์ ๊ฐ๋ฅ.
- mybatis ์ค์
<!-- mybatis-config.xml ์์ enviornments ๋ถ๋ถ -->
<!-- Connection pool์ ์ฌ์ฉํ๋ค. -->
<!-- ์์ DB ์ค์ ํ ๋ ๋ง๋ค์ด์ค webapp/META-INF/context.xml ์ ์ฐธ์กฐํ๋ค. -->
<bean id="ds" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/practice"></property>
</bean>
<!-- mybatis -->
<!-- SqlMapConfig.java ๋ถ๋ถ ์์ฑ -->
<!-- factory ๋ง๋ค์ด์ฃผ๊ธฐ -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- ์์ ์ ์ธํ ds ์ฐธ์กฐ -->
<property name="dataSource" ref="ds" />
<!-- mybatis-config.xml ์์ mappers ๋ถ๋ถ -->
<!-- mapper๋ผ๋ ํด๋ ๋ฐ์ ๋ชจ๋ xml์ ์ฝ์ด ์ค๊ฒ ๋ค mapper๊ฐ ์ด๋จ๋๋~ -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
<!-- mybatis-config.xml ์์ typeAliases ๋ถ๋ถ -->
<!-- config๊ฐ ์ด๋จ๋๋~ -->
<!-- ํด๋ ๊ฒฝ๋ก ์ง์ ํด์ ์ฐ๊ฒฐ -->
<!-- <property name="configLocation" value="classpath:mybatis-config.xml"/> -->
<!-- ์ฌ๊ธฐ์ package ์ ์ธ -> mybatis-config.xml๊ฐ ์์ด๋๋๋ค -->
<property name="typeAliasesPackage" value="com.practice.guestbook.model"/>
</bean>
<!-- SqlMapConfig.java ๋ถ๋ถ ์์ฑ -->
<!-- default ๊ฐ์ด ์์ด์ ๋ฐ๋์ ์์ฑ์๋ฅผ ๊ฐ์ ธ๊ฐ์ผํ๋ค -->
<!-- factory๋ฅผ ๊ฐ์ง๊ณ SqlSession์ ๋ง๋ค์ด๋ผ -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean"/>
</bean>
-
component-scan ์ค์
model ( service, mapper ( dao )) , aop
service๋ @Service , dao๋ @Repository ๋ฅผ ์ ์ด์ค์ผํ๊ณ mapper๋ interface๋ผ์ annotation์ด ์๋ค.
<context:component-scan
base-package="com.ssafy.practice.model, com.ssafy.practice.aop" />
- aop ์ค์
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- transaction ์ค์
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
web ๊ด๋ จ bean ( ์น )
servlet-context.xml
ViewResolver , interceptors, file ๋ฑ ์ค์
- annotataion ํ์ฑํ
<annotation-driven />
-
component-scan ์ค์
controller
Controller๋ @Controller๋ฅผ ์ ์ด์ค์ผํ๋ค.
<context:component-scan base-package="com.practice.guestbook.controller" />
-
ViewResolver ์ค์
๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ๋ ๋ถ๋ถ์ด ์๋ค.
<!-- viewResolver -->
<!-- ํ์ผ๋ช
์ ( prefix )์ /WEB-INF/views/ ๊ฒฝ๋ก๊ฐ ๋ถ๊ณ
ํ์ผ๋ช
๋ค ( suffix )์ .jsp ๊ฐ ๋ถ๋๋ค.
-->
<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>
-
๊ฒฝ๋ก ๋งคํ
img, css, js ๋ DispatcherServlet์ ๊ฑฐ์น๋ฉด์ ๋งคํํ ํ์๊ฐ ์๋ค. ( ๋จ์ง ํ๋ฉด๋จ์์๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ - Controller๊ฐ ํ์๊ฐ ์๋ค. )
๊ทธ๋์ resources์ ์ ์ฅํด์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋งคํ์ ์ํด์ฃผ๋๋ค๋ ์๋ฏธ์ด๋ค.
์คํ๋๋ฉด ๋งคํ์ํด์ฃผ๊ณ ๋ฐ๋ก ์ ์กํด์ค๋ค.
์ฌ๊ธฐ์ webapp์ resources ํด๋๋ฅผ ์์ฑํ๊ณ ์์ img, css, js ํด๋๋ฅผ ๋ง๋ค์ด์ค์ผํ๋ค.
<!-- <resources mapping="/resources/**" location="/resources/" /> -->
<!-- mapping ๊ฐ์ผ๋ก ๋ค์ด์ค๋ฉด location์ผ๋ก ์ฐ๊ฒฐ์์ผ๋ฌ๋ผ๋ ์๋ฏธ์ด๋ค. -->
<resources mapping="/img/**" location="/resources/img/" />
<resources mapping="/css/**" location="/resources/css/" />
<resources mapping="/js/**" location="/resources/js/" />
- interceptor
<beans:bean id="confirm" class="com.practice.interceptor.ConfirmInterceptor"/>
<interceptors>
<interceptor>
<!-- <mapping path="/guestbook/*"/> -->
<!-- ๋งคํ ๊ฒฝ๋ก ์ค์ -->
<mapping path="/guestbook/register"/>
<mapping path="/guestbook/modify"/>
<mapping path="/guestbook/delete"/>
<!-- <exclude-mapping path="/user/log*"/> -->
<!-- <beans:bean class="com.ssafy.interceptor.ConfirmInterceptor"/> -->
<beans:ref bean="confirm"/>
</interceptor>
</interceptors>
- file
<!-- fileUpload -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="UTF-8"/>
<beans:property name="maxUploadSize" value="52428800"/>
<beans:property name="maxInMemorySize" value="1048576"/>
</beans:bean>
<!-- fileDownload -->
<beans:bean id="fileDownLoadView" class="com.practice.guestbook.view.FileDownLoadView"/>
<beans:bean id="fileViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<beans:property name="order" value="0" />
</beans:bean>
์์ฉ ์ ๋ฌด ๊ตฌํ
์ด์ ์ค์ ๋ค์ ๋ค ๋ง์น๊ณ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๋ฉด ๋๋ค.
.jsp -> controller -> service -> mapper -> .xml
๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ํ๋ฉฐ ์ฒ๋ฆฌ๋๋ค.
๋๋ฒ๊น ์ ์ํ Log4j ์ ์
log4j๋ Apache ์์ ๋ง๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋์ค์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๋ฐ ๊ธฐ๋ฐ ๋ก๊น
์ ํธ๋ฆฌํฐ๋ก ๋๋ฒ๊ทธ์ฉ ๋๊ตฌ ๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- pom.xml์ log4j ์ถ๊ฐ, ํ์ธ
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j-version}</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
-
Log4j.xml ์์ฑ
src/main/resources๋ฐ์ log4j.xml์ ๋ง๋ ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%c] %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.ssafy.guestbook">
<level value="debug" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
-
Log4j.xml ์ฌ์ฉ
Controller ์์ ์ ์ธ
private static final Logger logger = LoggerFactory.getLogger(MemberController.class);
์ฌ์ฉ
logger.debug("map : {}", map.get("userId"));
๊ฒฐ๊ณผ
DEBUG [com.ssafy.guestbook.controller.MemberController] map : 1234
console ์ฐฝ์ ์ด๋ ๊ฒ ๋ฌ๋ค.
Log4j ์ค์ ์๋ฃ !!
package ์์ฑ, class ์์ฑ, xml ์์ฑ
๋ด๊ฐ ํ๊ณ ์๋ project๋ฅผ ๋ฐ์์ ์์๋ก ๋ ๊ฒ์ด๋ค.
src/main/java
- com.practice.guestbook.controller
- controller
- com.practice.guestbook.model
- dto
- com.practice.guestbook.model.mapper
- mapper
- com.practice.guestbook.model.service
- service
- serviceImpl
- com.practice.guestbook.view
- file ๊ด๋ จ
- com.practice.interceptor
- interceptor
- com.practice.util
-page ์ฒ๋ฆฌ
src/main/resources/mapper sql๋ฌธ ์ฒ๋ฆฌ xml
- member.xml
- guestbook.xml
src/main/webapp/resources
- img
- img
- css
- css ์์ฑ
- js
- js ์์ฑ
- js ์์ฑ
src/main/webapp/WEB-INF/spring
- servlet-context.xml
- root-context.xml
src/main/webapp/WEB-INF/views ํ๋ฉด ๋จ ( jsp )