2022_02_12 - oneso123456789/2022 GitHub Wiki

other

로컬 깃리포지토리 업데이트는 remote -> fetch로 Add Create/update specification
항목에 깃허브에서 가져오고 싶은 브랜치를 Source ref로 참조해서 가져오면됨.

영속/비즈니스 계층의 CRUD 구현

PART 3의 예제는 단순한 하나의 테이블만을 이용하기 때문에 데이터베이스에
테이블, 스퀀스, 약간의 데이터들이 생성되었다면 이제는 코드를 이용해서
데이터에 대한 CRUD(Create, Read, Update, Delete)작업을 진행함

영속 계층의 작업은 항상 다음과 같은 순서로 진행함

  • 테이블의 칼럼 구조를 반영하는 VO(Value Object) 클래스의 작성
  • MyBatis의 Mapper 인터페이스의 작성/XML 처리
  • 작성한 Mapper 인터페이스의 테스트

위의 과정 전에 먼저 JDBC 연결을 테스트 하는 과정을 거치는 것이 좋지만,
SQL Developer의 연결 자체가 이미 JDBC 연결을 이용하기 때문에 별로도 언급하지 않음.

영속 계층의 구현 준비

거의 모든 웹 어플리케이션의 최종 목적은 데이터베이스에 데이터를 기록하거나,
원하는 데이터를 가져오는 것이 목적이기 때문에 개발할 때 어느 정도의 설계가
진행되면 데이터 베이스 관련 작업을 하게 됨

VO 클래스 작성

VO 클래스를 생성하는 작업은 테이블 설계를 기준으로 작성하면됨
현재 oracle 상의 tbl_board 테이블의 구성과 같게 작성함

경로는 com.crow.domain패키지 안에 BoardVO 클래스로 정의함
다른 특별한건 없지만 @Data 어노테이션을 선언해줘서 Lombok을 이용해서
생성자와 getter/setter, toString() 등을 만들어 내는 방식을 사용함

Mapper 인터페이스와 Mapper XML

파트1에서 봤지만 MyBatis는 SQL을 처리하는데 어노테이션이나 XML을 이용할 수 있음
간단한 SQL 이라면 어노테이션을 이용해서 처리하는 것이 무난하지만,
SQL이 점점 복잡해지고 검색과 같이 상황에 따라 다른 SQL문이 처리되는 경우에는
어노테이션은 그다지 유용하지 못하다는 단점이 있음

XML의 경우 단순 텍스트를 수정하는 과정만으로 처리가 끝나지만,

어노테이션의 경우 코드를 수정하고 다시 빌드 하는 등의 유지 보수성이
떨어지는 이유로 기피하는 경우도 종종 있음.

Mapper 인터페이스

root-context.xml은 PART 1에서 'com.crow.mapper`패키지를 스캔(조사)하도록
이미 설정해 본 적이 있으므로 이를 활용해서 프로젝트를 제작함

<mybatis-spring:scan base-package="com.crow.mapper" />

Mapper 인터페이스를 작성할 때는 리스트 (select)와 insert(등록) 작업을 우선해서 작성함.
com.crow.mapper패키지를 작성하고 BoardMapper 인터페이스를 추가함

BoardMapper.interface 작성

@Select("select * from tbl_board where bno > 0)"
public List<BoardVO>  getList();

BoardMapper 인터페이스를 작성할 때는 이미 작성된 BoardVO 클래스를 적극적으로
활용해서 필요한 SQL을 어노테이션의 속성값으로 처리할 수 있습니다
SQL문을 작성할때는 반드시 ;(세미콜론)이 없도록 작성해야함

SQL 뒤에 'where bno > 0'과 같은 조건은 테이블을 검색하는데 bno라는
칼럼 조건을 주어서 Primary key(이하 PK)를 이용하도록 유도하는 조건임
이에 대한 자세한 설명은 페이징에서 처리하겠음

SQL Developer에서 먼저 실행결과를 확인볼것
그 이유는

  1. SQL이 문제가 없이 실행 가능한지를 확인하기 위한 용도
  2. 데이터베이스의 commit을 하지 않았다면 나중에 테스트 결과가 달라지기 때문에 이를 먼저 비교하기 위함

작성된 BoardMapper 인터페이스를 테스트 할 수 있게 테스트 환경인
'src/test/java'에 com.crow.mapper패키지를 작성하고 BoardMapperTests 클래스를 추가함

BoardMapperTests 클래스

계속하던거처럼 테스트 어노테이션 명시해주고 BoardMapper인터페이스의 구현체를 주입 받아서 동작함
클래스 선언부에는 PersistenceConfig 클래스를 이용해서 스프링 설정을 이용하고
있음을 명시함
testGetList()의 결과는 SQL Developer에서 실행된 것과 동일해야만 정상적으로 동작한 것임

Mapper XML파일

BoardMapperTests를 이용해서 테스트가 완료되면
src/main/resource 내에 패키지와 동일한 com.crow.mapper단계의 폴더를
생성하고 XML파일을 작성함
이때 폴더를 한번에 생성하는게 아닌 하나씩생성해야함

파일의 폴더 구조나 이름은 무방하지만 패키지와 클래스 이름과 동일하게
해주면 나중에 혼란스러운 상황을 피할수 있음

BoardMapper.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.crow.mapper.BoardMapper">


<select id="getList" resultType="com.crow.domain.BoardVO">
<![CDATA[
select * from tbl_board where bno > 0
]]>
</select>
</mapper>

XML을 작성할 때는 반드시 의 namespace 속성값을 Mapper 인터페이스와
동일한 이름을 주는 것에 주의하고,

태그의 id 속성값은 메서드의 이름과 일치하게 작성함

resultType 속성의 값은 select 쿼리의 결과를 특정 클래스의 객체로
만들기 위해서 설정함

XML에 사용한 CDATA 부분은 XML에서 부등호를 사용하기 위해서 사용함

XML에 SQL문이 처리되었으니 BoardMapper 인터페이스에 SQL은 제거함
(어노테이션으로 작성한부분)

⚠️ **GitHub.com Fallback** ⚠️