IT_Note



마이바티스란? 

마이바티스는 퍼시스턴스계층 (데이터처리계층)의 프레임워크로

정형화된 테이블 구조에 의존하지 않고 sql구문의 실행결과에 객체를 매핑하는 방식이다.


테이블 구조가 복잡해지고 정규화 되 있지 않아도 테이블을 변경할 필요 없이 기존 개발방법에서 사용한

sql을 그대로 사용할 수가 있고

sql에 적용한 튜닝들도 모두 그대로 유지된다.


작동흐름


- 데이터처리를 위해 DAO는 MYBATIS에 제공하는 객체의 메서드를 호출한다

- 마이바티스는 SQL문이 저장된 맵퍼 파일에서 데이터 처리에 필요한 SQL문을 찾는다.

- 마이바티스는 맵퍼 파일에서 찾은 SQL을 서버에 보내고자 JDBC드라이버를 사용

- JDBC드라이버는 SQL문을 DB서버로 보낸다.

- 마이바티스는 SELECT문의 실행 결과를 값 객체에 담아서 반환. 

INSERT UPDATE DELETE문인경우 입력 변경 삭제된레코드의 개수 반환.



일반적으로 dao에서 마이바티스를 사용하는 시나리오

- dao는 sqlsessionfactory에게 sql을 실행할 객체를 요구한다
- sqlsessionfactory는 sqlsession 객체를 생성하여 반환한다.
- dao는 sqlsession객체에게 sql실행을 요청
- sqlsession객체는 sql이 저장된 맵퍼파일(xml)에서 sql을 찾는다
- sqlsession은 jdbc드라이버를 통해 db에 질의를 실행
- sqlsession은 db로부터 가져온 질의 결과를 객체로 생성하여 반환
- dao는 사용이 끝난 sqlsession을 닫는다.



---------------------------------------추가설명 ( OKKY 검색)



(오라클 기준)

애플리케이션에서 DB 접속할 때 마다 DB쪽에서도 1:1로 프로세스가 생성됩니다.  예를 들어, 클라이언트 100개가 접속하면 오라클 서버 쪽에도 100개의 프로세스가 생성되는 식이죠. 문제는 오라클 서버 프로세스 생성하는 게 상당한 오버헤드를 일으킬 수 있습니다. 무엇보다 자원 재사용이 안되니까요.


그래서 나온게 커넥션 풀링(connection pooling)입니다.  미리 DB 연결을 맺어두고 그 pool 내에서 필요할 때 꺼내서 사용하고 반환하는 식이죠. 물론 접속이 늘어나면 커넥션 풀에서 자동으로 DB 접속 세션 수를 늘립니다. 


mybatis나 ibatis가 커넥션 풀링 기능만 제공하는 건 아니에요. 말씀하신 것처럼 웹로직이나 다른 WAS에서도 기본적으로 제공하는 기능입니다.


단순히 커넥션 풀링 때문에 프레임워크를 쓰는 건 아니고요.


그리고 JSP나 ASP 코딩해보셨으면 아시겠지만, 자바 코드 내에 HTML 태그하고 SQL 쿼리가 짬뽕되면 가독성이나 유지보수성이 현저히 떨어집니다.  JAVA 코드 내에 SQL을 문자열 +해서 짠 코드 보신적 있으시죠?  SQL이 조금만 길어지고 복잡해져도 눈돌아갑니다.


그래서 이걸 분리하려는 움직임이 생긴거죠. 그러면 가독성이나 유지보수 시 상당히 편리해집니다. 생산성은 곧 비용과 직결되죠.



-----------

1. 가장 큰 이유는 빠른 개발(생산성)이 가능합니다. 

- DBCP만을 썼을때 Connection, ResultSet, Statement, Transaction 관리도 해야 하고 

- 특히 운영하다 명시적인 Connection, ResultSet, Statement, Transaction을 잘못(닫질 않아) 써서 서버가 죽는경우 허다합니다. 

- ResultSet의 데이터 매핑도 신경써야 하고

- 소스코드가 하드코딩(""+""+"")되어 있음 소스 분석 및 관리가 힘듭니다. (10,000 라인 넘어가는 소스 한번 보믄 이해하실겁니다. )

2. 보안적으로 SQL Injection 보안에 신경쓰지 않아도 됩니다. 

- 물론 DBCP를 쓸 경우 PrepareStatement 쓰믄 문제 없지만 

3. RDBMS가 Oracle일 경우 Blob, Clob 치환에 신경쓰지 않아도 됩니다. 

4. 디버깅이 쉬워집니다. 

- iBatis, myBatis 쿼리문의 ? => value로 매핑된 쿼리문으로 로그를 남기는 jar파일이 여럿 있습니다. 

5. 데이터 캐싱(LIFO,FIFO, LRU)이 가능합니다. 

- 조회용 데이터 성능이 안나올 때 데이터 캐싱 설정만으로 훌륭한 성능 개선을 할 수 있습니다. 

- 실제 대규모 사이트에서 적용 사용하고 있음. 

- 간단한 xml 설정만으로 적용 가능 

6. 꼭 resultType, resultClass로 VO를 사용 않으셔도 됩니다. Map으로만 이용 가능 




참고  - https://okky.kr/article/285215


'WEB > 이론' 카테고리의 다른 글

spring mvc 동작방식  (0) 2017.03.22
jdbc와 마이바티스  (0) 2017.03.21
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이.  (0) 2017.03.20
web.xml  (0) 2017.01.18