본문 바로가기

Spring Boot/Spring Boot

36 : Springboot (MyBatis를 이용하여 MySQL 연동)

 

왜 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">&lt;!&ndash; selectUsers()메서드를 호출하면 실행할 SELECT문이며, UserDTO 객체를 파라미터로 받아, UserDTO객체를 반환합니다.&ndash;&gt;
        SELECT `seq`, `name`, `country`
        FROM lab03
        <if test='country != null and country != ""'>&lt;!&ndash; 만약 파라미터에 country가 있다면 SQL문에 WHERE절을 추가합니다. &ndash;&gt;
            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/ 를 호출하면 다음과 같은 결과를 얻는다!

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