BackEnd/Spring Boot

[Spring boot] mysql mybatis 연동해보기

무무둥 2023. 1. 2. 20:06

Spring boot의 mybatis를 이용하여 mysql 데이터베이스와 연동해보도록 하겠다.

 

1. 프로젝트의 pom.xml 파일에 mybatis, mysql 관련 dependency를 추가해 준다.

아래 사이트에서 검색을 통해 쉽게 원하는 dependency를 복사해 붙여넣어 줄 수 있다.

https://mvnrepository.com/

 

상단에서 mysql 검색 후 MySQL Connector Java 를 선택한다.
프로젝트에 가져오고싶은 버전을 선택해준다.
Maven으로 프로젝트를 생성 하였으므로 Maven 그대로 하단 코드를 복사한다.

최종적으로 아래 2가지 dependency를 추가해 주면 된다.

<dependencies>

    ... 중략 ...

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

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

</dependencies>

참고할만한 점으로 mysql-connector-java의 경우 버전을 함께 명시할 경우 warnning 메세지를 띄워주는데

Spring boot의 경우 전반적으로 많이 사용되는 몇몇 dependency에 대해 버전을 입력하지 않고 자동으로 최신버전을 가져와 주는 기능을 지원하고 있기 때문에 발생하는 현상으로 version 부분을 그냥 지워주면 해결된다.

 

2. application.properties 파일 내용을 작성해 준다.

#mysql 접속정보
spring.datasource.url=jdbc:mysql://localhost:3306/shop
spring.datasource.username=DB사용자명
spring.datasource.password=DB사용자비밀번호

#mybatis mapper 위치
mybatis.mapper-locations=mapper/*.xml

spring.datasource.url 마지막 /shop의 경우 접근할 db스키마 명칭으로 필자의 경우 shop으로 임의 생성하였다.

mybatis.mapper-locations의 경우 mapper xml 파일의 경로를 설정해 주는 것으로 mapper 디렉토리 아래 모든 xml 파일을 지정해 준 모습이다.

이후 application.properties에 지정해 준 대로 mapper 디렉토리를 src/main/resources 아래에 생성해 준다.

3. 데이터를 전달해 줄 Model을 생성해 주어야 하는데, Product라는 상품 테이블을 생성하여 진행하였다.

테이블 컬럼과 맞춰 Model을 생성해 준다. 해당 클래스에 테이블에서 조회한 데이터를 담아 전달하게 될 것이다.

/demo/src/main/java/com/example/demo/shop/model/Product.java

package com.example.demo.shop.model;

public class Product {
	private String id;
	private String name;
	private String price;
	
	public Product(String id, String name, String price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
}

이클립스의 경우 클래스 안에 private로 변수 선언만 해주면 우클릭 - [Source] 아래에서 getter setter 및 생성자를 자동으로 생성해 줄 수 있기 때문에 해당 기능을 이용하여 생성해 주었다.

4. java와 mybatis 간 연결을 위한 interface 하나를 생성해 주도록 한다.

/demo/src/main/java/com/example/demo/shop/mapper/ProductMapper.java

package com.example.demo.shop.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.shop.model.Product;

@Mapper
public interface ProductMapper {

	List<Product> selectProductList();
}

상단에 @Mapper 어노테이션을 적어주는 것으로 해당 interface가 Mapper 임을 선언해주어야 한다.

 

5. 이제 실제 데이터베이스에 접근하기 위한 mapper xml 파일을 작성해 준다.

/demo/src/main/resources/mapper/ProductMapper.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.example.demo.shop.mapper.ProductMapper">
	<select id="selectProductList" resultType="com.example.demo.shop.model.Product">
		SELECT * FROM product
	</select>
</mapper>

mapper namespace의 경우 바로 이전 생성해 준 ProductMapper.java 파일을 의미한다.

해당 인터페이스에서 만들어 주었던 메서드를 호출할 경우 현제 mapper xml 파일에서 동일한 id를 가진 SQL 문을 호출하여 Product.java 클래스에 담아 반환해줄 것이다.

 

6. 마지막으로 지금까지 만들어준 서비스를 실제로 호출하기 위한 컨트롤러를 만들어 주도록 한다.

/demo/src/main/java/com/example/demo/shop/controller/ShopController.java

 

package com.example.demo.shop.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.shop.mapper.ProductMapper;
import com.example.demo.shop.model.Product;

@RestController
@RequestMapping("/shop")
public class ShopController {
	
	@Autowired
	ProductMapper mapper;
	
	@GetMapping("getProductList")
	public List<Product> getProductList() {
		return mapper.selectProductList();
	}
}

@RestController 어노테이션을 선언하여 해당 클래스파일을 RestAPI 호출을 위한 컨트롤러로 만들어준다.

@RequestMapping 어노테이션을 선언해 줄 경우 클래스 안의 api 들을 호출할 때 앞에 기본적으로 /shop을 붙여준다.

앞서 생성해 준 ProductMapper mapper를 선언해준후 아래 메서드에서 해당 매퍼에 만들어져 있는 selectProductList 함수를 호출하여 데이터베이스의 데이터를 조회해 온다. 이후 해당 데이터는 반환형으로 정의해 준 List<Product> 형태로 반환해 줄 것이다.

 

실제 해당 테이블 안에는 두 번째 화면처럼 데이터를 insert 해놓았고 해당 데이터를 localhost:8080/shop/getProductList 서비스 호출을 통해 조회하는 데 성공하였다.

 

'BackEnd > Spring Boot' 카테고리의 다른 글

mysql 초기세팅하기  (0) 2022.12.31
[이클립스] Spring boot 프로젝트 생성  (0) 2022.12.31