MyBatis

SOLEE_DEV·2023년 4월 16일
0

Spring

목록 보기
8/8
post-custom-banner

1. MyBatis

  • SQL Mapping Framework로, 자바코드와 SQL(XML로 작성)와의 매핑을 도움
  • 자바 코드로부터 SQL문을 분리해서 관리
  • 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거! (setString, getString 등등)
  • 작성할 코드가 줄어서 생산성 향상 & 유지 보수 편리!
    - try-catch문 쓸 필요 없어짐
  • JPA (OOP, SQL&모델링)
<mapper namespace="com.fastcampus.ch4.dao.UserMapper">
	<insert id="insert" parameterType="com.fastcampus.ch4.domain.UserDto">
      INSERT INTO user_info
      VALUES ( #{id}, #{pwd}, ... );
	</insert>
</mapper>
private SqlSession session;
private static String namespace = "com.fastcampus.ch4.dao.UserMapper.";

@Override
public int insert(User user) {
	return session.insert(namespace+"insert", user); 
}

2. SqlSessionFactoryBean과 SqlSessionTemplate

(인터페이스)

  • SqlSessionFactory : SqlSession을 생성(openSession())해서 제공
  • SqlSession : SQL명령을 수행하는데 필요한 메서드 제공
  • my-batis에서 제공 둘 다 interface!

(구현체) - mybatis-spring

  • SqlSessionFactoryBean : SqlSession를 Spring에서 사용하기 위한 빈
  • SqlSessionTemplate : SQL명령을 수행하는데 필요한 메서드 제공 thread-safe

thread-safe란?
1. BoardDao, UserDao 등 여러개 DAO가 동시에 SqlSessionTemplate를 공유 가능하다!
2. 멀티쓰레드에 안전하다

(in root-context.xml)

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation"  value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
	</bean>

	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"/>
	</bean>

3. SqlSession 주요 메서드

  1. int insert(SQL문 이름, parameter Object 객체)
  2. int delete
  3. int update
  4. selectOne : 하나의 행을 반환하는 select에 사용 parameter로 SQL에 바인딩될 값 제공
  5. selectList : 여러 행을 반환하는 select에 사용 parameter로 SQL에 바인딩될 값 제공
  6. selectMap : 여러 행을 반환하는 select에 사용 keyCol에 Map의 key로 사용할 컬럼 지정

4. Mapper XML의 작성

  • namespace : SQL문의 각 ID를 구분하기 위함
<insert id="insert" parameterType="com.fastcampus.ch3.domain.BoardDto">
  INSERT INTO board
  	(title, content, writer)
  VALUES
  	(#{title}, #{content}, #{writer})
  <!-- BoardDto 객체 값들이 #{}에 매핑됨! getter()이용 -->
</insert>  

<select id="select" parameterType="int" 
        			resultType="com.fastcampus.ch3.domain.BoardDto">
  <!-- int : Java.Lang.Integer -->
  SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
  FROM board
  WHERE bno = #{bno}
  <!-- #{} : parameterType 객체가 매핑됨 -->
</insert>  

5. <typeAliases>로 이름 짧게 하기

  • AS-IS : parameterType="com.fastcampus.ch3.domain.BoardDto"
  • TO-BE
<typeAliases>
  <typeAlias alias="BoardDto" type="com.fastcampus.ch4.domain.BoardDto"/>
</typeAliases>

<select id="select" parameterType="int" resultType="BoardDto">
  SELECT bno, title, content, writer, view_cnt, comment_cnt, reg_date
  FROM board
  WHERE bno = #{bno}
</insert>  
  • 별명은 대소문자 구분 안함




1. BoardDao의 작성

  1. DB테이블 생성
  2. Mapper XML & DTO 작성
  3. DAO 인터페이스 작성
  4. DAO 인터페이스 구현 & 테스트 (3.로 하고 Extract Interface하면 O)
    참고) https://stella-ul.tistory.com/entry/Repository-DAO-DTO-VO-%EB%AD%90%EA%B0%80-%EB%8B%A4%EB%A5%B8%EA%B1%B8%EA%B9%8C?category=1029209

2. DTO란? - Data Trasnfer Object

  • 계층간의 데이터를 주고 받기 위해 사용되는 객체
  • 테이블에 저장된 내용과 Mapping을 위해 정의
  • 변환&검증 : 요청 값이 int일 때 null이면 변환에러가 나옴 (Integer로 기입해야 됨)

내부 3계층 (@Controller → @Service → @Repository)

  • 모든 계층 간의 데이터 전달은 DTO가 담당!
  1. @Controller
  • 요청과 응답을 처리
  • 데이터 유효성 검증
  • 실행 흐름을 제어 (redirect & forward)
  1. @Service (try-catch)
  • 비즈니스 로직 담당
  • 트랜잭션 처리
  1. @Repository (보고)
  • 순수 Data Access 기능 (DAO)

  • 조회, 등록, 수정, 삭제

  • 예외처리 (예외 되던지기)
    1) Service 계층
    2) Controller (무조건 컨트롤러로 넘기면 됨)
    3) 둘 다

3. #{}와 ${}의 차이

  • #{} : pstmt를 씀 (값에만 쓸 수 있고, SQL Injection을 막아줌!)
  • ${} : stmt를 씀 (유연, 제약이 적음)

4. XML의 특수 문자 처리

  • XML내의 특수문자(<, >, &, ...)는 < >로 변환 필요
  • 또는 특수문자가 포함된 쿼리를 로 감싼다
    ※ XML 태그가 없다는 뜻! (Character 데이터)
<![CDATA[
  UPDATE board
  SET title = #{title}
  where bno = #{bno} and bno <> 0
]]>
profile
Front-End Developer
post-custom-banner

0개의 댓글