### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도
... : 같은 목차 내에 구분 기호
...................................
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
...................................
###################################
1. 이론 및 정보
-----------------------------------
* 자주 사용되던 프레임워크 조합

예전 Spring + Struts
중소기업 주로 MIFlatform (유료)

국내에서 인기 있는 DB 프레임워크
Hibernate(포크레인), MyBatis(삽)
Hibernate는 복잡한 연결 가능하나, 어렵고 복잡
MyBatis(예전 IBatis)는 단순 맵핑만 가능, 쉽고 직관적

스프링과 조합이 잘 맞는 프레임워크
Spring 3.0 이상 + MyBatis
-----------------------------------
* IBatis - 아파치 재단
구글에게 스카웃 제의를 받음 -> MyBatis
IBatis 2.0 까지는 아파치
MyBatis 3.0 부터 시작
-----------------------------------
* MyBatis
사용방법이 여러가지 있음

고전적인 방법으로 세가지 파일이 필요
1. 환경설정을 위한 파일, 컨트롤 파일, XML
2. DB작업을 하기위한 SQL 작업(DML)을 위한 파일, XML
3. 2번 파일을 실제 자바클래스로 맵핑시키는,
     reflection 해주는 자바 클래스 파일
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
* mybatis
mvnrepository.com/artifact/org.mybatis/mybatis/3.3.0
<dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.3.0</version>
</dependency>

/BoardApp/pom.xml
에 추가

기존에는
/BoardApp/src/main/java/board/repository
/BoardApp/src/main/java/member/repository
에서 DAO를 했는데

새로운 패키지에서 MyBatis를 준비하겠음
/BoardApp/src/main/java/mybatis

Mybatis 환경 설정 파일
/BoardApp/src/main/java/mybatis/mybatis_config.xml

mybatis.github.io/mybatis-3/ko/getting-started.html
에서 설계도 복사, 붙여넣기

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml
에 있던 JNDI가 필요 없음, MyBatis에서 자동 제공하지만, 주석처리는 하지 않음

/BoardApp/src/main/java/mybatis/mybatis_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value="oracle.jdbc.OracleDriver" />
                    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
                    <property name="username" value="scott" />
                    <property name="password" value="1111" />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>



Mybatis SQL 파일
/BoardApp/src/main/java/mybatis/board_mapper.xml

<?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="mybatis.board_mapper">
     <select id="getList" resultType="board.domain.BoardDto">
          select * from tblSpringBoard order by b_seq desc
     </select>
     <insert id="write" parameterType="board.domain.BoardDto">
          insert into tblSpringBoard(
          b_seq,b_title,b_content,b_writer,
          b_regdate,b_hitcount,b_password)
          values(seq_.nextVal,
          #{b_title},#{b_content},#{b_writer},sysdate,0,'1111')
     </insert>
</mapper>

에서 mapper는 반드시 namespace를 지정해야한다. 보통 패키지 이름을 넣음
<select id=""></select> 이런 ID에는 메서드 이름을 넣는 게 좋음
<select id="getList" resultType="board.domain.BoardDto">에서
resultType은 최소단위인 Dto를 넣어줌

Mybatis SQL 파일을 reflection 시켜주는 자바 파일
/BoardApp/src/main/java/mybatis/BoardManager.java


/BoardApp/src/main/java/mybatis/member_mapper.xml
/BoardApp/src/main/java/mybatis/MemberManager.java
-----------------------------------

/BoardApp/src/main/java/mybatis/mybatis_config.xml
의 설정을 분리 및 typeAlias로 긴 패키지 이름은 간단하게 사용하게 해줌

/BoardApp/src/main/java/mybatis/oracle.properties
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password="1111"

/BoardApp/src/main/java/mybatis/mybatis_config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <properties resource="mybatis/oracle.properties"></properties>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value=${driver} />
                    <property name="url" value=${url} />
                    <property name="username" value=${username} />
                    <property name="password" value=${password} />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>
-----------------------------------
###################################
3. 소스코드 또는 실습
-----------------------------------
3-1
Workspace : ~\study\SpringWork
...................................
/BoardApp/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>BoardApp</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>BoardApp Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jdbc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>org.mybatis</groupId>
               <artifactId>mybatis</artifactId>
               <version>3.3.0</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>BoardApp</finalName>
     </build>
</project>
...................................
/BoardApp/src/main/java/mybatis/mybatis_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <properties resource="mybatis/oracle.properties"></properties>
     <typeAliases>
          <typeAlias type="board.domain.BoardDto" alias="boardDto" />
          <typeAlias type="member.domain.UserDto" alias="userDto" />
     </typeAliases>
     <environments default="development">
          <environment id="development">
               <transactionManager type="JDBC" />
               <dataSource type="POOLED">
                    <property name="driver" value="${driver}" />
                    <property name="url" value="${url}" />
                    <property name="username" value="${username}" />
                    <property name="password" value="${password}" />
               </dataSource>
          </environment>
     </environments>
     <mappers>
          <mapper resource="mybatis/board_mapper.xml" />
          <mapper resource="mybatis/member_mapper.xml" />
     </mappers>
</configuration>
...................................
/BoardApp/src/main/java/mybatis/board_mapper.xml

<?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="mybatis.board_mapper">
     <select id="getList" resultType="boardDto">
          select * from tblSpringBoard order by b_seq desc
     </select>
     <insert id="write" parameterType="boardDto">
          insert into tblSpringBoard(
          b_seq,b_title,b_content,b_writer,
          b_regdate,b_hitcount,b_password)
          values (seq_user.nextVal,
          #{b_title},#{b_content},#{b_writer},sysdate,0,'1111')
     </insert>
</mapper>
...................................
/BoardApp/src/main/java/mybatis/member_mapper.xml

<?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="mybatis.member_mapper">
     <select id="getIdPw" resultType="member.domain.UserDto" parameterType="member.domain.UserDto">
          select * from tblSpringMember where u_id=#{u_id} and u_pw=#{u_pw}
     </select>
</mapper>
...................................
-----------------------------------
3-2
Workspace : ~\study\SpringWork
...................................
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

package board.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;

import board.domain.BoardDto;
import mybatis.BoardManager;

public class BoardDaoImpl implements BoardDao {

     private JdbcTemplate jdbcTemplate;

     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;
          // System.out.println("BoardDaoImpl - jdbcTemplate" + jdbcTemplate);
     }

     public List getList() throws SQLException {
          // String sql = "select * from tblSpringBoard order by b_seq desc";
          //
          // RowMapper rm = new BoardRowMapper();
          // List result = new ArrayList();
          //
          // // 반복문이 포함되어 있어서
          // // 자동으로 result에 결과 값이 누적된다
          // result = jdbcTemplate.query(sql, rm);
          // System.out.println("BoardDaoImpl - result size : " + result.size());
          //
          // return result;
          return BoardManager.getList();
     }

     class BoardRowMapper implements RowMapper {
          public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
               // (ResultSet arg0, int arg1)
               // arg0은 전달되는 데이터
               // arg1은 몇번째 데이터 인지
               BoardDto dto = new BoardDto();
               dto.setB_seq(arg0.getInt("b_seq"));
               dto.setB_title(arg0.getString("b_title"));
               dto.setB_content(arg0.getString("b_content"));
               dto.setB_writer(arg0.getString("b_writer"));
               dto.setB_regdate(arg0.getString("b_regdate"));
               dto.setB_hitcount(arg0.getInt("b_hitcount"));
               dto.setB_password(arg0.getString("b_password"));
               return dto;
          }
     }

     public BoardDto findBySeq(int seq) throws SQLException {
          // ResultsetExtractor
          String sql = "select * from tblSpringBoard where b_seq = " + seq;
          // ResultSetExtractor rse = new BoardResultSet();

          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    BoardDto dto = new BoardDto();
                    if (rs.next()) {
                         dto.setB_seq(rs.getInt("b_seq"));
                         dto.setB_title(rs.getString("b_title"));
                         dto.setB_content(rs.getString("b_content"));
                         dto.setB_writer(rs.getString("b_writer"));
                         dto.setB_regdate(rs.getString("b_regdate"));
                         dto.setB_hitcount(rs.getInt("b_hitcount"));
                         dto.setB_password(rs.getString("b_password"));
                    }
                    return dto;
               }
          };
          BoardDto dto = jdbcTemplate.query(sql, rse);
          System.out.println("BoardDaoImpl - findBySeq - dto.getB_writer() : " + dto.getB_writer());
          return dto;
     }

     class BoardResultSet implements ResultSetExtractor {
          public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
               BoardDto dto = new BoardDto();
               if (rs.next()) {
                    dto.setB_seq(rs.getInt("b_seq"));
                    dto.setB_title(rs.getString("b_title"));
                    dto.setB_content(rs.getString("b_content"));
                    dto.setB_writer(rs.getString("b_writer"));
                    dto.setB_regdate(rs.getString("b_regdate"));
                    dto.setB_hitcount(rs.getInt("b_hitcount"));
                    dto.setB_password(rs.getString("b_password"));
               }
               return dto;
          }
     }

     public void write(BoardDto dto) throws SQLException {

          // String sql = "insert into tblSpringBoard(b_seq,b_title,b_content,"
          // + "b_writer,b_regdate,b_hitcount,b_password) " + " values
          // (seq_board.nextVal, ?,?,?,sysdate,0,'1111')";
          //
          // Object[] values = new Object[] { dto.getB_title(),
          // dto.getB_content(), dto.getB_writer() };
          //
          // // DB에 전달
          // jdbcTemplate.update(sql, values);

          BoardManager.write(dto);
     }

     public void update(BoardDto dto) throws SQLException {

     }

     public void delete(int seq) throws SQLException {

     }

}
...................................
/BoardApp/src/main/java/mybatis/BoardManager.java

package mybatis;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import board.domain.BoardDto;
import member.domain.UserDto;

public class BoardManager {
     private static SqlSessionFactory sqlMapper;

     // 반드시 static 블럭 사용
     static {
          try {
               // 환경설정 XML 읽어 와야함
               Reader reader = Resources.getResourceAsReader("mybatis/mybatis_config.xml");
               sqlMapper = new SqlSessionFactoryBuilder().build(reader);
          } catch (IOException e) {
               throw new RuntimeException("SqlSessionFactory 인스턴스 생성 실패");
          }
     }
     
     // 내가 마음대로 만든 메서드, 반드시 static
     public static List getList(){
          List list = null;
          SqlSession session = sqlMapper.openSession();
          
          // 내가 만들어 놓은 맵퍼의 id명을 넣음
          // List로 전달 받겠다는 메서드 사용
          list = session.selectList("getList");
          return list;
     }
     
     public static void write(BoardDto dto){
          System.out.println("BoardManager : dto : "+dto);
          SqlSession session = sqlMapper.openSession();
          session.insert("write", dto);
          // 반드시 insert, update, delete가 해야할 코드
          session.commit();
     }
     
     public static UserDto getIdPw(UserDto dto){
          UserDto user = null;
          SqlSession session = sqlMapper.openSession();
          user = session.selectOne("getIdPw",dto);
          return user;
     }
}
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
     <h1>글쓰기</h1>
     <form action="board_write.board" method="post">
          제목 : <input type="text" name="b_title"/><br/><br/>
          작성자 : <input type="text" name="b_writer"/><br/><br/>
          내용 : <textarea rows="5" cols="50" name="b_content"></textarea>
          <br/><br/>
          <input type="submit" value="저장"/>
          <input type="button" value="리스트 페이지" onclick="location.href='board_list.board'"/>
     </form>
</body>
</html>
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
-----------------------------------
-----------------------------------


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day89  (0) 2015.07.20
오픈프레임워크_Day88  (0) 2015.07.17
오픈프레임워크_Day87  (0) 2015.07.16
오픈프레임워크_Day86  (0) 2015.07.16
오픈프레임워크_Day85  (0) 2015.07.14
,