마이바티스 사용이유
마이바티스란?
마이바티스는 퍼시스턴스계층 (데이터처리계층)의 프레임워크로
정형화된 테이블 구조에 의존하지 않고 sql구문의 실행결과에 객체를 매핑하는 방식이다.
테이블 구조가 복잡해지고 정규화 되 있지 않아도 테이블을 변경할 필요 없이 기존 개발방법에서 사용한
sql을 그대로 사용할 수가 있고
sql에 적용한 튜닝들도 모두 그대로 유지된다.
작동흐름
- 데이터처리를 위해 DAO는 MYBATIS에 제공하는 객체의 메서드를 호출한다
- 마이바티스는 SQL문이 저장된 맵퍼 파일에서 데이터 처리에 필요한 SQL문을 찾는다.
- 마이바티스는 맵퍼 파일에서 찾은 SQL을 서버에 보내고자 JDBC드라이버를 사용
- JDBC드라이버는 SQL문을 DB서버로 보낸다.
- 마이바티스는 SELECT문의 실행 결과를 값 객체에 담아서 반환.
INSERT UPDATE DELETE문인경우 입력 변경 삭제된레코드의 개수 반환.
(오라클 기준)
애플리케이션에서 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 |
spring mvc 동작방식
Spring MVC 동작 방식
- web.xml의 등록된 DispatcherServlet를 통해서 요청에 대해 진입.
- DispatcherServlet은 Client로부터 들어온 URL을 HandlerMapping 라는 곳으로 전송
후 URL을 분석해서 알맞은 Controller 이름을 다시 DispatcherServlet으로 보냄.
- HandlerMapping이라는 것을 통해서 실행될 Controller의 이름을 입력받은
DispatcherServlet은 전달받은 Controller를 실행시킴. 이렇게 실행된 Controller는 스프링에
서 제공하는 ModelAndView 객체에 뷰 페이지에 전달할 객체와 View Page 이름 정보를 담
고 DispatcherServlet으로 보냄.
- ViewResolver를 통해 보여 질 View 페이지를 탐색한 후 View 페이지를 보여줌.
'WEB > 이론' 카테고리의 다른 글
마이바티스 사용이유 (0) | 2017.04.11 |
---|---|
jdbc와 마이바티스 (0) | 2017.03.21 |
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이. (0) | 2017.03.20 |
web.xml (0) | 2017.01.18 |
jdbc와 마이바티스
1.jdbc란?
자바 프로그램 내에서 데이터베이스 질의문 즉, SQL을 실행하기 위한 자바 API(application programming interface)이다.
다음은 프로젝트시 사용했던 jdbc예제이다.
1.java swing을 통해 구현했던 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package server; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; public class DB_Main { public ArrayList<String> dbMain = new ArrayList<String>(); String sql; public DB_Main(String sql) { // TODO Auto-generated constructor stub try { this.sql = sql; //1. jdbc 드라이버를 메모리로 로드한다. Class.forName("oracle.jdbc.driver.OracleDriver"); //2. DB 서버에 연결 Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.43.34:1521:orcl", "hr", "hr" ); //3. sql 명령어 실행하기 위한 Statement 객체 생성 Statement stmt = con.createStatement(); //4. sql 명령어 실행(Statement를 통해서) //검색한 결과가 rs에 담겨져 있음 //ResultSet rs = stmt.executeQuery(SelectFrom.fromTable); ResultSet rs = stmt.executeQuery(sql); while(rs.next()) { if(sql.equals("select kind,id,name,pw,tel,address,birth from staff")) { String kind = (rs.getString("kind").equals("0") ? "관리자" : "직원" ); String id = rs.getString("id"); String name = rs.getString("name"); String pw = rs.getString("pw"); String tel = rs.getString("tel"); String ad = rs.getString("address"); String birth = rs.getString("birth"); dbMain.add(kind); dbMain.add(id); dbMain.add(name); dbMain.add(pw); dbMain.add(tel); dbMain.add(ad); dbMain.add(birth); } } rs.close(); stmt.close(); con.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
2. jsp와 연동한 예제 (DAO))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class BoardDAO { private Connection conn = DBConn.getConnection(); public int insertBoard(BoardDTO dto, String mode){ int result=0; PreparedStatement pstmt=null; String sql; String fields="num,userid,subject,content"; sql="INSERT INTO freeboard (" + fields + ") VALUES (?,?,?,?)"; try { pstmt = conn.prepareStatement(sql); int maxNum = maxBoardNum() + 1; pstmt.setInt(1, maxNum); pstmt.setString(2, dto.getUserId()); pstmt.setString(3, dto.getSubject()); pstmt.setString(4, dto.getContent()); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } |
db와 연동해 커넥션을 맺고 쿼리문을 날려 resultset을 받아오고, 그걸 rs.next()와 같은 방법을 통해 받아온다.
2.마이바티스
jdbc는 SQL의 변경이 발생할 경우 java파일 ,즉 프로그램 소스를 수정하기 때문에 유연성이 좋지 못했는데, 마이바티스 에서는 SQL을 xml 파일에 작성하기 때문에, SQL의 변환이 자유롭고, 가독성이 좋다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function check() { var f = document.boardForm; var str = f.subject.value; if(!str) { f.subject.focus(); return false; } str = f.content.value; if(!str) { f.content.focus(); return false; } var mode="${mode}"; if(mode=="created") f.action="<%=cp%>/bbs/created"; else if(mode=="update") f.action="<%=cp%>/bbs/update"; return true; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //글쓰기 POST// @RequestMapping(value="/bbs/created", method=RequestMethod.POST) public String createdSubmit( Board dto, HttpSession session ) throws Exception { SessionInfo info = (SessionInfo)session.getAttribute("staff"); if(info==null){ return "redirect:/"; } dto.setS_num(info.getS_num()); service.insertBoard(dto); return "redirect:/bbs/list"; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Service("bbs.boardService") public class BoardServiceImpl implements BoardService { @Autowired private CommonDAO dao; //글쓰기. @Override public int insertBoard(Board dto) { int result = 0; try { result = dao.insertData("bbs.insertBoard", dto); } catch (Exception e) { System.out.println(e.toString()); } return result; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public int insertData(String id, Object value) throws Exception { int result = 0; try { result = sqlSession.insert(id, value); } catch (Exception e) { System.out.println(e.toString()); throw e; } finally { } return result; } |
5.맵퍼.xml
1 2 3 4 5 6 7 8 9 10 | <mapper namespace="bbs"> <!-- 글쓰기 --> <insert id="insertBoard" parameterType="com.sp.bbs.Board"> INSERT INTO bbs ( num,s_num,subject,content) VALUES( bbs_seq.NEXTVAL, #{s_num}, #{subject}, #{content}) </insert> |
'WEB > 이론' 카테고리의 다른 글
마이바티스 사용이유 (0) | 2017.04.11 |
---|---|
spring mvc 동작방식 (0) | 2017.03.22 |
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이. (0) | 2017.03.20 |
web.xml (0) | 2017.01.18 |
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이.
MVC 란 Model View Controller를 가리킨다.
사용자 인터페이스와 비즈니스 로직을 분리하여 웹개발을 하는 것이 목적
즉,
모델은 애플리케이션의 정보, 데이터를 나타내며
뷰는 사용자에게 보여주는 인터페이스.
컨트롤러는 비즈니스 로직과 모델의 상호동작을 조정하는 역할을 한다.
mvc1 패턴과 2패턴의 차이점으로는 mvc1 패턴의 경우에는 비즈니스로직과 디자인로직이 함께 있지만
mvc2패턴은 서블릿이 컨트롤러 역할을 수행한다.
사진 출처 : http://blog.daum.net/gunsu0j/165
1.요청 - 클라이언트 -----> 컨트롤러(서블릿 or jsp) --[dto] --> 서비스 --[dto]--> DAO --> DB
2.응답 - DB --> DAO --[dto]-> 서비스 --[dto]-->컨트롤러(서블릿 or j) --> view -------> 클라이언트
클라이언트는 컨트롤러로 요청을 한다. 컨트롤러는 dto라는 껍데기를 태워 비즈니스계층인 서비스단으로 보낸다.
서비스단에서 퍼시스턴스 계층으로 명령을 해 DB와 연동한다.
그렇게 가져온 값을 JSP 뷰단으로 가져온 뒤 클라이언트 (HTML)로 보내준다.
'WEB > 이론' 카테고리의 다른 글
마이바티스 사용이유 (0) | 2017.04.11 |
---|---|
spring mvc 동작방식 (0) | 2017.03.22 |
jdbc와 마이바티스 (0) | 2017.03.21 |
web.xml (0) | 2017.01.18 |
배포설명자(web.xml)
3. Web Application의배포
3.1 web.xml 의태그들설명
icon : 웹 애플리케이션을나타내기위해IDE나GUI툴에서사용되는하나또는두개의 이미지 파일들의위치를지정하는데사용한다.
Display-name : GUI툴이 웹애플리케이션을 표시하기 위해 사용하는 이름을 지정하는데 사용
Context-param : 어플리케이션의 초기화파라미터를 선언하는데 사용
filter : 서블릿이나 jsp 페이지로들어오는요청정보를사전에걸러내는기능
Filter-mapping : 필터를 지정했다면filter-mapping을지정하여하나이상의서블릿과연결함
listener : 서블릿 2.3버전으로부터 세션이나 서블릿컨텍스트가 생성 또는 수정되거나 소멸되는 것을 알려주는 이벤트리스너
servlet : 서블릿이나 jsp페이지에 초기화파라미터나 사용자url들을 할당할 때 사용되는 서블릿 jsp이름을지정
Servlet-mapping : 상대 URL경로를 좀 더 쉽게 다루기 위해 기본URL를 변경할 때 사용
description : 웹 어플리케이션에대한설명을나타낸다.
distributable : Distributable 요소가있다는것은 웹어플리케이션이 다중서버간에 분산배치 될 수있다는것을 의미한다.
Session-config : 일정시간동안 세션으로접근이없을경우서버는메모리를절약하기위해사용
하지 않는메모리를삭제한다세션의시간유지기능
Mime-mapping : 특정한 MIME형을가진파일을웹어플리케이션에넣어두고싶은경우사용
Welcome-file-list : Url이 파일명이아닌디렉토리명으로받았을경우기본적으로불러올파일명을
지정하는데 사용
Error-page : Http상태코드가 반환되거나예외가발생햇을때그내용을출력하는페이지
Tag-lib : 태그라이브러리 설명자파일의별칭을지정하는데사용
Resource-envref : Reource-env-ref 요소는자원(resource)과연관되어관리되는객체를선언하
는 역할을한다.
Resource-ref : Resource-ref 요소는 외부에서참조해야할자원을선언할때사용
Security-constraint : 어떤url이 보호되도록지정하는역할을한다. Login-config와연결되어사용
Login-config : 보안된 페이지로들어가려는사용자에대한서버의인증방식을지정해준다.
Security-role : 통합개발 환경에서보안정보를좀더조작하기쉽게만들어준다.
Env-entry : 웹 어플리케이션의환경항목을선언한다.
Ejb-ref : 엔터프리이즈 빈의홈에대한레퍼런스를선언
Ejb-local-ref : 엔터프라이즈 빈의로컬홈에대한레퍼런스를선언
'WEB > 이론' 카테고리의 다른 글
마이바티스 사용이유 (0) | 2017.04.11 |
---|---|
spring mvc 동작방식 (0) | 2017.03.22 |
jdbc와 마이바티스 (0) | 2017.03.21 |
스프링 MVC 구조와 MVC1패턴과 2패턴의 차이. (0) | 2017.03.20 |