카테고리 없음

MyBatis_1. 프레임워크 및 환경설정하기

하이팝 2023. 12. 19. 15:41

 

 

* 프레임워크 ?
- 개발자가 보다 편리한 환경에서 개발할 수 있도록 제공하는 뼈대, 틀
- 소프트웨어 개발의 입장으로써는 공통으로 사용하는 라이브러리 / 개발도구 / 인터페이스 등등을 의미한다.

* 사용하는 이유 ?
- 거대하고 복잡도가 높은 프로젝트를 완성시키기 위해서는 많은 사람이 필요한데
  그 많은 개발자들이 "통일성"있고 빠르고 안정적으로 개발하기 위해서는 프레임워크가 필요하기 때문이다.

* 프레임워크 특징
- 자유롭게 설계하고 코딩하는 것이 아니라 프레임워크가 제공하는 가이드대로 설계해야 한다.
- 개발범위가 정해져 있다.
- 개발자를 위한 다양한 플로그인들이 지원된다.

* 프레임워크 장단점
> 장점 : 개발시간을 단축할 수 있다.
        오류로부터 자유로워질 수 있다.
> 단점 : 의존하다보면 개발능력이 떨어져서 프레임워크 없이 개발하는 것이 어렵다.
        습득까지 시간이 오래걸릴 수 있다.

 

!! 프로젝트 lib폴더에 mybatis.jar 파일을 추가해야 사용가능하다.. !!

 

<!-- mybatis-comfig.xml 파일에서 환경설정하기 -->

<!-- URL : https://mybatis.org/mybatis-3/ko/getting-started.html -->
<!-- 마이바티스 -> XML에서 SqlSessionFactory 빌드하기 -->

<?xml version="1.0" encoding="UTF-8" ?>

<!--   이 문서의 형식이 configuration(환경설정)임을 알려줌 -->
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
  
<!-- 	
	configuration태그가 전체를 감쌈 
	DTD : 유효성을 체크해줌(내가 작성한 태그들이 configuration태그 안에 존재해도 되는지를 체크해줌)
-->

<configuration>
<!-- * settings : MyBatis구동시 사용할 설정들을 작성하는 영역 -->
	<settings>
		<setting name="jdbcTypeForNull" value="NULL"/>
   		<!-- 만약 null로 데이터가 전달된다면 빈칸이 아닌 NULL로 인식하겠다는 설정 -->
	</settings>
	
<!-- * typeAlias : VO/DTO클래스들의 풀클래스명을 단순한 클래스명으로 사용하기 위한 별칭을 등록할 수 있는 영역 -->
	<typeAliases>
		<typeAlias type="com.kh.member.model.vo.Member" alias="member"/>
	</typeAliases>
	
	
<!-- 
	* environments : MyBatis에 연동할 DB정보들을 등록하는 영역(여러개 DB정보 등록가능)
		    => default속성으로 여러개의 id중 어떤 DB를 기본 DB로 사용할지 설정해야 한다.
-->
  <environments default="development">
    <environment id="development">
    
    
<!-- 
    * transactionManager : JDBC OR MANAGED 둘 중 하나를 선택할 수 있음.
    - JDBC : 트랜잭션 관리를 개발자가 하겠다(수동 commit)
    - MANAGED : 트랜잭션 관리를 트랜잭션매니저에게 위임하겠다(자동 commit)
-->
      <transactionManager type="JDBC"/>
      
<!-- 
    * dataSource : POOLED와 UNPOOLED 둘중 하나를 선택할 수 있음
                   (ConnectionPool 사용여부)	
     - ConnectionPool : Connection객체를 담아둘 수 있는 영역
                        한 번 생성된 Connection객체를 담아두면서 재사용함
     => POOLED : ConnectionPool을 사용하겠다.
     => UNPOOLED : ConnectionPool을 사용하지 않겠다.
-->
      <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 name="password" value="MYBATIS"/>
      </dataSource>
    </environment>
  </environments>
  
<!-- 
    * mappers : 실행할 sql문들을 기록해둔 mapper파일들을 등록하는 영역
-->
  <mappers>
    <mapper resource="/mappers/member-mapper.xml"/>
  </mappers>
</configuration>

 

 

 

<!-- member-mapper.xml 설정하기 -->

<!-- URL : https://mybatis.org/mybatis-3/ko/getting-started.html -->
<!-- 마이바티스 -> 매핑된 SQL 구문 살펴보기 -->


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="memberMapper">
<!-- namespace : 현재 mapper의 고유한(UNIQUE) 별칭 -->

<!-- 
	* resultMap : 마이바티스 핵심 기능중 하나
	  ResultSet으로부터 조회된 칼럼값을 하나씩 뽑아서 vo객체의 각 필드에 담는 JDBC코드를 대신 수행해준다. 

	  <resultMap id="식별자" type="조회된결과를 담아서 반환하고자 하는 vo객체의 타입">
	  	<id column="조회결과를 뽑고자하는 DB의 PK칼럼명" property="결과값을 담아줄 필드명" />
	  	<result column="조회결과를 뽑고자하는 DB테이블의 칼럼명" property="결과값을 담아줄 필드명"/>
	  </resultMap>
 -->

<resultMap type="member" id="memberResultSet">
	<!-- type="member" (==) Member m = new Member(); -->
	
	<id column="USER_NO" property="userNo" />
	<!-- == m.serUserNo(rset.getInt("USER_NO"))  -->
	<result column="USER_ID" property="userId" />
	<!-- == m.serUserId(rset.getInt("USER_ID"))  -->
	
	<result column="USER_PWD" property="userPwd" />
	<result column="USER_NAME" property="userName" />
	<result column="EMAIL" property="email" />
	<result column="BIRTHDAY" property="birthday" />
	<result column="GENDER" property="gender" />
	<result column="PHONE" property="phone" />
	<result column="ADDRESS" property="address" />
	<result column="ENROLL_DATE" property="enrollDate" />
	<result column="MODIFY_DATE" property="modifyDate" />
	<result column="STATUS" property="status" />	
</resultMap>
<!-- 
	* SELECT문일 경우
	<select id="각 sql문들의 식별자" parameterType="전달받은 데이터의 타입 혹은 별칭(생략가능)" 
		resultType="조회결과를 반환하고자 하는 자바타입"
		resultMap="조회결과를 뽑아서 맵핑할 resultMap의 id값">
	
	=> parameterType 속성은 생략가능하다.
	=> select문은 반드시 resultType이나 resultMap으로 결과값에 대한 타입을 지정해야 한다.	
	</select>
		
	* DML문의 경우 처리된 행의 갯수가 반환되기 때문에 생략가능하다.
	* ? 대신에 해당 SQL문에 전달된 객체로부터 값을 꺼낼때 자료형의 종류에 따라 
    		#{필드명}, #{변수명}, #{키값}을 사용한다.
 -->	
	<select id="loginMember" parameterType="member" resultMap="memberResultSet">
		SELECT * 
		  FROM MEMBER
		 WHERE USER_ID = #{userId}
		   AND USER_PWD = #{userPwd}
		   AND STATUS = 'Y'  
	</select>
</mapper>