[SpringBoot] MyBatis 연동하기
- Web/SpringBoot
- 2022. 3. 9.
SpringBoot, MyBatis 연동하기
준비된 것
PC에 설치된 DB와 개발환경 정도가 필요하다.
개인적으로 MariaDB가 친숙하므로 MariaDB를 사용하도록 했다.
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.4</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
설치 후 Maven을 통해 lib가 설치된 것을 반드시 확인해야 한다.
자동으로 설치되면 좋겠지만, 등록만 하고 설치가 안돼서 되지 않는 경우가 발생하기도 한다.
기본 설정
#MyBatis 설정
mybatis.type-aliases-package=com.union.construction_api.Domain
#SQL 문법 있는 위치.
mybatis.mapper-locations=mapper/**.xml
#db에 대한 정보
#사용할 DB://IP:PORT/데이터베이스??한글 설정
spring.datasource.url=jdbc:mariadb://localhost:3307/test_m??characterEncoding=UTF-8
#DB호출시 필요 이름, 인터넷에 검색된다.
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
#DataBase 접근 권한이 있는 ID, PW
spring.datasource.username=root
spring.datasource.password=root!!
위의 내용을 properties에 저장하도록 한다.
별 다른 설정 없이, SpringBoot의 내장된 properties가 정보를 받아들인다.
위의 과정을 거쳤다면, 등록한 정보가 일치하는지 여부를 먼저 확인하는 것도 좋다.
@Test
void DB연결확인() {
try (
Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3307/test_m??characterEncoding=UTF-8",
"root",
"root!!"
))
{
System.out.println(con);
}
catch(Exception e) {
}
}
어떤 방식을 사용하든 상관은 없다.
Spring에는 Test 기능이 있기 때문에, Test를 이용한 것일 뿐, try문의 동작에 대해 Error가 발생하지 않는다면 Java와 DB 간의 연결이 원활하다는 것을 알 수 있다.
연결방식
MyBatis는 Spring부터 사용해본 입장으로 정말 많은 방식이 존재했다.
xml 방식과 Java의 Bean을 이용해 연결하는 방식.
@configuration를 이용해서 연결하는 방식도 존재한다.
이는 각자 편한 방식으로 진행하면 되고, 필자는 Annotaion 중, @Autowired 방식이 매우 선호한다.
연결 방식이 정말 간결해서 추후 추가적인 작업이 매우 간단하다는? 장점이 있다.
다만, 너무 자동으로 연결되는 탓에 문제가 발생된다면 어디 문제인지 고생이 따를 수가 있다.
DB와 원활한 작업을 위해 mvc 패턴을 고수했다.
Controller, Service, Mapper로 구분했으며 흔히 말하는 VO, Bean, DTO 등 비슷한 역할을 수행하는 domain으로 되어있다.
@Controller
html에서 호출하는 url을 구분하는 곳이다.
url 호출에 따른 적합한 동작이 되도록 선정한다.
보통 Controller에서 작업하기도 하고 이를 Service로 옮긴다.
@Controller
public class MainController {
@Autowired
MainService mainService;
@GetMapping("/test123")
public void Test_Service() {
try {
System.out.println("test");
List<TestBean> list = mainService.TEST_SELECT();
for(TestBean i : list) {
System.out.println(i.toString());
}
}
catch (Exception e) {
}
}
}
@Service
Controller에서 선정된 작업을 처리하는 공간이다.
Controller에서 작업할 수도 있지만 Serivce에서 작업하는 것이 원래 만들어진 이유이기도 하다.
다만, 개발환경에 따라서 Service의 존재는 없을 수도 있다.
◆ Interface
public interface MainService {
//Mapper Test
List<TestBean> TEST_SELECT() throws Exception;
//Test
List<TestBean> Test2() throws Exception;
}
◆ Class
@Service
public class MainServiceImpl implements MainService {
@Autowired
MainMapper mainMapper;
@Override
public List<TestBean> TEST_SELECT() throws Exception{
return mainMapper.TESTSELECT();
}
@Override
public List<TestBean> Test2() throws Exception {
return mainMapper.Test2();
}
}
@Mapper
JAVA의 DAO를 수행하는 공간이다.
MyBatis(ibatis) 라이브러리를 소유하고 있다면 만들 수 있다.
Java에 필요한 db의 정보를 호출하기 위해 필요한 class이며, 흔히 SQL을 저장 혹은 연결하는 것을 담당한다.
◆ Interface
@Mapper
public interface MainMapper {
List<TestBean> TESTSELECT() throws Exception;
@Select("SELECT NAME FROM TEST LIMIT 1")
List<TestBean> Test2();
}
Mapper은 사용하는 방식이 크게 두 가지로 나뉜다.
1. 두 번째 문법처럼 SQL문을 Interface에 모두 적용하는 방식이다.
따로 연결할 것도 없이 SELECT문을 호출할 수 있게 도와준다.
위의 사진 Test2() 메소드 위에 선언된 Annotation이 메소드 실행 시 실행되는 sql문이다.
2. 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.union.construction_api.Mapper.MainMapper">
<select id="TESTSELECT" resultType="com.union.construction_api.Domain.TestBean">
SELECT T_NAME FROM TEST
</select>
</mapper>
Mapper에 저장한 것처럼 sql을 xml에 저장하는 방식이다.
id는 interface에 저장된 메서드 명과 연결된다.
xml의 위치는 시작 시 설정한 값으로 설정할 수 있다.
아무것도 없을 시, resources가 경로로 잡혀있다.
만약, xml만 위치를 찾지 못하는 문제가 발생한다면 경로 설정에 문제가 있을 수 있다.
설명 안 한 제일 위의 Domain은 xml에서 get, set 사용할 domain 이용 시 경로 설정을 무시해주는 설정을 가지고 있다.
마무리
간단한 내용이지만, 안 되면 진짜 막막하다.
Code는 별로 쓴 것도 없고, 딱히 설정을 건드리지도 않는다.
이 모든 것이 SpringBoot가 내장된 설정이 자동으로 연결해주기 때문이다.
Spring이었다면, sqlSession 설정하고 재밌는 짓을 벌였겠지만, 참 황당하게 Boot는 이러한 설정이 없다.
그래서 한 번에 되면 운 좋고, 안 된다면 그냥 다시 하는 게 마음에 이롭다.
다른 분들의 설정도 많이 지켜봤지만 딱히? 이유 없이 더 이상 설정을 건들 필요는 없다.단지, 설정할 때 무언가를 더 추가해야 한다면 그것은 이제 그때의 이야기이다.
'Web > SpringBoot' 카테고리의 다른 글
[SpringBoot] API 활용하기 (0) | 2022.03.11 |
---|---|
[SpringBoot] Test, JUnit 생성하기 (0) | 2022.03.09 |
[SpringBoot] SpringBoot 시작하기 (0) | 2022.03.06 |
[SpringBoot] SpringBoot 기본 라이브러리 (0) | 2022.02.24 |
[SpringBoot] SpringBoot Port 변경하기 (0) | 2022.02.23 |