DAO : Data Access Object 란? 무엇을 달라는 다오다오.....



최대한 이해하고, 공부하는 분야도 보니 틀리 수도 있습니다.

틀린점이 있다면, 알려주시면 감사합니다.



DAO 결론 : Database의 수행하는 부분을 전적으로 담당한다고 생각하면 됩니다.

커넥션을 하나만 두고(싱글톤 패턴), 여러 사용자가 DAO의 interface를 사용하여 필요한 자료에 접근하게 만드는 것입니다. 


 예를 들어, 뷰에서 사용자가 데이터를 요청할 때, 서블렛(또는 서버)에서 DB에 접근을 하는 경우, DB의 접근을 위해서 커넥션 객체를 생성하게 됩니다. 만약, 다수의 서블렛에서 동시에 컨넥션 객체를 생성한다면, DB 접근으로 인한 컨넥션 객체를 생성하는데, 메모리와 시간을 상당히 사용됩니다. 


 이러한 점을 탈피하기 위해서, 하나의 객체를 생성하여 그 객체만이 계속적으로 DB의 접근하도록 하는 것입니다. 그 객체가 바로 DAO 입니다.


DAO 패턴은 표준 J2EE 디자인 패턴 중 하나입니다. 이 패턴을 사용하여 하위 수주늬 데이터 액세스 작업과 상위 수준의 비즈니스 논리와 분리합니다.

DAO 클래스에는 특정 데이터 소스의 데이터에 액세스하기위한 논리가 포함되어 있습니다. 



참고 페이지 : Advanced DAO programming








도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~




블로그 이미지

미나미나미

,

[데이터베이스] mybatis 사용하기 ( JSP,AJAX. Sevlet)


[데이터베이스] MariaDB 설치하기 보러가기

[데이터베이스] 마리아DB(MariaDB) - 이클립스 연동 보러가기

[데이터베이스] 마리아DB(MariaDB) - JSP - ajax 연동 예제 의 다음 이야기로 진행하시는데 

어려움 또는 설정 파일을 필요하신 분들은 앞에 부분들부터 천천히 읽고 오시면 좋을거 같습니다.




마리아DB를 편리하게 쓰고, 좀더 DB의 오버헤드를 줄이기 위해서

Mybatis를 사용하는 법을 진행하겠습니다.


Mybatis를 쓰기 위해서는 Jar의 파일이 필요합니다.

아래의 GITHUB의 가시면 mybaits의 zip 파일을 얻을 수 있습니다.

파일 중 mybatis-3.X.X.jar를

WebContent , WEB-INF , lib 아래 두시면 됩니다. 


다운 받으러 가기 : https://github.com/mybatis/mybatis-3/releases





마리아DB와 Mybatis를 사용하기 위해서는 
아래의 주황색 박스의 부분의 코드들이 필요하다.





controller : JSP에서 버튼 이벤트로 Ajax 요청을 받아서, package test.DataDao에서 

데이터를 Object로 돌려줍니다.


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    //doGet(request, response);
    DataDao dao = new DataDao();
    //test.DataDao의 DataDao.java를 통해서 sqlSessionFa
    List<Data> list= dao.getList();
    for(int i = 0; i < list.size(); i++){
        System.out.println(list.get(i).getName());
    }
    
}




test.DataDao:  controller 의해 요청된 정보에 대해서 

test.mybatis의 SqlSessionFactoryService.java 파일에 

생성된 sqlSessionFactory의 인스턴스 통해서

sqlSession를 생성 후 DataMpper.xml에서 Mapper를 통해서 

원하는 데이터를 가져옵니다. 
여기서 가져올 때, test.DataVO.Data.java를 통해서 Data를 object화 시켜가져옵니다.


package test.DataDao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import test.mybatis.SqlSessionFactoryService;
import test.DataVo.*;

public class DataDao {
    private SqlSessionFactory sqlSessionFactory;
    //sqlSessionFactory는 sqlSession를 생성하기 위해 사용
    /*
        한번 만든뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 한다.
        그래서 삭제하거나 재생성할 필요가 없다.
        애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory 를
        다시 빌드하지 않는 것이 가장 좋은 형태이다.
         가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이다.
     */
    public DataDao(){
        sqlSessionFactory = SqlSessionFactoryService.getSqlSessionFactory();
    }
    public List<Data> getList() { // DataDao의 의해서 MariaDB에서 값을 받아온다. list

        SqlSession session = null;

        try {
            session = sqlSessionFactory.openSession();
            //세션을 생성하여 매핑구문을 실행하거나
            //커밋 또는 롤백을 하기 위해 세션을 사용
            return session.selectList("getlist");
            //DataMapper.xml 매핑된 Sql 구문을 실행 후 찾은 데이터를
            //controller에 데이터를 보내준다.
        } finally {
            if (session != null)
                session.close();
                //세션 더이상 필요하지 않은 상태가 되면 세션을 닫는다.
        }
    }


}




test.DataVo:  DB에서 읽어올 데이터를 Object화 시켜주기 위하여 생성된 변수들

getter/setter를 사용하며, 테이블의 구조의 헤더의 선언된 정보와 같다.


package test.DataVo;

public class Data {
    /*
        MariaDB에서 읽어올 테이블의 헤더와 동일하다.
        읽어 올 테이블의 구조는
        번호 , 이름 , 학년
        => number , name. grade
        이렇게 구성되어있다.
    */
    
    private String name;
    private int grade;
    private int number;
        
    public Data() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Data(String name, int grade , int number) {
        super();
        this.name = name;
        this.grade = grade;
        this.number = number;
    }   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    
}




test.mybatis.DataMapper.xml:  DataDao.java 에서의 수행할 함수 기능에 대한 정보를 가지고 있다.


<?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="test.mybatis.DataMapper">
<!--패키지 경로를 포함한 전체 이름을 가진 구문을 구분하기 위해 필수로 사용한다.-->
    <select id="getlist" resultType="data">
        <!--함수 호출명 getlist 결과 DataVo의 Data.java 형식-->
        select * from test_stu order by number desc
    </select>
</mapper>



test.mybatis.mybatis-config.xml:  접속한 DB의 정보 및 수행할 정보도 가지고 있다.


<?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"> -->
<!-- Attribute "resource" must be declared for element type "mapper". -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <typeAliases>
        <typeAlias type="test.DataVo.Data" alias="data" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="org.mariadb.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/가져올DB" />
                <property name="username" value="아이디" />
                <property name="password" value="비밀번호" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="test/mybatis/DataMapper.xml" />
    </mappers>

</configuration>



test.mybatis.sqlSessionFactoryService.java


package test.mybatis;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionFactoryService {

    private static SqlSessionFactory sqlSessionFactory;
    static{
        try{
String resource = "test/mybatis/mybatis-config.xml";
//mybatis를 통해서 연결할 DB, id , pass 정보를 가지고 있다.
InputStream is = Resources.getResourceAsStream(resource);

//mybatis-config.xml를 통해서 내가 연결할 mariadb 연결 정보를 읽어 온다.
sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
/*
이 클래스는 인스턴스회되어 사용되고 던져질 수 있다.
SqlSessionFactory 를 생성한 후 유지할 필요는 없다.
그러므로 SqlSessionFactoryBuilder 인스턴스의
가장 좋은 스코프는 메소드 스코프(예를들면 메소드 지역변수)이다.
여러개의 SqlSessionFactory 인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder를
재사용할 수도 있지만 유지하지 않는 것이 가장 좋다.
*/
// 가져온 정보를 통해서
        }catch(IOException ie){
            System.out.println(ie.getMessage());
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
//test.DataDao의 DataDao.java 파일의 의해서 요청된
//sqlSessionFactory -> sqlSession를 만들기위해서 sqlSessionFactory를 reutrn한다.
        return sqlSessionFactory;
    }   
}




JSP 화면


<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>

<title>테스트 페이지</title>
</head>

<body>
<p>테스트</p>
<button id="jsonSend" type="button"> maria 값 가져오기 실행</button>
<script>
$('#jsonSend').click(function () {
jsonSend();
});

function jsonSend() {
$.ajax({
type: "POST",
url: "/TistoryExample//MariaDB_mybatis_tset",
data: {}, //json을 보내는 방법
success: function (data) { //서블렛을 통한 결과 값을 받을 수 있습니다.
alert(data);
console.log(data);
},
error: function (e) {
console.log(e);
alert('저장에 실패했습니다.');
}
});
}
</script>
</body>

</html>




결과화면










도움이 되셨다면, 구독과 좋아요.... 아니아니 ...

공감 버튼 꾸욱 눌러주세요 ~~


블로그 이미지

미나미나미

,