Another Brain

41일차(7월 15일)_ Mybatis 본문

P/Web

41일차(7월 15일)_ Mybatis

뉸누나ㄴ나 2021. 7. 15. 16:55

프로퍼디 . 빌더. 이름.이름.빌드 

## 2일차 진행 상황

-- View <==> Controller <==> Service
-- View
>> JSP 동적 페이지 사용하기 : 
=> src/main/webapp/WEB-INF/jsp>
=> application.properties view resolver 환경설정
=> pom.xml 의존관계 추가

>> static 문서 사용하기 : html, css, js, img
=> src/main/resource/static>
=> 서브폴더 관리

>> 응답설정 정보 사용하기
=> JSP EL, JSTL 

-- Controller
>> 요청매핑 :
=> @RequestMapping(value = "/member/size", method = RequestMethod.POST)
=> @PostMapping("/member/size")
=> @GetMapping("/member/size")

>> 응답
=> 데이터 응답 : String, JSON {key:value, key:value}
@RequestMapping("/url-pattern")
@ResponseBody

=> 페이지 이동 응답
@RequestMapping("/url-pattern")

>> 요청데이터 parameter 가져오기

>> 응답을 위한 설정
=> Model#addAttribute(key, value);
=> ModelAndView#addObject(key, value), ModelAndView#setViewName("응답페이지이름")


## 요청데이터 parameter 가져오기
1. 기존방법 : 
-- HttpServletRequest#getParameter()
-- HttpServletRequest#getParameterValues()

2. args DI : domain data
-- public void doXxx(String memberId, String memberPw){}

3. args DI : domain Object
-- public void doXxx(Member dto){}

4. @RequestParam
-- attributes
>> value = "parameter-name"
>> required = true | [false]
>> defaultValue = "value"

 

======================================

 

1. DB연결 : MyBatis Framework 사용하기
-- JDBC API : java.sql.*
-- DataSource : javax.sql.*
>> context.xml : DB resource 환경설정

-- DB resource
>> driver="oracle.jdbc.driver.OracleDriver" 
>> url="jdbc:oracle:thin:@localhost:1521:XE"
>> username="scott"
>> password="tiger"

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

<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource auth="Container" 
driverClassName="oracle.jdbc.driver.OracleDriver" 
maxActive="20" 
maxIdle="2" 
maxWait="-1" 
name="jdbc/Oracle11g" 
username="scott"
password="tiger" 
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@localhost:1521:XE"  />
</Context>

==== JDBC 프로그래밍 절차(순서) ====
1. jdbc driver 로딩 => FactoryDao DataSource Connection Pool 위임
2. db 연결 : Connection => FactoryDao DataSource Connection Pool 위임

3. sql 통로 개설 : 
>> Statement(빈통로, 동적sql, sql injection 보안 이슈발생, sql 문자열변환 불편, ...) 
>> PreparedStatement(전용통로, 정적sql, ) 
>> CallableStatement(db server 저장된 stored procedure, stored function call 사용)

4. sql 수행요청
>> executeUpdate():int => CUD(insert, update, delete)
>> executeQuery():ResultSet => R(select)
>> execute():boolean => DDL

5. 요청처리
>> 단일컬럼, 다중컬럼, Collection

6. 자원해제 => FactoryDao DataSource Connection Pool 위임
===========================


## MyBatis Framdwork
-- SQL Mapping Framdwork
-- https://mybatis.org/mybatis-3/ko/index.html


## Spring Boot에서 MyBatis, Oracle 사용하기 
1. 의존관계 추가
=> 신규 프로젝트 : 선택
=> 기존 프로젝트 
>> 추가 선택
>> Spring >> Add Starts >> pom.xml 체킹

2. db resource 환경설정
-- application.properties

# oracle resource
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=scott
spring.datasource.password=tiger

# mybatis : 도메인 멤버변수(memberId)명과 컬럼명(member_id) 규칙준수 전제조건 매핑
mybatis.configuration.map-underscore-to-camel-case=true


3. dbms 구축 : 회원 테이블
-- member 테이블

4. domain 클래스 : 회원 클래스
-- Member.java
-- 테이블 구조에 맞게 되어 있는지 체킹
-- 도메인 멤버변수(memberId)명과 컬럼명(member_id) 규칙준수


## MVC 의존관계
-- View <==> Controller <==> Service <==> DAO(인터페이스) / mapper.xml

-- @Controller
>> @Autowired private MemberService memberService

-- @Service

-- DAO 인터페이스
@Mapper
public interface MemberDao {
public String login(String memberId, String memberPw);
...
}

-- sql mapper.xml
>> 위치 : 
=> MemberDao.java 인터페이스와 같은 폴더에 MemberDao.xml

=> src/main/resources> 폴더 밑에 mappers 서브폴더 위치
=> application.properties 에 환경설정

## MemberDao.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="com.work.dao.MemberDao">
  
  <!-- public String login(String memberId, String memberPw) -->
  <select id="login" resultType="String" parameterType="map">
    select grade from member where member_id=#{memberId} and member_pw=#{memberPw}
  </select>
  
  <!-- public int insertMember(Member dto)
   #{mileage, jdbcType=NUMERIC}, #{manager, jdbcType=VARCHAR} null colum config 
   -->
  <insert id="insertMember" parameterType="com.work.dto.Member">
   insert into member
values(#{memberId}, #{memberPw}, #{name}, #{mobile}, #{email}, #{entryDate}, #{grade}, #{mileage}, #{manager})
  </insert>
</mapper>

@bulider
## MemberDao.java
package com.work.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.work.dto.Member;

@Mapper
public interface MemberDao {
/** 로그인 */
public String login(String memberId, String memberPw);

/** 전체회원 조회 */
public List<Member> selectMemberList();

/** 회원상세조회 */
public Member selectMember(String memberId);

/** 회원가입 */
public int insertMember(Member dto);
}


## 기능구현 순서
1. view : ______.jsp
2. controller 함수 생성 
3. service
** 4. dao @mapper interface
** 5. mapper.xml - dao와 같은 패키지 
6. controller : 
>> 응답설정
>> 응답페이지 이동
7. view : 응답페이지 응답결과처리


## mybatis null 허용 컬럼이어도 parameter가 없는경우(null) 오류 발생
-- 해결방법: 
1. sql 컬럼=null
=> 가능은 하지만 해결책은 안됨

2. #{property-name, jdbcType=타입}
=> null을 허용하는 컬럼단위로 표기해야함(불편??)
=> #{mileage, jdbcType=NUMERIC}, #{manager, jdbcType=VARCHAR}

3. application.properties
# mybatis : null parameter 에 대한 jdbcType 설정
mybatis.configuration.jdbc-type-for-null=VARCHAR

Comments