ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] 1-3. Oracle + MyBatis 연동 테스트
    프로젝트/도서 관리 시스템 2023. 6. 19. 09:11

     

     

     

     

    프로젝트 생성 후 Oracle 설정 세팅까지 마쳤다. 이번 포스팅에선 Oracle과 MyBatis를 사용할 수 있는 환경을 만들고 DB 테스트까지 해보려고 한다. 

     

    파일 구조는 다음과 같이 member 패키지에 controller, domain, service, mapper를 생성한다. 

     

     

     

    📑 MyBatis 설정

     

    <application.properties> 설정

    #mybatis
    mybatis.mapper-locations=classpath*:mapper/*.xml
    mybatis.type-aliases-package=com.wish.library.member.domain
    mybatis.config-location=classpath:config/mybatis-config.xml

     

    📑 mybatis.mapper-locations : resourecs/파일 아래 mapper.xml 파일이 어디있나 경로 설정
    📑 mybatis.type-aliases-package : mapper.xml파일 내에서 domain의 경로를 다음과 같이 지정 예를 들어 com.siwh.libarary.member.domain.MemberVO가 있을때 경로를 다 적지 않고 MemberVO로 사용 가능.
    📑 mybatis.config-location : mybatis-config파일의 경로 (다른 설정들을 여기서 함)

     

     

    <mybatis-config.xml 설정>

     

    mybatis에서 값을 삽입할 때 null의 값이 들어가면 에러가 발생한다. 예를 들어 MemberVO라는 도메인에  email, password, cellNo, name, nickname ...이런식의 필드 값이 있는데 email과 password만 넣어주게 되면 나머지 값들엔 null이 들어가 에러가 발생한다.

     

    이런 에러를 방지하기 위해, 즉) null이 들어가는 것을 허용하기 위해 다음과 같은 설정을 해준다. 

     

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <!-- query 결과 컬럼의 값이 null일 경우 result에 null로 setting할지 여무 -->
            <setting name="callSettersOnNulls" value="true" />
            <!-- null parameter 허용 -->
            <setting name="jdbcTypeForNull" value="NULL" />
        </settings>
        <!-- vo type aliases -->
    </configuration>

     

     

     

    📑 테이블 및 도메인 생성

     

    회원 기능을 만들기 위해 Member라는 테이블을 생성했다. email과 password는 N0TNULL로 지정하고 나머지는 NULL을 허용했으며 email을 PK로 지정하였다.

     

    CREATE TABLE MEMBER(
        email  VARCHAR(50) primary key,
        password VARCHAR(20) not null,
        role VARCHAR(1) default 'M',
        name VARCHAR(20),
        nickname VARCHAR(45),
        mfCode VARCHAR(1),
        cellNo VARCHAR(20),
        joinDate DATE DEFAULT SYSDATE,
        updateDate DATE   
    );

     

    더보기

    참고로, 처음에 nickname과 email값을 VARCHAR(20)? 정도로 작게 설정했다. 

    SQL Developer에서 아래와 같은 쿼리문을 조회했을 때  AL32UTF8 이 경우 한글자를 3BYTE로 인식함으로 20은 너무 작아서 alter table member modify nickname VARCHAR(45);로 글자수를 수정하였다. 


    select * from NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';

     


     

     

    <MemberVO> 

    package com.wish.library.member.domain;
    
    //VO는 주로 Read Only 목적이 강하다. 데이터 자체도 불변하게 설계하는 것이 정석.
    //테이블과 관련된 데이터를 VO로 사용.
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import java.util.Date;
    
    @Getter
    @Setter
    @ToString
    public class MemberVO {
    
        private String email; // 회원 아이디
        private String password; //비밀번호
        private Auth role; // 회원 권한 (admin, member)
        private String name;
        private String nickname;
        private Sex mfCode; //성별 (men, female)
        private String cellNo;
        private Date joinDate;
        private Date updateDate;
    
    
    
    }

     

    롬북 라이브러리를 사용해서 Getter/Setter로 필드 자동 주입을 지정해주었다. 테이블에서 생성한 컬럼 값들을 SpringBoot에서 사용할 수 있는 MemberVO의 객체로 만들어준다. 회원 권한과 성별은 데이터타입을 테이블 생성 시 VARCHAR2(1)로 설정했기 때문에 enum 클래스 Auth, Sex를 생성해주었다.

     

    <Auth>

    package com.wish.library.member.domain;
    
    public enum Auth {
        A("admin"),M("member");
    
        final private String auth;
    
        public String getAuth(){
            return auth;
        }
    
        Auth(String auth) {
            this.auth = auth;
        }
    
    }

     

    <Sex>

    package com.wish.library.member.domain;
    
    public enum Sex {
        M("men"), F("female");
    
        final private String sex;
        public String getSex(){
            return sex;
        }
    
        Sex(String sex){
            this.sex = sex;
        }
    }

     

     

     

    데이터 계층 (Mapper) 

     

    <MemberMepper.java> 

    package com.wish.library.member.mapper;
    
    
    import com.wish.library.member.domain.MemberVO;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface MemberMapper {
    
        //회원 정보 조회
        public MemberVO read(String email);
    
            
    }

     

     

    <MemberMapper.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.wish.library.member.mapper.MemberMapper">
    
    
        <select id="read" resultType="MemberVO">
            select *
            from member
            where email = #{email}
            or nickname= #{nickname}
    
    
    
    </mapper>

     

     

    📑 MyBatis + Oracle 연결 테스트 

     

    package com.wish.library.member.mapper;
    
    import com.wish.library.member.domain.Auth;
    import com.wish.library.member.domain.MemberVO;
    import com.wish.library.member.domain.Sex;
    import lombok.extern.slf4j.Slf4j;
    import org.assertj.core.api.Assertions;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
    
    // 실 데이터베이스에 연결 시 필요한 어노테이션
    @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
    @MybatisTest
    @Slf4j
    class MemberMapperTest {
    
        @Autowired
        private  MemberMapper mapper;
    
        @Test
        void mapperConnectTest(){
            log.info("mapper={}",mapper.toString());
        }
        @Test
        @DisplayName("mapper 연결 확인")
        void mapperIdTest(){
            //given
            MemberVO member = mapper.read("admin@gmail.com");
            //when,then
            log.info("member={}",member);
            Assertions.assertThat(member.getPassword()).isEqualTo("admin");
        }
    
    
    }

     

     

     

    2023-06-19 09:09:32.024 INFO 20132 --- [ main] c.w.l.member.mapper.MemberMapperTest : member=MemberVO(email=admin@gmail.com, password=admin, role=A, name=워니, nickname=관리자1, mfCode=F, cellNo=01088889999, joinDate=Fri May 26 15:25:13 KST 2023, updateDate=null)
    반응형

    댓글

Designed by Tistory.