본문으로 바로가기

마이바티스(Mybatis) 개요

category 데이터베이스/마이바티스 2018. 12. 28. 21:27

마이바티스(Mybatis)

 

마이 바티스를 공부하면서 포스팅 해봅니다. ㅎ

 

기존에는 JDBC를 사용해서 개발을 했습니다.

 

즉 데이터 조회 입력 수정 삭제 등을 일일이 코드로 작성했습니다.

 

작은 코드를 지속적으로 복사 붙여넣고 하다보니 사람들은 빈번하고 힘들다라고 느끼게 됐고

 

시간도 꽤나 오래 걸린다고 생각했습니다.

 

우선 JDBC코드를 보죠..

 

Connection conn = null

PreparedStatement stmt=null;

ResultSet rs= null;

 

try{

Class.forName("com.mysql.jdbc.Driver").newInstance();

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","ljc","ljc");

String sql="SELECT comment_no, user_id, comment_content, reg_date FROM comment";

 

 

  stmt=conn.prepareStatement(sql);

rs=stmt.executeQuery();

 

List<Comment> comments=new ArrayList<Comment>();

 

while(rs.next())

{

Comment comment= new Comment();

comment.setCommentNo(rs.getLong("comment_no"));

     comment.setUserId(rs.getString("user_id"));

comment.setCommentContent(rs.getString("comment_content"));

comment.setRegDate(rs.getDate("reg_date"));

 

comments.add(comment);

}

 

}catch(Exception e)

{

e.printStackTrace();

}finally{

try{

rs.close();

}

catch(SQLException e){}

try{

stmt.close();

④  }catch(SQLException e)

{
}

try{

conn.close();

}

catch(SQLException e)

{
}

}

 

위 코드는 댓글 조회 JDBC 코드이다.

 

은 데이터베이스 자원 설정 코드입니다.

 

즉 조회 전에 데이터베이스 연결과 데이터 가져 오기 위한 자원 설정 부분입니다.

 

Connection은 연결정보를 갖고있으며

 

드라이버를 Class.forName으로 로드를 하고

 

이를 통해 getConnection()을 호출합니다.

 

그 후 SQL을 정의를 하게 되죠.

 

Class.forName("JDBC 드라이버 클래스명").newInstance()

 

DriverManager.getConnection("JDBC URL","ID","Password")

 

두 메소드를 호출 해서 얻습니다.

 

SQL을 갖는 구문 객체 PreparedStatement를 생성합니다.

 

아까 얻은 conn으로 conn.prepareStatment(sql)을 호출하면 됩니다.

 

위 처럼 매번 연결을 할 때마다 자원을 설정해줘야 하고 ... 동일 코드를 여러 곳에 적어야 하는

 

불편함이 있습니다.

 

② 에서 SQL 을 실행합니다.

 

조회 같은 경우는 executeQuery를 호출 하면 되고 삽입 삭제 등등은 executeUpdate를 호출합니다.

 

ResultSet 객체를 반환하게 됩니다.

 

③에서는 조회 결과를 설정합니다.

 

조회 결과를 데이터를 모델에 설정 과정을 모두 거치게 됩니다.

 

만약 데이터베이스 테이블이 어마어마하게 크다면.... 이를 모두 설정해줘야하는거죠 ..

 

이때 getString 등등 메소드를 호출하는데 이때 칼럼명을 잘못 넣는 경우도 허다합니다.

 

즉 칼럼과 모델 대상 변수가 타입이 다를 경우 변환 처리도 까다롭습니다.( 예외 처리가 많아짐)

 

④에서는 데이터베이스를 최종적으로 자원을 해체하는 단계입니다.

 

여기서도 마찬가지로 일일이 다 close를 호출해주고 불편함이있습니다.

 

이떄 데이터를 조회하는 경우에만 ResultSet을 쓰기 때문에 이때는 꼭 ResultSet에 대해 닫아줘야합니다.

 

삽입 삭제등의 경우에는 ResultSet을 쓰지 않기 때문에 걱정하지 않아도 됩니다.

 

즉 데이터가 무지 크다면 이러한 위의 과정들이 몹시 불편하고 효율도 떨어질겁니다.

 

이를 해결할 간단한 마이바티스 코드를 살펴봅시다.

 

마이바티스는 JDBC에서 사용한 SQL을 XML에 분리합니다.

 

우선 데이터베이스를 조회하는 마이바티스 매핑 구문으로

 

<select id ="selectForList" resultType="Comment">

SELECT comment_no, user_id, comment_content, reg_date FROM comment

</select>

 

아까 위에서 SQL구문입니다. 이를 select 태그를 ㅣㅇ용하여 분리하게됩니다.

 

즉 SQL을 xml에 선언한겁니다.

 

이렇게 관리를 하게 됩니다.

 

위에서 id는 API를 이용해 SQL을 실행하게끔 만듭니다.

 

resultType은 클래스를 적어줍니다.

 

이 속성을 통해 setter메소드를 사용해 값을 자동으로 등록합니다.

 

마이바티스 코드를 살펴보죠.

 

public List<Comment> queryForList() {

InputStream inputStream=

Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

return sqlSessionFactory.selectList("selectForList");

}

 

이코드를 작성하는 이유는 xml 에 분리한 sql을 API를 사용하여 실행하고 결과를 가져와야합니다.

 

즉 위 코드는 SQL을 실행합니다.

 

SqlSessionFactory 객체를 생성하는 것은 마이바티스 생성 과정입니다.

 

이 객체를 필수적으로 생성하고 이를 이용해서 xml에 등록한 매핑구문을 사용하면됩니다.

 

뒤에서 더 자세히 설명하겠습니다.

 

여기서 보면 해제나 등록과정이 없습니다. 좀더 간결해졌죠?

 

그래서 마이바티스를 사용합니다.

 

그럼 마이바티스란 무엇일까요.??

 

객체지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀더 쉽게 할 수 있는 개발 프레임워크입니다.

즉 긴 SQL문을 작성 할 때 append나 ""를 써서 계속 붙여줘야하는 불편감이 있을겁니다.

 

그래서 XML에 sql을 작성해서 수정도 편하고 간단해지는 장점이있는겁니다.

 

마이바티스는 총 3개의 프로젝트로 이루어집니다.

  • 코어 프레임워크: JDBC 단순화와 SQL을 XML에 정의해주는 큰 부분
  • 마이바티스 제너레이터: 테이블별로 SQL과 자바 모델 클래스를 자동으로 만들어준다.
  • 스키마 마이그레이션: 데이터베이스 변경 시 그에 맞게 마이바티스 관련 파일을 변경해준다.

 연동 모듈에는

  • 스프링 연동 모듈: 가장 빈도가 높다. 스프링과 마이바티스를 연동하는 API제공
  • 구글쥬스 연동 모듈: 구귤 즈스와 연동할때 사용
  • OsCache 캐시 연동 모듈: 현재는 없어짐..
  • EhCache 캐시 연동 모듈: 최근 많이 쓰이는 캐시 라이브러리
  • HazelCast 캐시 연동 모듈: 분산 캐시를 지원

<참고>

 

JDK1.5의 제네릭과 어노테이션

1) 제네릭: 클래스와 메소드 처리에 대한 타입을 제약하는 방법입니다.

 

 

제네릭 사용 x

=>

public static void nonGenericLoop(List strs)

{

String str;

for(int i=0; i<strs.size(); i++)

{

                  str=(String)strs.get(i); //무엇이든 형변환

System.out.println(str);

}

}

제네릭 사용 o

=>

public static void genericLoop(List<String> strs)

  {

String str;

for(int i=0; i<strs.size(); i++)

{

                  str=strs.get(i); //형변환x

System.out.println(str);

}

  }

 

즉 <String>을 통해 List 타입을 한정합니다.

 

Cast를 안하더라도 오류 없이 제대로 돌아가는 더욱 안전한 코드라고 할수있죠..

 

 

2) 어노테이션

 

어노테이션 사용x

=>

public class UtilTest extends TestCase{

public void testSum(){

assertTrue(3==Util.sum(1,2));

}

}

 

위 코드는 어노테이션을 사용하지 않은 코드로 여러 규칙을 정ㅇ해줘야합니다.

 

즉 TestCase를 확장하고 test로 시작하는 메소드를 정의해야합ㄴ디ㅏ.

 

어노테이션 사용o

=>

public class UtilTest{

@Test

public void checkSumValue() throws Exception{

assertTrue(3==Util.sum(1,2));

}

}

 

위 코드는 어노테이션을 사용한 것으로 확장도 없고 test로 시작하지 않아도 됩니다.

 

더 가독성이 좋습니다.

 

 

 

마이바티스 구조

 

마이바티스 구조에 대해 알아보도록 합시다. 직접 그려봤습니다.

 

mybatis-config.xml: 데이터베이스 설정/ 트렌젝션 동작 규칙 설정 파일

 

매퍼: SQL을 XML에 정의한 매퍼 XML 파일 + SQL을 인터페이스 메소드 마다 어노테이션 정의한 메퍼 인터페이스

 

결과 매핑: 조회 결과를 자바 객체에 설정 규칙

 

매핑 구문: SQL을 XML에 정의한 매핑 구문 (정의 방식: 어노테이션 or XML)

 

지원 파라미터: MAP, 자바 객체, 원시타입(int String Date)

 

지원 결과 타입:MAP, 자바 객체, 원시타입(int String Date)

 

 


 

 

 

 

 

 

'데이터베이스 > 마이바티스' 카테고리의 다른 글

마이바티스 CRUD(수정)  (0) 2019.01.07
마이바티스 CRUD(삽입)  (0) 2019.01.04
마이바티스 CRUD(조회)  (0) 2019.01.03
마이바티스 CRUD(자바모델클래스)  (0) 2019.01.02
마이바티스 시작  (0) 2018.12.30