[JSP]MyBatis, Log4j2 세팅하기

이대엽·2022년 10월 6일

세팅환경

개발도구 : IntelliJ IDEA 2022.2.2 (Ultimate Edition)
서버 : 톰캣 9.0.46
JDK : corretto 11.0.16
DB : MariaDB

그래들 / 메이븐 추가

https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core

https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6

https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.24

MariaDB, log4j2 , mybatis, lombok 추가

maven은 pom.xml에 dependency 추가
gradle은 build.gradle dependencies에 implementation 추가

implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.7'


compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

testCompileOnly 'org.projectlombok:lombok:1.18.24'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'

implementation 'org.apache.logging.log4j:log4j-core:2.17.1'
implementation 'org.apache.logging.log4j:log4j-api:2.17.1'
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1'

implementation 'org.mybatis:mybatis:3.5.6'

그리고 프로젝트 갱신

MyBatis 세팅 (어려움)

1. mybatis-config.xml 만들기

MariaDB db와 user는 미리 만들어두어야 한다.

CREATE DATABASE ldydb;
CREATE USER 'ldyuser'@'%' IDENTIFIED BY 'ldyuser';
ldydbldydbGRANT ALL PRIVILEGES ON ldydb.* TO 'ldyuser'@'%';

더미 테이블 작성

CREATE TABLE ldy_table (
no INT AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(100),
lastname VARCHAR(100)
)

https://mybatis.org/mybatis-3/ko/getting-started.html

문서를 참고하여 프로젝트의 resources 폴더에 new File - mybatis-config.xml 을 만들어준다.

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.mariadb.jdbc.Driver"/>
                <property name="url" value="jdbc:mariadb://localhost:3306/ldydb"/>
                <property name="username" value="ldyuser"/>
                <property name="password" value="ldyuser"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
    </mappers>
</configuration>

"https://mybatis.org/dtd/mybatis-3-config.dtd"
이 줄에서 오류가 났었는데 밥먹고 오니까 사라졌다 (?)

2. MyBatisUtil.java 만들기

프로젝트 기본 패키지 하위에 utils 패키지를 만들고 MyBatisUtil 클래스를 enum으로 만든다.(싱글턴)

문서를 참고하여 SqlSessionFactory 를 빌드한다.

@Getter
public enum MyBatisUtil {
    INSTANCE;

    private SqlSessionFactory sqlSessionFactory;

    MyBatisUtil() {
    // 자원을 읽어온다
        try{
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
} 

3. resources 경로에 프로젝트 패키지 기본경로로 폴더 생성하기, TimeMapper.xml 추가하기

패키지 경로 참고하여

점 을 ' / ' 슬래시 로 바꿔서 폴더 생성

new File - TimeMapper.xml 추가. ( xml파일은 소문자로만 작성하여야 하는줄 알았는데 mybatis는 예외인가 ? )

사족으로 DB연결 작업을 하고 난 뒤에는 항상 time을 출력 해 보는 습관을 들이자. (서울 시간 아닐수도)

문서를 참고하여 TimeMapper.xml 작성

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mymybatis.TimeMapper">
    <select id="getTime" resultType="string">
        select now()
    </select>
</mapper>

mybatis-config.xml에 < Mapper > 추가

 <mapper resource="com/example/mymybatis/TimeMapper.xml"></mapper>

개발환경 왼쪽에있는 사이드바 에서 파일 우클릭 - copy/path 이용하면 편리하다.

4. Log4j2.xml , MyBatisTests.java 생성

resources 폴더에 new File - log4j2.xml 생성

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

<configuration status="debug">

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd hh:mm:ss} %5p [%c] %m%n"/>
        </Console>
    </Appenders>

    <loggers>
        <root level="debug" additivity="true">
            <AppenderRef ref="console"/>
        </root>
    </loggers>

</configuration>

test 소스폴더에 MyBatisTests 클래스 생성

@Lof4j2 도 클래스이름 위에 붙여 주시고

@Test
    public void test1(){
        log.info("test1..........");

        @Cleanup SqlSession session  = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();

        log.info(session);

        String timeStr = session.selectOne("com.example.mymybatis.TimeMapper.getTime");

        log.info(timeStr);
        session.close();
    }

경로가 항상 중요하다... (진 짜 중요) MyBatis 오류의 절반은 경로 문제.

TimeMapper.xml 파일이 있는 경로 + TimeMapper.xml에 정의해놓은 쿼리문 id 작성

테스트 실행 후 쿼리문 로그 찍히는지 확인

execute query : select now() 반드시 확인.

혹시 안나온다면 log4j2.xml 설정 파일에서 loogers root level이 info로 되어있다면 debug로 내려볼것.

5. 더미 테이블로 직접 테스트

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mymybatis.ldyMapper">
    <select id="selectLdy" resultType="com.example.mymybatis.dto.LdyDTO">
        select * from ldy_table
    </select>
    <select id="selectOneLdy" resultType="com.example.mymybatis.dto.LdyDTO">
        select * from ldy_table where no = #{no}
    </select>
    <select id="oddSelectOneLdy" resultType="com.example.mymybatis.dto.LdyDTO">
        select * from ldy_table where no = #{oddParam}
    </select>
</mapper>

namespace 값을 디렉토리경로.xml파일이름 으로 변경.
id 값을 쿼리의 동작을 표현할 수 있게 작명.
resultType 값은 쿼리문의 반환 DTO타입으로 작성 + DTO클래스가 있는 패키지 경로명 까지 추가

LdyDTO.java

package com.example.mymybatis.dto;

import lombok.*;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LdyDTO {
    private Integer no;
    private String firstName;
    private String lastName;
    
    // 변수 없음.  getter
    public int getOddParam(){
        return this.no;
    }
}

table 생성 , 데이터 추가

CREATE TABLE ldy_table (
	no INT AUTO_INCREMENT PRIMARY KEY,
	firstname VARCHAR(100),
	lastname VARCHAR(100)	
)

DROP TABLE ldy_table;

SELECT * FROM ldy_table;

INSERT INTO ldy_table (firstname, lastname) VALUES ('DaeYeob' , 'Lee');

UPDATE ldy_table SET firstname = CONCAT(firstname, " " , NO) WHERE NO > 0;
UPDATE ldy_table SET lastname = CONCAT(lastname, " " , NO) WHERE NO > 0;

Test 코드

    @Test
    public void selectOneTest(){
        @Cleanup SqlSession session  = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();

        log.info(session);
        LdyDTO dto = LdyDTO.builder()
                .no(3)
                .build();

        LdyDTO ldyDTO = session.selectOne("com.example.mymybatis.ldyMapper.selectOneLdy", dto);

        log.info(ldyDTO);
        session.close();
    } 

결과

형식 : session.selectOne(경로, 데이터)

MyBatis의 실행 원리....................
데이터(DTO) 안에 있는 getter 함수를 호출해서 sql문 #{param} 값을 채운다.

getter 함수 호출 검증 테스트

    @Test
    public void oddSelectOneTest(){
        @Cleanup SqlSession session  = MyBatisUtil.INSTANCE.getSqlSessionFactory().openSession();

        log.info(session);
        LdyDTO dto = LdyDTO.builder()
                .no(5)
                .build();

        /*
        * MyBatis 의 Mapper 쿼리문 실행 원리가 DTO 클래스에 있는 getOddParam() 함수를 실행하는 시스템이다.
        *
        * public int getOddParam(){
            return this.no;
          }
        * */

        LdyDTO ldyDTO = session.selectOne("com.example.mymybatis.ldyMapper.oddSelectOneLdy", dto);

        log.info(ldyDTO);
        session.close();
    }

결과

profile
은갈치쉐이크

0개의 댓글