왜 MyBatis를 사용할까?
JDBC만 사용하게 되면 Java소스 와 Query소스가 겹치게 되고 관리가 어려워진다
그리고 한 눈에 보기는 편하지만 짧은 쿼리만 있는 것이 아니라 엄청 길 수도 있다는 것!
1. DB 연결정보 등록
/src/main/resources/application.properties 파일 안에 DB의 연결정보를 등록한다
2. MyBatis 초기화
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
Resource[] res =
new PathMatchingResourcePatternResolver()
.getResources("classpath:mappers/*Mapper.xml");
sessionFactory.setMapperLocations(res);
return sessionFactory.getObject();
}
다음 코드를 SpringbootApiApplication.java 코드에 추가
ㄴ MyBatis는 App 전체에서 활용할 수 있도록 Application Class에서 초기화 한다고 한다!
3. SQL Mapper 생성
<?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="kr.ac.daegu.springbootapi.model.TestDAO">
<select id="getTestList" resultType="kr.ac.daegu.springbootapi.model.TestDTO">
SELECT * FROM Test
</select>
//여기서 주석--
<!--<select id="selectUsers" parameterType="me.fleuve.springboot03.dto.UserDTO"
resultType="me.fleuve.springboot03.dto.UserDTO"><!– selectUsers()메서드를 호출하면 실행할 SELECT문이며, UserDTO 객체를 파라미터로 받아, UserDTO객체를 반환합니다.–>
SELECT `seq`, `name`, `country`
FROM lab03
<if test='country != null and country != ""'><!– 만약 파라미터에 country가 있다면 SQL문에 WHERE절을 추가합니다. –>
WHERE country = #{country}
</if>
</select>-->
//주석 끝
</mapper>
SQL Mapper는 실행할 SQL문을 정의해두는 파일이다
Application class에 정의 했던 /src/main/resource/mappers/*Mapper.xml과 같이
다음 경로에 위 코드를 작성했다.(위 코드는 수정전) /src/main/resource/mappers/TestMapper.xml
4. DTO, DAO 생성하기 (model)
test.model.TestDTO / TestDAO 가 존재한다
@AllArgsConstructor //testDTO가 가지고있는 모든 Constructor 만들어라 (lombok)
@Getter
@Setter
public class TestDTO {
private int num;
private String name;
}
위의 TestDTO는 Data Transfer Object 즉 데이터 교환을 위한 객체이다.
그리고 아래와 같이 TestDAO를 생성했다
여기서 주의할 점은 class가 아니라 interface로 선언하여야 한다!
DAO는 데이터와 관련된 작업을 정의한다
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface TestDAO {
List<TestDTO> getTestList();
}
5. TestController (Controller)
사용자 요청을 처리하고 응답을 전송하는 컨트롤러 부분이다
넘어온 변수를 이용해 controller에서 Service를 호출
(MVC 패턴의 핵심은 분산!)
(https://dwc04112.tistory.com/81 참고)
import kr.ac.daegu.springbootapi.test.model.TestDTO;
import kr.ac.daegu.springbootapi.test.service.TestService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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(value = "/test")
@RequiredArgsConstructor
@Slf4j
public class TestController {
public final TestService testService;
@GetMapping(value = "/")
public List<TestDTO> rootTest() throws Exception {
log.trace("logTest~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); // 로그의 5단계 trace(일반적으로 남기는 이벤트 기록) -> debug(디버깅용) -> info(알림) -> warn(경고) -> error(에러)
log.debug("logTest~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
log.info("logTest~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
log.warn("logTest~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
log.error("logTest~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// 간단한 list 생성
List<TestDTO> testList = testService.getTestList();
return testList;
}
}
6. TestService (Service)
Service의 역할은 DB에서 받아온 데이터를 전달받아 가공하는 것이다.
(https://dwc04112.tistory.com/85 참고)
import kr.ac.daegu.springbootapi.test.model.TestDAO;
import kr.ac.daegu.springbootapi.test.model.TestDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@RequiredArgsConstructor
@Service
public class TestService {
public final TestDAO testDAO;
public List<TestDTO> getTestList() {
return testDAO.getTestList();
}
}
Postman에서 결과 확인
Postman 에서 호출하면 BoardMapper에서 id=getTestList(Service의 그것!) Test테이블의 리스트를 받는다!
http://localhost:8080/test/ 를 호출하면 다음과 같은 결과를 얻는다!
'Spring Boot > Spring Boot' 카테고리의 다른 글
37 : Springboot (Board - Mybatis) (0) | 2021.09.29 |
---|---|
36-2 : Springboot (Service) (0) | 2021.09.29 |
36-1 : Springboot (요청 방식 & Controller) (0) | 2021.09.28 |
35 : BoilerPlate와 Lombok (0) | 2021.09.28 |
34 : Springboot 시작 (0) | 2021.09.27 |