[Spring] 코딩 시작 전 환경설정
안녕하세요 코북입니다.
스프링MVC로 코딩을 하기 위해서 먼저 간단한 환경설정들을 해줘야 하는데요. 아무거나 하다 보니까 정리가 잘 되지 않는 기분이라 어떤 흐름으로 설정하는지 간단하게 적어 볼 생각입니다.
흐름은 다음과 같습니다.
- 프로젝트 생성
- 서버 연결
- 버전 업데이트
- DB연결 (root-context.xml 환경설정)
- pom.xml 환경설정
- web.xml 환경설정
1. 프로젝트 생성 + 패키지 이름 설정
New를 눌러 새로운 프로젝트를 생성해야 합니다. Wizards는 Spring Lagacy Project 선택합니다.
Spring 이름을 설정한 후, SpringMVCproject를 선택합니다.
마지막으로 패키지 이름을 설정해주고 Finish를 누르면 프로젝트가 생성됩니다.
2. 서버 연결
서버 연결을 위해 톰캣 우클릭 후, Add and Remove를 선택합니다
다음과 같은 창이 나오면 서버와 연결할 프로젝트를 Add 해줍니다. 기존에 연결돼있던 프로젝트들은 그냥 둬도 상관없지만, 가끔 톰캣에서 충돌이 일어나는 경우가 있으므로 Remove하면 좋습니다.
3. 버전 업데이트
버전 업데이트는 pom.xml에서 java, maven버전을 업데이트해주면 됩니다.
처음 생성하면 라이브러리들이 모두 구버전이기 때문에 사용하고자 하는 버전에 맞춰 업데이트를 해줘야 합니다.
저는 스프링은 4.3.14 버전으로 바꿨고, 메이븐은 1.8 버전으로 바꿨습니다. 바꾸고 저장하면 다음과 같이 라이브러리가 수정됩니다.
그런데, maven 버전이 업데이트되지 않는 것을 볼 수 있는데요. 이런 경우에는 수동으로 프로젝트의 메이븐을 업데이트해주면 됩니다.
메이븐 버전도 업데이트됐습니다. 각 버전에 대한 정보는 https://mvnrepository.com/에서 확인할 수 있습니다.
4. DB연결 (root-context.xml 설정)
DB연결은 먼저 mySql을 연결한 후, root-context.xml 환경설정을 해주시면 됩니다.
mysql폴더의 startup.bat을 켜서 mysql서버를 열어줍니다.
그다음 eclipse에서 DB와 연결해주면 됩니다. 빨간 줄을 더블클릭해주면 됩니다. DB연결을 했다면 root-context.xml 환경설정을 해야 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation=" http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 히카리 CP -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/mysql"></property>
<property name="username" value="root"></property>
<property name="password" value="12345"></property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<!-- DBCP를 사용 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<mybatis-spring:scan base-package="kr.cobook.mapper"/>
</beans>
DBCP를 사용하기 위해 히카리CP bean을 생성했고, mybatis-spring태그로 스캔할 mapper의 주소를 설정했습니다. scan태그를 사용하기 위해 접두사에 대한 xml namespace을 선언하고 사용할 namespace와 참조할 스키마 파일명을 URI로 식별합니다.
이처럼 scan을 통해 mapper를 메모리에 올려줘야만 POJO가 interface mapper를 사용할 수 있고, SqlSessionFactoryBean이 mapper를 위치를 찾아 mapper의 메소드 들을 실행할 수 있습니다.
5. pom.xml 환경설정
이제 DB연결을 마무리했으니 pom.xml에서 필요한 API들을 설치해줘야 합니다. pom.xml의 <dependencies> 태그 안에 <dependency> 태그들을 사용해 쉽게 추가할 수 있습니다.
<!-- API 설치 -->
<dependencies>
...
<!-- Gson(JSON) API -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
<!-- lombok API -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<!-- HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.4</version>
</dependency>
<!-- JDBC -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- mybatis - spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- JSTL은 이미 스프링에 내장 -->
<!-- FC에 JSP가 아니라 JSON 데이터를 그대로 리턴시키는 API -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
6. web.xml 환경설정
마지막으로 POST방식의 한글 데이터를 인코딩하기 위한 처리를 web.xml에서 해줘야 합니다. 인코딩을 하려면 서버가 켜질 때 Front Controller 앞에서 먼저 인코딩을 해야 하는데, web.xml에서 Front Controller가 실행되기 때문입니다. 따라서 다음과 같이 DispatcherServlet보다 앞에 인코딩을 배치시켜주면 됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 스프링 한글 인코딩 POST방식-->
<!-- 서버가 켜질 때 F.C. 앞에 배치시켜서 인코딩을 해야하기 때문에 web.xml에서 인코딩을 한다 -->
<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>
<!-- 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>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- FrontController -->
<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>
</web-app>
위의 과정을 마무리하면 코딩을 할 수 있는 기본적인 환경설정은 끝입니다.
배운 점
한 번 환경설정을 해놓으면 그 이후에는 만들어놓은 작업물을 복사해서 붙여 넣는 식으로 쉽게 환경설정을 할 수 있기 때문에, 그 안에서 각각의 태그들이 어떻게 작동하는지 어떤 기능을 가지고 있는지 알지 못한 채 무지성 환경설정을 했었던 것 같다. 이번 기회에 환경설정하는 방법을 글로 정리하면서 스프링이 내부에서 어떤 흐름으로 작동하는지 좀 더 잘 알 수 있게 됐다. 각각의 태그들도 왜 사용하는지 알 수 있는 시간이었다.