STS3로 Spring Framework와 MySQL를 Mybatis로 연결하는데 성공하였다.
과정 중 여러 오류가 발생했고 해결하는 과정도 담을려고 한다.
본인의 MySQL버젼과 맞는지 확인하자 -> Root계정에서 select version(); 입력하면 나온다.
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!-- MyBatis 3.4.1 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- MyBatis-Spring -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Spring-jdbc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- Spring-test -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
<!-- spring-security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>6.0.2</version>
</dependency>
<!-- lombok -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
@AutoWired 어노미테이션을 적용하기 위한 context:컴포넌트스캔 부분만을 추가했다.
<?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/" />
<!-- 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.functiondoc.controller" />
<context:component-scan base-package="com.functiondoc.service" />
</beans:beans>
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- MySQL dataSource -->
<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:3306/functionDatabase?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC" />
<property name="username" value="FuncDB"></property>
<property name="password" value="bobehu1956@"></property>
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml" ></property>
</bean>
<mybatis-spring:scan base-package="com.functiondoc.dao"/>
</beans>
MySQL dataSource 부분이다.
하단 오류 발생에서도 말하겠지만 MySQL 8.0이후 버젼부터는
<property name="url" value="jdbc:mysql://127.0.0.1:3306/{스키마}?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC" />
allowPublicKeyRetrieval, useSSL 해당 파라메터들이 필요하다는 모양이다.
Bean->sqlSessionFactory에는 데이터소스와 configLocation에 classpath(resource File):/{마이바티스설정.xml}을 설정한다.
마이바티스가 dao폴더를 스캔할 수 있도록 하단의 부분도 작성하자.

위 root-context.xml에서 설정한 위치대로 mybatis-config.xml 파일을 만들어 준다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- Null 설정 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<!-- UserDTO파일의 별칭을 user로 설정 -->
<typeAlias type="com.functiondoc.dto.UserDTO" alias="user"/>
</typeAliases>
<mappers>
<!-- Mapper파일 위치 설정 -->
<mapper resource="mapper/userMapper.xml" />
</mappers>
</configuration>
이와같은 설정을 해둔다.
Mapper는 별도의 mapper 폴더를 만들고 안에 mapper.xml을 만든다.
이제 mapper파일을 확인해 보면,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.functiondoc.dao.UserDAO" >
<insert id="userRegister" parameterType="user">
INSERT INTO USERS(USERID, USERPASSWORD, USERNAME)
VALUES(#{userId}, #{userPw},#{userName})
</insert>
</mapper>
작성자의 경우, 회원가입 기능을 간단히 만들기 위해 이와같이 insert문을 작성하였다.
mapper namespace="com.functiondoc.dao.UserDAO"는 UserDAO에서 작성되는 인터페이스 메소드를 인식한다.
id="userRegister"는 보통 DAO메소드와 매칭하여 쓰면 된다.
parameterType="user"는 상단 mybatis-config.xml에서 작성한 UserDTO라는 클래스를 사용한다는 의미이다.
package com.functiondoc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.functiondoc.dto.UserDTO;
import com.functiondoc.service.UserService;
@Controller
public class UserController {
@Autowired
UserService usersvc;
@RequestMapping(value = "/userRegister" )
public String userRegister(String registerId, String registerPw, String registerName) {
System.out.println("Server->userRegister " + registerId);
UserDTO userRegister = new UserDTO();
userRegister.setUserId(registerId);
userRegister.setUserPw(registerPw);
userRegister.setUserName(registerName);
usersvc.userRegister(userRegister);
return null;
}
}
package com.functiondoc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.functiondoc.dao.UserDAO;
import com.functiondoc.dto.UserDTO;
@Service
public class UserService {
@Autowired
UserDAO udao;
public void userRegister(UserDTO userRegister) {
int insertResult = udao.userRegister(userRegister);
System.out.println(insertResult);
}
}
package com.functiondoc.dto;
public class UserDTO {
private String userId;
private String userPw;
private String userName;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPw() {
return userPw;
}
public void setUserPw(String userPw) {
this.userPw = userPw;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.functiondoc.dao;
import com.functiondoc.dto.UserDTO;
public interface UserDAO {
int userRegister(UserDTO userRegister);
}
컨트롤러를 통해 받아온 데이터를 이렇게 넣으면

이렇게 DB실행이 된다.
이렇게 연결해보면서 주된 오류는 root-context에 mybatis-config파일을 못 찾는다라는 형태의 오류인데
오타이거나 잘못된 경로를 설정한 경우다 아니면 mybatis-config에 지정된 파일 mapper나 DAO등 연동된 파일이 없을 때도 오류가 발생한다.