레이블이 spring jdbc mybatis인 게시물을 표시합니다. 모든 게시물 표시
레이블이 spring jdbc mybatis인 게시물을 표시합니다. 모든 게시물 표시

2020년 7월 22일 수요일

스프링프레임워크, Spring JDBC, MySQL, MyBatis 실습예제

스프링프레임워크, JDBC, MySQL, MyBatis 실습예제

1.2.3. Spring, JDBC, MyBatis, MySQL

마이바티스는 데이터베이스와 대화할 때 사용할 수 있는 기술 중에 하나입니다. SQL쿼리를 DAO클래스로부터 분리함으로써 SQL관리성을 증대시켜주는 데이터베이스 처리기술 입니다.

앞서 살펴 본 Spring JDBC 기술을 사용하는 경우 개발자는 2가지 종류의 로직만 기술하면 되었습니다. 첫 번째는 SQL쿼리작성이고 두 번째는 결과처리 로직이었습니다. 그런데 변하는 것과 변하지 않는 것이 같이 있다면 분리하는 것이 좋습니다. 변하는 부분만 따로 분리하여 관리하면 그 만큼 관리성이 증대될 것이기 때문입니다.

이 개념을 멋지게 적용한 기술이 MyBatis 라고 할 수 있습니다.

MyBatis는 학습곡선도 높지 않아 국내에서 널리 사용되고 있습니다. 프로젝트를 개발단계에만 초점을 맞추지 않고 운영 및 업그레이드 단계에 초점을 맞추어 보면 Spring JDBC 기술보다 마이바티스를 선호하게 될 수 있습니다. 또한 쿼리 작성자와 이를 이용해서 DAO 로직을 만드는 개발자를 분리할 수 있다는 점에서 분업화에 유리하기 때문에 국내 SI프로젝트에서 많이 사용하고 있습니다. 마이바티스는 자바 표준 데이터베이스 처리기술인 JDBC를 바탕으로 동작한다는 점에서 Spring JDBC 기술과 비슷합니다. 마치 트렁크는 하나인데 가지가 두개인 모습입니다.

새 프로젝트 생성

File > New > Spring Starter Project >

프로젝트 명: chapter1-3 > Next >

디펜던시 선택: Web, JDBC, MySQL, MyBatis > Finish

스프링 부트 디펜던시 목록에 마이바티스가 추가되었습니다. 간단하게 디펜던시를 선택하는 것 만으로 설정작업이 자동으로 처리됩니다. 이전에는 마이바티스를 위한 환경설정을 개발자가 직접 처리해야 스프링 부트 프로젝트에서 사용할 수 있었습니다.

보다 자세한 내용은 다음 사이트를 참고하세요.

http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

프로젝트 환경 설정

application.properties

# DATASOURCE

spring.datasource.platform=mariadb

spring.datasource.sqlScriptEncoding=UTF-8

spring.datasource.url=jdbc:mysql://localhost:3306/testdb?createDatabaseIfNotExist=true

spring.datasource.username=root

spring.datasource.password=1111

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

테스트 DB 생성

"1.2.2.3. 테스트 DB 생성" 부분을 참고하여 schema.sql, data.sql 파일을 resources 폴더 밑에 배치합니다. 앞서 Spring JDBC 샘플 프로젝트를 진행했다면 이미 testdbDB에 반영되어 있을 것이기 때문에 수행하지 않아도 됩니다. 다만 프로젝트가 독립적으로 동작되도록 수행해 놓는 것이 좋습니다.

다음 화면은 HeidiSQL로 접속하여 살펴 본 테이블들의 데이터 조회화면입니다.

HeidiSQL 설치방법은 "부록 3. HeidiSQL" 부분을 참고하세요.

스캐폴딩

다음 그림을 보고 패키지 및 폴더를 생성합니다. com.example.employee 패키지 밑으로 하부 패키지, 클래스 및 XML 파일을 생성하세요.

모델 클래스

Emp.java

package com.example.employee.model;

public class Emp {

private int empno;

private String ename;

private String job;

public Emp() {}

public Emp(int empno, String ename, String job) {

this.empno = empno;

this.ename = ename;

this.job = job;

}

// getter, setter 생략

}

Persistence Layer

EmpDao.java

package com.example.employee.repository;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Select;

import org.springframework.stereotype.Repository;

import com.example.employee.model.Emp;

@Mapper

public interface EmpDao {

@Select("select empno, ename, job from emp order by empno asc")

public List<Emp> select();

}

MyBatis 기술의 핵심은 자바코드와 SQL 쿼리를 분리한 것입니다. DAO 인터페이스의 추상메소드에 마이바티스가 제안하는 어노테이션으로 해당 메소드가 사용해야 할 쿼리를 지정합니다. @Mapper 어노테이션을 인터페이스 클래스에 붙이면 마이바티스가 인터페이스 구현체를 만들고 그 객체를 스프링이 받아서 빈 컨테이너에 등록합니다.

인터페이스를 작성한 것 만으로 개발자가 해야 할 작업은 끝났습니다. 나머지는 마이바티스와 스프링이 협력해서 개발자 대신 처리해 줄 것입니다.

일반적으로 SQL 쿼리는 예제처럼 짧지 않기 때문에 별도의 Mapper XML에 쿼리를 작성해 놓고 해당 인터페이스와 연계되도록 설정한 후 사용하는 것을 선호합니다.

지금은 @Select 어노테이션 설정으로 잘 작동하는지 테스트 해 보고 나중에 XML 설정으로 변경해 보겠습니다.

Service Layer

서비스 레이어의 로직은 특별히 새로운 것이 없습니다. 이전에 사용한 파일을 그대로 사용할 수 있습니다.

EmpService.java

package com.example.employee.service;

import java.util.List;

import com.example.employee.model.Emp;

public interface EmpService {

public List<Emp> select();

}

EmpServiceImpl.java

package com.example.employee.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import com.example.employee.model.Emp;

import com.example.employee.repository.EmpDao;

@Service

public class EmpServiceImpl implements EmpService {

@Autowired

private EmpDao empDao;

@Override

public List<Emp> select() {

return empDao.select();

}

}

Presentation Layer

프리젠테이션 레이어의 로직은 특별히 새로운 것이 없습니다. 이전에 사용한 파일을 그대로 사용할 수 있습니다.

EmpRestController.java

package com.example.employee.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import com.example.employee.service.EmpService;

@RestController

public class EmpRestController {

@Autowired

private EmpService empService;

@GetMapping("/emps")

public Object getEmps(){

return empService.select();

}

}

서비스 레이어와 프리젠테이션 레이어의 클래스들을 그대로 사용할 수 있다는 것은 다음 의미를 갖습니다.

Spring JDBC기술을 사용하다가 MyBatis 기술을 사용하도록 변경하는 경우 전체 아키텍처에서 데이터베이스 처리를 담당하는 기술만을 변경하는 것입니다.

예를 들어 자동차의 차체는 그대로 사용하면서 엔진만을 교체하는 작업과 비슷합니다.

테스트

http://localhost:8080/emps 주소로 접속하여 결과를 확인합니다.

데이터베이스 처리 기술을 Spring JDBC에서 MyBatis로 멋지게 변경하였습니다.

Mapper XML 사용

메소드가 사용해야 할 쿼리를 어노테이션으로 클래스 내에 설정하는 방법은 앞서 살펴 보았으니 이번에는 XML 파일로 분리해서 이용하는 방법을 살펴보겠습니다.

EmpDao.java

@Select 어노테이션을 제거합니다.

package com.example.employee.repository;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Select;

import org.springframework.stereotype.Repository;

import com.example.employee.model.Emp;

@Mapper

public interface EmpDao {

// 제거 : @Select("select empno, ename, job from emp order by empno asc")

public List<Emp> select();

}

select 메소드가 사용해야 하는 쿼리를 별도 XML 파일에 작성합니다.

emp-mapper.xml

파일 위치: com/example/employee/repository/emp-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

<mapper namespace="com.example.employee.repository.EmpDao">

<select id="select" resultType="Emp">

select empno, ename, job from emp order by empno asc

</select>

</mapper>

namespace="com.example.employee.repository.EmpDao"

매퍼 XML을 마이바티스가 인식하도록 알려줄 필요가 있습니다. 네임 스페이스에 인터페이스를 풀패스로 지정하면 마이바티스는 이 파일 안에 담긴 쿼리들을 어떤 인터페이스의 추상메소드들 이 사용해야 하는지 알게 됩니다.

<select id="select" resultType="Emp">

id로 추상 메소드명을 그대로 사용해서 설정하면 해당 메소드가 사용해야 하는 쿼리가 무엇인지 파악하게 됩니다. 더불어서 select 태그와 resultType의 자료형으로 마이바티스는 쿼리의 종류를 파악하고 결과를 어떻게 처리해야 하는지 판단할 수 있습니다.

resultType의 자료형으로 모델클래스를 사용하고 있습니다. 원래는 설정 시 클래스의 풀패스를 써야 합니다. 풀패스를 클래스명만 짧게 써도 인식되게 만들려면 마이바티스에게 알려주어야 합니다.

패키지명까지 써야 하는 모델클래스 이름을 클래스명만으로 간단하게 줄여 쓰기 위한 앨리어스 설정을 스프링 부트 설정파일에 추가합니다.

application.properties

# MyBatis

mybatis.mapper-locations=classpath*:com/example/employee/repository/**/*.xml

mybatis.type-aliases-package=com.example.employee.model

mybatis.mapper-locations 설정으로 매퍼 XML 파일들의 위치를 마이바티스에게 알려 줍니다.

type-aliases-package 설정으로 해당 패키지에 있는 모든 클래스들은 매퍼 XML에서 클래스명만으로 설정해도 마이바티스는 풀패스가 무엇인지 파악할 수 있게 됩니다.

어노테이션 방식으로 SQL 쿼리를 알려주고 사용할 때는 mybatis.type-aliases-package 설정은 필요하지 않습니다.

테스트

http://localhost:8080/emps 주소로 접속하여 결과를 확인합니다.

정리

마이바티스는 SQL 쿼리를 분리할 수 있는 유용한 기술입니다. }

클래스 안에 쿼리를 기술하는 경우, 이를 수정하려면 개발자가 필요하겠지만 별도의 파일로 분리해 놓았다면 굳이 개발자가 아니더라도 수정할 수 있게 됩니다.

마이바티스는 DAO 인터페이스의 추상메소드의 파라미터, 리턴자료형, SQL 쿼리의 종류를 보고 처리해야 하는 로직을 판단할 수 있으므로 개발자 대신 인터페이스 구현체를 만들어 주는 서비스를 제공합니다. 따라서 마이바티스를 사용하면 개발자가 해야 하는 업무는 DAO 인터페이스 생성, 추상 메소드 작성, 추상 메소드가 사용하는 쿼리 지정 입니다.

개발자가 구현 클래스를 직접 만들지 않아도 되는 점에서 Spring JDBC 보다 점수를 더 주고 싶습니다.

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...