0420개발일지) Spring-MySQL Mybatis로 연결하기

nylm9·2023년 4월 20일

Spring-MySQL Mybatis

STS3로 Spring Framework와 MySQL를 Mybatis로 연결하는데 성공하였다.

과정 중 여러 오류가 발생했고 해결하는 과정도 담을려고 한다.

1. Spring에서 적용한 과정

1.1. pom.xml에 적용한 Dependency

본인의 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>

1.2. Servlet-context.xml 설정

@AutoWired 어노미테이션을 적용하기 위한 context:컴포넌트스캔 부분만을 추가했다.

  • 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/" />

	<!-- 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>

1.3. root-context.xml 설정

  • 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"
	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&amp;useSSL=false&amp;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&amp;useSSL=false&amp;serverTimezone=UTC" />

allowPublicKeyRetrieval, useSSL 해당 파라메터들이 필요하다는 모양이다.

Bean->sqlSessionFactory에는 데이터소스와 configLocation에 classpath(resource File):/{마이바티스설정.xml}을 설정한다.

마이바티스가 dao폴더를 스캔할 수 있도록 하단의 부분도 작성하자.

1.4. mybatis-config.xml 설정 & mapper 파일

위 root-context.xml에서 설정한 위치대로 mybatis-config.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파일을 확인해 보면,

  • userMapper.xml
<?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라는 클래스를 사용한다는 의미이다.

1.5. Controller, Service, DAO, DTO 설정

  • Controller 파일
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;
	}
}
  • Service 파일
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);
		
	}

}
  • DTO 파일
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;
	}	
}
  • DAO 파일
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등 연동된 파일이 없을 때도 오류가 발생한다.

profile
개발일지

0개의 댓글