놀랍게도 이 사람은 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
`-- ...
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에 맞춰 의존성 설정을 해준다. 의존성은 인텔리제이 기준
우측에서 확인가능
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이다.
여기 경로 땜에 꽤나 고생했다.
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또한 가지고 올 타입이라는 쓰임새만 다를 뿐 의미는 같다.
우리가 아는 자바 클래스들
이하 생략
여기서 @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 어노테이션 국룰
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();
}
}
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라고 보면 될듯.
사실 나도 야매로해서 대충 내가 매번 할 때마다 프로젝트 생성하는 흐름대로 적어보았다.
님 제 팀원이랑 코드가 똑같네요