Spring Boot + myBatis 연결하기

Jin·2024년 1월 21일
1

놀랍게도 이 사람은 Spring + mybatis는 써봤지만 SpringBoot와의 조합은 처음이라고 합니다.

사실 어쩌다보니 스프링부트는 이번이 처음임.

또 까먹을게 뻔해서 제대로 정리함.

참고로 maven이고
파일 구조의 경우 밑에와 같다.

src
|-- main
|   |-- java
|   |   `-- com
|   |       `-- example
|   |           `-- demo
|   |               |-- DemoApplication.java
|   |               `-- room
|   |                   |-- controller
|   |                   |   `-- RoomController.java
|   |                   |-- mapper
|   |                   |   `-- RoomMapper.java
|   |                   `-- service
|   |                   |   |-- RoomService.java
|   |                   |   `-- RoomServiceImpl.java
|	|					`-- dto
|   |                       `-- RoomDto.java
|   `-- resources
|       |-- application.properties
|       `-- mapper
|           `-- RoomMapper.xml
|-- test
`-- ...

pom.xml

dependency를 설정
mybatis-spring-boot-starter & mysql-connector-java
놀랍게도 첨에 2.xx인가 썼다가 버전 달라서 에러뜸
찾아보니까 스프링부트는 별도로 버전 설정을 안해도 parent 버전에 맞추어 알아서 해주는 거 같았다.

        <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.2.2</version>
		<relativePath/> <!-- lookup parent from repository -->
		</parent>
								...
        <dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

이렇게 해도 알아서 3.2.2에 맞춰 의존성 설정을 해준다. 의존성은 인텔리제이 기준

우측에서 확인가능

resources

application.properties

spring.datasource.url=jdbc:mysql://localhost:0000/schemaname
spring.datasource.username=username
spring.datasource.password=userpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:/mapper/**/*.xml

여기가 꽤나 고생했다.
classpath는 com.example.demo이다.

mapper

여기 경로 땜에 꽤나 고생했다.

mybatis.mapper-locations=classpath:/mapper/**/*.xml

위에 application.properties에서 지정해준 경로로 폴더를 만들어서 적으면 된다.

<?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.room.mapper.RoomMapper">
    <select id="getAllRooms" resultType="com.example.demo.room.dto.RoomDto">
        select * from gameroom;
    </select>
</mapper>

namespace는 내가 src에서 sql쿼리와 연결할 경로를 적으면 된다. resultType또한 가지고 올 타입이라는 쓰임새만 다를 뿐 의미는 같다.

src

우리가 아는 자바 클래스들

dto

이하 생략

mapper

여기서 @Mapper 어노테이션을 적어줘야한다.
그리고 resources/mapper에 있는 id와 같은 이름을 적어줘야한다. resources/mapper의 쿼리문과 java코드 간 매핑을 한다고 보면된다.

package com.example.demo.room.mapper;

import com.example.demo.room.dto.RoomDto;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface RoomMapper {
    List<RoomDto> getAllRooms();
    boolean isPublic();
}

service

인터페이스는 생략
Service 어노테이션 국룰
mapper와 controller를 연결한다고 생각하면 편하다.

package com.example.demo.room.service;

import com.example.demo.room.dto.RoomDto;
import com.example.demo.room.mapper.RoomMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class RoomServiceImpl  implements RoomService{

    @Autowired
    private RoomMapper roomMapper;
    @Override
    public List<RoomDto> getRoomList() {
        return roomMapper.getAllRooms();
    }
}

controller

RestController 어노테이션 국룰
본격적으로 여기서 이것저것 로직을 넣는다.

package com.example.demo.room.controller;

import com.example.demo.room.dto.RoomDto;
import com.example.demo.room.service.RoomService;
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 java.util.List;

@RestController
@RequestMapping("/room")
public class RoomController {

    @Autowired
    private RoomService roomService;
    @GetMapping
    public String room(){return "room";}

    @GetMapping("/list")
    public List<RoomDto> getRoomList(){
        return roomService.getRoomList();
    }
}

결론


대충 sql 테이블 만들었다고 하면 sql서버와 프로젝트 연결하는 것은 pom.xml와 application.properties에서 하고,
sql 데이터를 처리 하는 파트는 resources/mapper + src/mapper + src/dto 여기고
그리고 직접적으로 프로젝트에 활용할 수 있도록 하는 부분은 src/service + src/controller라고 보면 될듯.

사실 나도 야매로해서 대충 내가 매번 할 때마다 프로젝트 생성하는 흐름대로 적어보았다.

profile
go-getter

2개의 댓글

comment-user-thumbnail
2024년 1월 25일

님 제 팀원이랑 코드가 똑같네요

1개의 답글