Framework
⚡️ == 편하게 개발할 수 있는 가이드를 줄 테니 넌 이대로만 하면 돼! ⚡️
코드 구현에 대한 개발 시간을 줄이고 코드의 재사용성 증진을 위한 일련의 클래스 묶음, 뼈대, 틀을 제공하는 라이브러리를 구현해 놓은 것
소프트웨어 개발의 입장으로써는 공통으로 사용하는 라이브러리 / 개발도구 / 인터페이스 등등을 의미
Framework의 필요성
현재 웹프로그래밍의 규모가 커지고 있음
👉🏻 거대하고 복잡도가 높은 프로젝트를 완성시키기 위해 많은 사람들이 필요함
👉🏻 그 개발자들이 "통일성" 있게 "빠르고" "안정적"으로 개발하기 위해서는 무수히 많은 규칙을 지켜야 함
👉🏻 그래서 강제성이 짙은 "프레임워크"가 좋은 성과를 내고 있음
✔️ 즉, 생산성 향상에 도움
Framework의 특징
✔️ 가이드 제공
✔️ 개발 범위가 정해져 있음
✔️ 다양한 도구 및 플러그 지원
Framework 장점
👉🏻 개발 시간 단축
👉🏻 정형화되어 있어 일정 수준 이상의 품질 기대
👉🏻 유지보수가 쉬움
Framework 단점
👉🏻 지나친 의존 시 개발자 능력 감소
👉🏻 습득 시간이 오래 걸림
Framework 종류
✔️ 영속성 Framework
👉🏻 CRUD를 편하게! 데이터의 저장/조회/변경/삭제를 다루는 클래스 및 설정 파일을 라이브러리화
예시) MyBatis, Hibernate, JPA
✔️ 자바 Framework
👉🏻 자바로 웹사이트 제작할 때 더욱 편하게 진행할 수 있도록 필요한 요소를 모듈화하여 제공함
예시) Spring, 전자정부표준 Spring, Struts
✔️ 화면구현 Framework
👉🏻 화면구현(프론트앤드 단)을 보다 쉽게 구현할 수 있는 틀 제공
예시) Bootstrap
✔️ 기능 지원 Framework
👉🏻 특정 기능이나 업무 수행에 도움을 줄 수 있는 기능 제공
예시) Log4j(변경사항을 기록), Junit(단위 테스트 기능 제공)
MyBatis
👉🏻 데이터의 입력/조회/수정/삭제(CRUD)를 보다 편하게 하기 위해 XML로 구조화한 Mapper 설정 파일을 통해 JDBC를 구현한 영속성 프레임워크
👉🏻 MyBatis의 원래 이름 IBatis
(직원들이 구글로 이직하면서 이름이 MyBatis로 바뀌었다고 함 부럽... 궁금한 점 검색할 때 참고할 것)
MyBatis 설치
MyBatis API Site 접속 : https://mybatis.org/mybatis-3/ko/
MyBatis – 마이바티스 3 | 소개
마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와
mybatis.org
시작하기에서 .jar 파일 클릭
![](https://blog.kakaocdn.net/dn/lVWcz/btrQRndbgAf/2qNZe2hp0IaR0KUgGtfYLK/img.png)
mybatis-3.5.11.zip 다운로드
![](https://blog.kakaocdn.net/dn/CwPb3/btrQUb3u5XB/pIC4YpQMK8iUTRVnW5o470/img.png)
압축 해제 후 dev 폴더로 mybatis-3.5.11.jar 옮기고 프로젝트의 lib 폴더에도 붙여넣기
![](https://blog.kakaocdn.net/dn/cZPebX/btrQUbJcnIx/kbmfnhkLxbmk2RifAcKsGk/img.png)
workspace 설정 및 세팅
1. 07_MyBatis-workspace 폴더 생성
![](https://blog.kakaocdn.net/dn/podsP/btrQTleOVHF/sHV7cWY7KR5gsxvbusw350/img.png)
2. 이클립스 세팅
2-1. 오른쪽 상단 커피콩 모양의 Java EE 버전이 맞는지 확인
![](https://blog.kakaocdn.net/dn/bKZVtm/btrQPNchaDS/KDYsjo5KE9xbE9HuQmU461/img.png)
2-2. Nevigator, Console, Problems, Servers 등 필요한 탭 추가하고 필요없는 탭은 삭제
![](https://blog.kakaocdn.net/dn/bSnrFX/btrQOOJt1xT/BhnHYMwccXVXrRUWSVfMM0/img.png)
2-3. 7가지 인코딩 설정(UTF-8)
JDBC 설정과 동일) Preferences - Gerenal - workspace - Text file encoding - Other : UTF-8
(JDBC 설정과 동일) Preferences - Gerenal - Editors - Text Editors - Spelling - Other : UTF-8
Preferences - Web - Css Files - Encoding : ISO 10646/Unicode(UTF-8)
Preferences - Web - HTML Files - Encoding : ISO 10646/Unicode(UTF-8)
Preferences - Web - JSP Files - Encoding : ISO 10646/Unicode(UTF-8)
Preferences - JSON - JSON Files - Encoding : ISO 10646/Unicode(UTF-8)
Preferences - XML - XML Files - Encoding : ISO 10646/Unicode(UTF-8)
2-4. 서버 등록
![](https://blog.kakaocdn.net/dn/LFt70/btrQTGQw7A6/jlrxSPxrBntzrI1o9Hxjx1/img.png)
2-5. 서버 설정(포트 번호, 서버 옵션 체크)
![](https://blog.kakaocdn.net/dn/blmQyi/btrQTG33u92/otyTTdYAjxe8adVZzanr1k/img.png)
2-6. 이클립스 New 버튼 즐겨찾기 설정
window-perspective-Customize perspective - Shortcuts 접속
General 👉🏻 Folder
Java 👉🏻 Class, Interface, Package, Source Folder
Web 👉🏻 Dynamic Web Project, Filter, JSP File, Servlet
XML 👉🏻 XML File
*MyBatis 설정 및 세팅
1. SQLDeveloper 설정
1-1. 관리자 계정으로 MYBATIS 계정 등록
-- MYBATIS / MYBATIS
CREATE USER MYBATIS IDENTIFIED BY MYBATIS;
GRANT CONNECT, RESOURCE TO MYBATIS;
1-2. MYBATIS 계정 테스트 후 생성
1-3. Table Script.sql 스크립트 실행
2. 동적 웹 프로젝트 생성
2-1. 프로젝트 생성
Project명: MyBatis_Project
Default output folder: webapp\WEB-INF\classes
(spring은 최상위 폴더를 자동으로 webapp으로 잡기 때문에 익숙해질 겸 최상위 폴더를 맞출 것!)
Content root: mybatis
Content directory: webapp
2-2. index.jsp 생성
2-3. 서버에 프로젝트 올리기
2-4. ojdbc6.jar, mybatis-3.5.11.jar 를 lib 폴더에 넣기
👉🏻 mybatis가 jdbc를 근간으로 하는 기술이기 때문에 ojdbc 관련 .jar 파일도 꼭 넣어 줘야 함!
EL 표현법 공부를 위해 taglib 파일들도 추가해 줌!
3. MyBatis 관련 설정
3-1. mybatis 환경설정을 위한 Source Folder 생성
일반 폴더가 아닌 소스 폴더이므로 주의할 것!
3-2. mybatis-config.xml 파일 생성
💻 3-3. mybatis-config.xml 기본 설정 내용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<typeAliases>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@Localhost:1521:xe" />
<property name="username" value="MYBATIS"></property>
<property name="password" value="MYBATIS"></property>
</dataSource>
</environment>
</environments>
<mappers>
<mapper></mapper>
</mappers>
</configuration>
!DOCTYPE configuration : 이 문서의 형식이 configuration (== 환경설정)임을 알려 줌
👉🏻 configuration 태그가 전체를 감싸고 있음
DTD : 유효성을 체크해 주는 역할
즉, 이 문서 내부의 태그들이 configuration 태그 내의 하위 요소로 존재해도 되는지 문법적인 체크를 해 줌
settings: MyBatis 구동 시 선언할 설정들을 작성하는 영역(name="키값" value="설정")
jdbcTypeForNull: 만약에 null(자바)로 데이터가 전달되었다면 DB단에서 빈칸이 아닌 NULL로 인식하겠음 (무조건 대문자 NULL로 작성)
typeAliases: VO / DTO 클래스들의 풀 클래스명을 단순한 클래스명으로 사용하기 위해서 별칭을 등록할 수 있는 영역
(클래스가 없을 때 별칭을 등록하면 해당 클래스를 찾을 수 없어 오류 나기 때문에 현재 영역만 만들어 둠)
💡 아직 생성하지 않은 VO / DTO 클래스를 별칭 지정할 경우 ClassNotFoundException 발생함
environments: MyBatis에서 연동할 DB들의 정보를 등록하는 영역
(여러 개의 DB 정보를 등록 가능 👉🏻 구분하기 위해 각각 id 속성을 붙여 줘야 함)
default 속성으로 여러 개의 DB 정보들 중 어떤 DB를 메인 DB로 쓸 것인지 id값을 명시해 줘야만 함!
하나의 DB 정보만 등록하는 것도 가능하나 그 경우에도 default와 id값을 지정해 줘야 함
transactionManager: JDBC와 MANAGED 둘 중 하나를 선택할 수 있음
- JDBC: 트랜잭션을 내가 직접 관리하겠음 (수동 commit)
- MANAGED: 개발자가 트랜잭션에 대해서 어떠한 영향도 행사하지 않겠음 (자동 commit)
dataSource: POOLED와 UNPOOLED 둘 중 하나를 선택할 수 있음
Connection 객체를 담아둘 수 있는 ConnectionPool 사용 여부
(ConnectionPool: 한 번 생성된 Connection 객체를 담아두면 재사용해서 쓸 수 있음)
- POOLED: ConnectionPool을 사용하겠음! Connection 객체를 재사용하겠음!
- UNPOOLED: ConnectionPool을 사용하지 않겠음! 매 요청마다 Connection 객체를 생성하겠음!
mappers: 실행할 sql문들을 기록해 둔 mapper 파일들을 등록하는 영역
(없는 매퍼를 등록하면 해당 매퍼 파일을 찾을 수 없어 오류 나기 때문에 현재 영역만 만들어 둠)
💡 아직 mapper 파일을 생성하지 않은 상태에서 mapper 설정을 하게 되면 FileNotFoundException이 발생함
3-4. 객체에 대한 패키지와 클래스 생성
* 패키지는 url 주소를 거꾸로 한 com.kh. 뒤에 contextRoot를 적는 게 Spring의 룰임!
context root인 mybatis 패키지 생성
공통 코드를 빼놓을 수 있는 template 패키지 생성
공통 코드를 빼놓을 수 있는 Template 클래스 생성
(기존의 JDBCTemplate 클래스의 역할을 대신 수행하는 클래스)
💻 Template 클래스
💡 getSession 메소드 하나로 기존의 JDBCTemplate에서 사용하던 모든 메소드를 사용 가능함!
🚂 진행 순서
👉🏻 SqlSession sqlSession = null;
- 해당 DB와 접속된 SqlSession 정의
- null로써 먼저 정의해 줌
👉🏻 String ①경로가 담긴 변수 = "/mybatis-config.xml";
- mybatis-config.xml에 등록한 DB 정보를 가지고 올 수 있게끔 경로가 담긴 변수 생성
👉🏻 InputStream ②경로가 지정된 변수 = Resource.getResourceAsStream(①);
- 통로 열고 여기서 가지고 오라고 공식적 경로 지정
👉🏻 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactoryBuilder 객체를 기본 생성자로 생성
👉🏻 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(②);
- SqlSessionFactory 객체 생성
- SqlSessionFactoryBuilder의 build 메소드 호출하여 변수②를 담아 줌
👉🏻 sqlSession = sqlSessionFactory.openSession(false);
- SqlSession 객체 생성
- sqlSessionFactory의 openSession 메소드를 이용하여 진짜 통로를 만들어 줌! (false == 수동 커밋 하겠다)
package com.kh.mybatis.common.template;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
// 기존의 JDBCTemplate 클래스의 역할을 대신 수행하는 클래스
public class Template {
/*
* 기존 JDBCTemplate 클래스의 메소드들
*
* public static Connection getConnection() {
* driver.properties 라는 파일을 읽어들여서
* 해당 DB와 접속된 Connection 객체를 생성해 반환
* }
*
* public static void close(Connection/Statement/ResultSet) {
* 전달받은 JDBCT용 객체를 반납시키는 구문 (오버로딩)
* }
*
* public static void commit/rollback(Connection) {
* 트랜잭션 처리
* }
*
*/
// 마이바티스용 메소드
public static SqlSession getSqlSession() {
// mybatis-config.xml 파일을 읽어들여서 해당 DB와 접속된 SqlSession 객체를 생성해서 반환
SqlSession sqlSession = null;
String resource = "/mybatis-config.xml"; // 슬래시(/) 는 최상위 폴더를 의미(resources 폴더)
// SqlSession 객체 생성 단계
// SqlSession 객체를 생성하기 위해서는 SqlSessionFactory 객체가 필요
// SqlSessionFactory 객체를 생성하기 위해서는 SqlSessionFactoryBuilder 객체가 필요
try {
// 1. 자원으로부터 통로를 얻어내겠음 (InputStream 객체 생성)
InputStream stream = Resources.getResourceAsStream(resource);
// 2. SqlSessionFactoryBuilder 객체 생성
// => 기본 생성자로 생성
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 3. SqlSessionFactory 객체 생성
// => sqlSessionFactoryBuilder 객체로부터 build 메소드 호출
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(stream);
// 이 단계에서 mybatis-config.xml 파일이 읽힘
// 4. SqlSession 객체 생성
// => sqlSessionFactory 객체로부터 openSession 메소드 호출
sqlSession = sqlSessionFactory.openSession(false);
// openSession 메소드
// : 자동 commit을 할 건지 안 할 건지에 대한 여부를 지정
// => false == 자동 commit을 하지 않겠음 (개발자가 직접 commit을 하겠다)
// 개발자 문서의 예시처럼 매개변수 생략 시 기본값은 false임!
// => true == 자동 commit을 하겠음
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}