본문 바로가기
미니프로젝트/spring

spring miniproject - DB연동하기

by rewind 2024. 7. 19.

MySQL로 DB 연동하기~

 

기존에 MySQL에 만들어둔 계정과 연동을 해볼건데 MyBatis를 사용 우선 DB연동시 필요한것 두가지

 

1. DB 연결 드라이버(spring-jdbc)

2. DB(MySQL,Oracle 등등..)와 자바를 연결해줄 커넥터(mysql-connector)

 

이렇게 두가지만 있어도 사용 가능하긴 하지만 이러면 자바 클래스에서 직접 드라이버설정, 쿼리문까지 코드를 작성해야해서 너무 복잡해진다. 이런 부분을 조금 더 편리하게 사용하기 위해 MyBatis를 사용한다.

 

3. 마이바티스를 사용하기 위한 라이브러리(mybatis)

4. 스프링과 마이바티스를 연동시켜주는 라이브러리(mybatis-spring)

 

이렇게 총 4가지가 필요하고 아래 해당 라이브러리를 추가 후 프로젝트 리로드

<!-- spring-db 연동 jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- mysql-java 연결커넥터 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>

<!-- mybatis-spring 연동 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.7</version>
</dependency>

 

 

MySQL 워크벤치에 접속하면 이렇게 내가 만들어둔 계정이 나오는데 2번째 myConnection에 연결해볼예정

 

이건 해당 커넥션 설정을 변경할때 사용하는데 확인차 체크했고 myConnection을 클릭해서 접속한다

username이랑 password를 잘 기억하자

 

여기서 scheme을 누르면 현재 해당 계정에 존재하는 DB들이 나온다 각각이 하나의 프로젝트라고 생각하면 된다. springpratice에 연결을 할 예정이고 현재는 admin, member, user_info, board 총 4개의 테이블이 있다.

 

root-context.xml 변경

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="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">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/springPractice?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="username" value="********"></property>
        <property name="password" value="********"></property>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation"  value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
    </bean>
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory"/>
    </bean>
    <context:component-scan base-package="com.project.myapp"/>
</beans>

 

username과 password에 DB Connection의 내 아이디와 패스워드를 작성

여기서 주의사항 url에 스키마명(springPractice) 작성시 대소문자 구분한다! DB에서 소문자로만 표기하길래 상관없는줄 알고 계속 안되서 한참 애먹었는데 조심

 

src\main\java\resources\ 경로에 mybatis 설정파일을 만든다. mybatis-config.xml, mapper폴더, mapper.xml

 

1. mybatis-config.xml

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

 

mybatis-config.xml은 마이바티스랑 관련된 설정 파일인데 alias설정만 사용해봤다.

 

2. mapper폴더, mapper.xml

resources 하위경로에 mapper폴더 생성, mapper폴더에 SQL쿼리를 작성한 파일들이 저장된다.

 

테스트를 해보기 위해 testMapper.xml 하나 생성, 간단한 select문 하나 추가하고 돌려보자. mapper.xml 파일은 위에서 *Mapper.xml 패턴으로 지정했기때문에 해당 패턴에 맞춰서 작성하면 된다.( ' ' +Mapper.xml)

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

<mapper namespace="com.project.myapp.TestMapper">
    <select id="test" resultType="com.project.myapp.BoardDto">
        SELECT bno , title , content, writer
        FROM board
    </select>
</mapper>

위 데이터를 불러오도록 테스트 해보자

package com.project.myapp;
import java.util.Objects;

public class BoardDto {
    private int bno;
    private String title;
    private String content;
    private String writer;
   /** getter setter constructor toString equals hashcode 생략 */
}
package com.project.myapp;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;

@Controller
public class HomeController {
    @Autowired
    SqlSession sqlSession;
    @Autowired
    private static final String NAMESPACE = "com.project.myapp.TestMapper.";
    @GetMapping("/")
    public String home() {
        List<BoardDto> result = test();
        for (BoardDto dto : result) {
            System.out.println("dto = " + dto);
        }
        return "home";
    }
    public List<BoardDto> test(){
      List<BoardDto> list = sqlSession.selectList(NAMESPACE+"test");
      return list;
    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.myapp.TestMapper">
    <select id="test" resultType="com.project.myapp.BoardDto">
        SELECT bno , title , content, writer
        FROM board
    </select>
</mapper>

잘 불러온다

 

성공