본문 바로가기
멀티캠퍼스 풀스택 과정/백엔드

Spring:4 spring(maven project)를 Mybatis, Mysql과 연결하기(환경설정)-1

by 이쟝 2022. 3. 16.
프로젝트 생성하기

1. Mybatis 환경설정

프로젝트 생성 후 우클릭 > Bulid Path > Configure Build Path

Libraries JRE System Library 클릭 > Edit > Workspace default JRE 체크 > Finish

1. css include js 폴더 생성한 뒤에 servlet-context에서 resources 설정

resources 폴더는 필요 없으면 삭제해도 된다. 

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<!-- <resources mapping="/resources/**" location="/resources/" /> -->
	<resources mapping="/css/**" location="/css/"/>
	<resources mapping="/include/**" location="/include/"/>
	<resources mapping="/js/**" location="/js/"/>
	
	<!-- 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>
	
	<context:component-scan base-package="com.mycampus.myappy" />
	
</beans:beans>
더보기

servlet-context.xml 하단에 Namespace클릭하고 체크박스 선택하면 주소들 자동 추가

- xmlns:xsi, xmlns:beans, xmlns:context, xmlns:mvc

 

<annotation-driven />

- @Controller를 가지고 있는 애들을 컨트롤러로서 작동하게 한다.

 

<context:component-scan base-package="com.mycampus.myappy" />

- 위에서 설정한 @Controller애들을 어디서 가져올 것인지 경로를 지정해줌

 

package com.mycampus.myappy;

@Controller
public class HomeController {
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
				
		return "home"; // /WEB-INF/views/home.jsp
	}
}

-> HomeController에서 리턴 값을 /WEB-INF/views/home.jsp로 반환해야 하지만 home; 만 써도 되는 이유는 ViewResolver가 Controller 앞(prefix) 뒤(suffix)에 붙여주는 beans를 설정해 주었기 때문이다.

<resources mapping="#" location="#"/>

- 정적 파일(img, 음악, 동영상)을 읽어올 경로를 설정한다.

- 폴더 안에 파일을 넣어주고 <img src=""/>로 읽어올 수도 있다. 

2. include 폴더 안에 header.jspf와 footer.jspf 파일 생성

include 폴더 안에 모든 보이는 화면에 동일하게 적용할 파일인 header.jspf와 footer.jspf를 생성한다.

3. web.xml설정으로 <jsp-config>로 include파일을 include 하기

post방식으로 전송할 때 한글 인코딩이 깨지지 않게 해주는 코드도 넣는다. 

web.xml

<?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">

	<!-- 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>
		<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>
	
	<!-- include -->
	<jsp-config>
		<jsp-property-group>
			<!-- 모든 jsp 파일 -->
			<url-pattern>*.jsp</url-pattern> 
			<!-- 모든 JSP 파일의 상단에는 header.jspf를 include한다. -->
			<include-prelude>/include/header.jspf</include-prelude>
			<!-- 모든 JSP 파일의 하단에는 footer.jspf를 include한다. -->
			<include-coda>/include/footer.jspf</include-coda>
		</jsp-property-group>
	</jsp-config>
	
	<!-- Post방식 전송의 한글인코딩  -->
	<filter>
		<description></description>
		<display-name>SpringEncodeFilter</display-name>
		<filter-name>SpringEncodeFilter</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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>SpringEncodeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>
더보기

-> include 디렉티브를 사용하지 않고, JSP의 앞 뒤에 지정한 파일을 삽입하는 기능을 제공한다.

<url-pattern> : url 패턴 지정

<include-prelude> : 모든 페이지 처음에 지정한 페이지가 삽입된다.

<include-coda> : 모든 페이지 하단에 지정한 페이지가 삽입된다.

 

contextConfigLocation을 이용하면, 공통으로 사용할 의존성 설정파일을 지정할 수 있다. <param-name>contextConfigLocation</param-name>을 설정해주고, <param-value></param-value>에 공통으로 사용할 설정파일의 경로를 입력해주면 된다. 

servlet태그는 웹 서비스에서 사용할 servlet 클래스를 선언해주는 역할을 한다.

<servlet>태그안에 서블릿 초기화 시, 설정값, 파라미터들을 입력해줄 수 있다.

<servlet-name>appServlet</servlet-name> : 웹 서비스에서 사용할 서블릿 이름으로 <servlet-mapping>태그의 <servlet-name>과 일치시켜 줘서 URL과 연결(매핑)시켜주는 역할을 한다.

4. DB작업을 할 수 있게 세팅 (Spring JDBC, Mysql Connector, Mybatis Spring, Mybatis 다운로드하기)

메이븐 저장소 검색(mvnrepository.com) 해서 각각의 라이브러리 검색 > 클릭 > 창 복사 > pom.xml에 붙여 넣기(</dependencies> 안에)

Spring JDBC

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>5.2.19.RELEASE</version>
		</dependency>

MyBatis Spring 

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
   			<groupId>org.mybatis</groupId>
  	 		<artifactId>mybatis-spring</artifactId>
    	                <version>2.0.7</version>
		</dependency>

MyBatis 

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
            	        <groupId>org.mybatis</groupId>
    	                <artifactId>mybatis</artifactId>
    	                <version>3.5.9</version>
		</dependency>

MySQL Connector/J

                <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.28</version>
                </dependency>

5. root-context.xml에서 (1)spring-jdbc로 db연결

- root-context.xml 에 dataSource bean을 선언하여 DI 받을 수 있도록 설정한다.
- dataSource bean 은 spring-jdbc 모듈에 있는 클래스(org.springframework.jdbc.datasource.DriverManagerDataSource)를 이용해 JDBC 드라이버를 통해 MySQL 서버에 접속할 수 있게 한다.
- dataSource는 jdbc를 통해 mysql에 접속할 수 있게 하는 객체이다.
- id라는 속성은 Spring 내에서 특정한 객체(빈)를 찾기 위해서 사용하는 일종의 가명이라고 생각하면 된다. 후에 이 값을 이용해서 다른 객체와 연결한다.
- bean의 id와 class / property의 name은 변경할 수 없다.
<?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-1.2.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 -->
	<!-- Mysql DB 정보 설정 namespaces탭에서 mybatis-spring 체크-->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://127.0.0.1/campusBD"></property>
		<property name="username" value="root"></property>
		<property name="password" value="root1106"></property>
	</bean>
	
</beans>
더보기

체크하면 xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" 이 주소가 생성된다.

6. mybatis를 사용하기 위해서 (1)mybatis-config.xml 파일 생성하고, (2)root-context.xml에 Mybatis를 사용하기 위해 세팅 

https://mybatis.org/mybatis-3/ko/getting-started.html 주소에 들어가서 코드 복사하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration></configuration>

(2) mybatis

- 마찬가지로 root-context.xml 에 MyBatis를 사용하기 위한 bean을 선언하여 DI 받을 수 있도록 한다.

- Mybatis 설정에는 기존에 정의한 DataSource 가 사용된다. sqlSessionFactory는 MyBatis 사용 시 꼭 필요한 객체이다.

- SqlSessionFactory를 통해 Session을 얻을 수 있다. 

- bean의 id와 class / property의 name은 변경할 수 없다.

<!-- mybatis에서 사용할 xml 파일의 위치를 이용해 SqlSessionFactory 객체를 생성= dataSource객체를 DI -->
	<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
                <!-- dataSource가 객체이기 때문에 ref이고, 객체가 아니라면 value이다-->
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<property name="mapperLocations" value="classpath:/mapper/*Mapper.xml"></property>
		<!--앞에 무엇을 붙이든 맨 뒤에 Mapper.xml을 붙이겠다!! 마지막은 편의를 위해서 생성함-->
	
    	<mybatis-spring:scan base-package="com.mycampus.myappy.dao"/> <!--dao를 사용하기 위해서-->
    
    </bean>

7. DispatcherServlet에게 root-context.xml을 추가했다고 알려주기(web.xml)

webapp페이지에서 만든 폴더나 xml파일은 모두 web.xml과 연결되어야 한다.

<!-- 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
			             /WEB-INF/spring/root-context.xml</param-value><!--이부분 추가-->
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

8. controller, dao, service, vo를 관리할 각각의 패키지 추가 + src/main/resouces에 mapper 패키지 추가

controller프로젝트에는 controller가 들어가고, dao에는 dao가 들어가고, service에는 service와 serviceImpl(service인터페이스를 구현한 클래스), mapper에는 xml 쿼리문이 들어가게 된다.