본문 바로가기
공부기록

5월 11일 (1) Spring - JDBC 연동 프로젝트

by project100 2023. 5. 11.
Spring - JDBC 연동 프로젝트
 
최초 프로젝트 생성 시 추가할 dependency
 
1. JDBC API
2. MyBatis Framework
3. MySQL Driver

 

MyBatis Framwork

DB 연동에 필요한 코드와 설정을 자동으로 처리하는 프레임워크

SQL 쿼리문과 해당 DAO 메소드 선언만 작성하면 자동으로 나머지 소스 코드를 생성하여 처리

이 때, DAO 작성은 interface 로 작성(메소드 선언부만 필요 - 리턴타입, 메소드이름, 파라미터)

Mapper라는 xml 파일에 SQL쿼리문을 작성

 

참고) interface란?

객체지향 특성인 추상화(abstraction)를 제공하기 위한 코드 작성 방법

모든 멤버 메소드의 몸통(body) 정의하지 않는 클래스. 메소드의 선언부만 작성

 

public static 이 자동으로 붙음

변수(상수) public static final 이 자동으로 붙음

 

return_type method_name(prameters) <-선언부

{ .....  } <- 몸통

 

어떤 기능을 처리할 것인지, 어떤 값을 받아야 하는지, 어떤 데이터를 넣어야 하는지 생각하기

 

 

참고) MyBatis 활용에 도움이 되는 플러그인 - MyBatisX

참고) JDBC에서 시간이 많이 소요되는 작업은 Connection수립과 Close 작업.

이를 단축하기 위해 미리 여러 개의 Connection을 수립하여 필요 시 사용할 수 있도록 하는 Connection Pool(20개 정도)을 활용

* CP(Connection Pool) : 미리 DB와 접속된 Connection을 저장하고 관리하는 객체. Spring boot에서는 Hikari CP를 기본적으로 사용한다.

 

Web 프로젝트용 다지인 패턴 : MVC 패턴

Model : Date 처리요, Model, ModelAndView, Dto 클래스

View : 브라우저에서 보이는 화면, jsp, thymleaf, react 등 (HTML) / (라즈베리파이센서, LED)

Controller : 서비스 로직 제공 및 제어, Controller, Service, Dao 등

 

Dto 작성요령

DB 테이블의 컬럼명과 동일한 필드(변수)명을 사용할  것

MyBatis에서 자동으로 필드에 컬럼의 값을 넣어주기 때문에 이름이 동일해야 한다.

DB테이블 당 한 Dto 클래스를 작성할 것

 

로그인용 로직

view 1. 사용자로부터 id와 password를 입력 받는다. 

dao 2. id로 DB를 검색하여 password를 얻어온다.

service 3. 사용자가 입력한 password와 DB에서 가져온 password를 비교한다.

service 4. 두 값이 같으면 로그인 성공, 틀리면 로그인 실패

service 5. 검색 결과가 없을 경우는 해당 id로 등록된 정보가 없음을 나타낸다.(회원가입 필요)

 

기능에 대한 실제적인 처리는 service에서 처리하고, contoller는 제어만!

 

dao 2. id로 DB를 검색하여 password를 얻어온다.

   DB에서 먼저 실행해보고 작성!  

   SELECT upass FROM usertb1 WHERE uid='hong';

 

MyBatis mapper 작성법

interface에 작성한 메소드 : 

 String selectData(int num);

 

1) <select> 태그로 작성

 id : Dao의 메소드 이름 -> id="selectData"

2) parameterType : Dao 메소드의 매개변수 타입

 -> parameterType="Integer"

 메소드에 파라미터가 없을 경우

3) resultType : Dao 메소드의 리턴타입

 -> resultType="String"

 메소드에 리턴타입이 void일 경우 생략

 

Mapper에 작성한 SQL 쿼리문(PreparedStatement와 유사)

 입력 받은 데이터가 채워지는 부분을 '?'로 작성

 SELECT mstr FROM table_name WHERE mcode=#{num}

 

4) #{num} : 'num'은 Dao 메소드의 매개변수 이름

 매개변수가 Dto인 경우 Dto 클래스의 멤버변수(필드)의 이름.

 #{변수명} -> 변수의 타입이 String일 경우 자동으로 ' ' 를 붙여줌.

 변수의 타입이 숫자형일 경우 ' ' 를 붙이지 않음.

5) ${value} : value에 해당하는 타입과 상관없이 그대로 사용,

 검색할 컬러명 등이 달라지는 가변형태의 SQL쿼리문 작성에 사용

 예) SELECT * FROM  table_name WHERE ${colum_name} like '%a%'

 


단위테스트(JUnit)

전체 프로그램을 테스트하지 않고, 프로그램 개발 과정별, 단계별, 클래스별, 기능별 테스트를 진행

 

Junit 라이브러리 필요

	<dependency>
	    <groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<scope>test</scope>
	</dependency>

 

package com.raspberry.springjdbc01.dao;

import lombok.extern.java.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
@Log
public class DatasourceTest {
    @Autowired
    //인스턴스를 만들지 않고 처리될 수 있도록 함.
    //아래의 문장을 검사 datasource
    //spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    //spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jdbc_db?severTimezone=Asia/Seoul
    //spring.datasource.username=dbuser
    //spring.datasource.password=12341234
    DataSource ds;

    @Test
    public void testConnection(){
        //test용으로 사용 if문 같은 try catch문
        try(Connection conn = ds.getConnection()){
            log.info("접속성공");
        } catch (SQLException e) {
            log.info("접속실패");
            e.printStackTrace();
        }
    }
}

ID로 password 불러오기 단위테스트

package com.raspberry.springjdbc01.dao;

import lombok.extern.java.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@Log
public class DaoTest {
    @Autowired
    MemberDao mDao;

    @Test
    public void getPassTest(){
        try{
           // 실제로 있는 데이터 넣기
           String pass = mDao.selectPass("apple");
           log.info(pass);
        } catch (Exception e){
            e.printStackTrace();
            log.info("처리실패");
        }
    }
}