BackEnd

6/4 - MariaDB, Log4JDBC

Jiwon_Loopy 2025. 6. 6. 16:06
반응형

목차


maria db 연동


  • db 정보
    • host
    • port
    • db명 (sid, schema)
    • username
    • userapssword
  • 의존성 추가
  • 설정 파일 수정
  • MvcConfig 수정
    // MariaDB
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
//		dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
        dataSource.setDriverClassName("org.mariadb.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUsername("testuser");
        dataSource.setPassword("test1234");
        return dataSource;
    }
  • 학생 목록 출력
    • /student/index.do

메모


  • 컨트롤러
  • 서비스
  • 서비스임플
  • dao
  • vo
  • xml
  • jsp
  • DB 설계
    • 날짜 관련 속성
      • 등록일, 주문일, 가입일 … (일/시) → timestamp
      • 생일, 기간일자 (일자), → char(10) YYYY-MM-dd = 년/월/일/시/분
      • between 사용 시 끝 날짜가 들어가지 않을 수 있음
      • start와 end 에 검색 시 +’00:00:00’을 붙여야 한다.
      • 혹은, 년/월/일만 잘라서 사용
  • RequiredArgsConstructor
    • final로 선언하여 AutoWired 생략가능
package chap06.student;

import lombok.RequiredArgsConstructor;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class StudentDAO {
    private final SqlSessionTemplate sst;

}

분기 쿼리문


  • 검색 시 전체는 WHERE 조건문이 빠져야 하고, 그렇지 않은 경우는 WHERE절이 들어가야 할 때
  • 파라미터 전달은 꼭 밝혀주자 (vo)
<%--
  Created by IntelliJ IDEA.
  User: fzaca
  Date: 25. 6. 4.
  Time: 오전 11:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>

 

<?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">


<!-- 검색 했으면  (s_grade 필드에 값이 0) -->
<!-- SELECT * FROM student ORDER BY studno DESC -->

<!-- 학년을 검색했으면 (s_grade 필드에 값이 > 0) -->
<!-- SELECT * FROM student WHERE grade = ? ORDER BY studno DESC-->
<mapper namespace="student">
    <!-- 받아서 쓸 때 파라미터타입 -->
    <select id="index" parameterType="chap06.student.StudentVO" resultType="chap06.student.StudentVO">
        SELECT * FROM student
        <if test = "s_grade > 0">
        WHERE grade = #{s_grade}
        </if>
        ORDER BY studno DESC
    </select>
</mapper>
package chap06.student;

import lombok.Data;

import java.sql.Timestamp;

@Data
public class StudentVO {
    private int studno;
    private String name;
    private String id;
    private int grade;
    private String jumin;
    private Timestamp birthday;
    private String tel;
    private int height;
    private int weight;
    private int major1;
    private int major2;
    private int profno;

    // 검색 용도
    private int s_grade;
    private String s_type;
    private String s_word;
}

package chap06.student;

import java.util.List;

public interface StudentService {
    List<StudentVO> index(StudentVO vo);
}

package chap06.student;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    StudentDAO studentDAO;

    @Override
    public List<StudentVO> index(StudentVO vo) {
        List<StudentVO> students = studentDAO.index(vo);
        return students;
    }
}

package chap06.student;

import chap04.MemberVO;
import lombok.RequiredArgsConstructor;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class StudentDAO {
    private final SqlSessionTemplate sst;

    public List<StudentVO> index(StudentVO vo) {
        // 매개변수는 네임스페이스.id
        return sst.selectList("student.index", vo);
    }
}

package chap06.student;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;

    // url 매핑 메서드, 파라미터 받아, 서비스호출, 저장소 저장, 리턴, 포워딩
    @GetMapping("/student/index.do")
    public String index(Model model, StudentVO vo){
        List<StudentVO> list = studentService.index(vo);
        model.addAttribute("list", list);
        return "student/index";
    }

}

log4jdbc


  • maven 추가
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>
  • 프로퍼티 추가
log4jdbc.drivers=org.mariadb.jdbc.Driver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
  • xml 수정
    • warn 을 info로 바꾸기 (로그레벨 수정)
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
    	<!-- Appenders -->
    	<appender name="console" class="org.apache.log4j.ConsoleAppender">
    		<param name="Target" value="System.out" />
    		<layout class="org.apache.log4j.PatternLayout">
    			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
    		</layout>
    	</appender>
    	
    	<!-- Application Loggers -->
    	<logger name="kr.co.study">
    		<level value="info" />
    	</logger>
    	
    	<!-- 3rdparty Loggers -->
    	<logger name="org.springframework.core">
    		<level value="info" />
    	</logger>
    	
    	<logger name="org.springframework.beans">
    		<level value="info" />
    	</logger>
    	
    	<logger name="org.springframework.context">
    		<level value="info" />
    	</logger>
    
    	<logger name="org.springframework.web">
    		<level value="info" />
    	</logger>
    
    	<!-- Root Logger -->
    	<root>
    		<priority value="info" />
    		<appender-ref ref="console" />
    	</root>
    	
    </log4j:configuration>
  • Config 수정하여 jdbc가 log4j를 거치도록 만들기
    • 해당 db명 앞에 써준다.
    // MariaDB
    @Bean
    public DataSource dataSource() {
        HikariDataSource dataSource = new HikariDataSource();
//		dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
//        dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
//        dataSource.setDriverClassName("org.mariadb.jdbc.Driver");
        dataSource.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
		dataSource.setJdbcUrl("jdbc:l**og4jdbc**:mariadb://localhost:3306/study"); // <-- 여기
        dataSource.setUsername("testuser");
        dataSource.setPassword("test1234");
        return dataSource;
    }
  • 결과

 

  • 어노테이션 필드 로그 방식
package chap06.student;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Slf4j
@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;

    // url 매핑 메서드, 파라미터 받아, 서비스호출, 저장소 저장, 리턴, 포워딩
    @GetMapping("/student/index.do")
    public String index(Model model, StudentVO vo){
        log.info("vo:"+vo);
        List<StudentVO> list = studentService.index(vo);
        model.addAttribute("list", list);
        return "student/index";
    }

}

Log Level


  • ex. info 레벨이 설정되면 info 이상의 레벨인 info, warn, error에 대한 로그가 기록됨
  • Level이 높을수록 심각한 오류를 의미
    • trace : debug보다 세분화된 정보
    • debug : 디버깅하는데 유용한 세분화된 정보
    • info : 진행상황 같은 일반 정보
    • warn : 오류는 아니지만 잠재적인 오류 원인이 될 수 있는 경고성 정보
    • error : 요청을 처리하는 중 문제가 발생한 오류 정보

경우의 수가 많은 경우


  • 되도록이면 괄호로 묶어주자
  • 1=1이라는 의미없는 항상 옳은 sql을 넣어 AND를 연결시켜주자
<?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">


<!-- 검색 했으면  (s_grade 필드에 값이 0) -->
<!-- SELECT * FROM student ORDER BY studno DESC -->

<!-- 학년을 검색했으면 (s_grade 필드에 값이 > 0) -->
<!-- SELECT * FROM student WHERE grade = ? ORDER BY studno DESC-->
<mapper namespace="student">
    <!-- 받아서 쓸 때 파라미터타입 -->
    <select id="index" parameterType="chap06.student.StudentVO" resultType="chap06.student.StudentVO">
        SELECT *
        FROM student
        WHERE 1=1
        <if test="s_grade > 0">
            AND grade = #{s_grade}
        </if>
        <!-- 경우의 수가 많은 경우 -->
        <!-- 검색어 -->
        <if test="s_word != null and s_word != ''">
            <!-- 전체 -->
            <if test="s_type == ''">
                AND (studno LIKE '%${s_word}%'
                OR name LIKE '%${s_word}%'
                OR id LIKE '%${s_word}%')
            </if>
            <!-- 번호, 이름, 아이디 (빈 문자열 아닌 경우) -->
            <if test="s_type != ''">
                AND ${s_type} LIKE '%${s_word}%'
            </if>
        </if>
        ORDER BY studno DESC
    </select>

</mapper>
  • <where> 태그로 한 번에 해결할 수 있다.
<?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">


<!-- 검색 했으면  (s_grade 필드에 값이 0) -->
<!-- SELECT * FROM student ORDER BY studno DESC -->

<!-- 학년을 검색했으면 (s_grade 필드에 값이 > 0) -->
<!-- SELECT * FROM student WHERE grade = ? ORDER BY studno DESC-->
<mapper namespace="student">
    <!-- 받아서 쓸 때 파라미터타입 -->
    <select id="index" parameterType="chap06.student.StudentVO" resultType="chap06.student.StudentVO">
        SELECT *
        FROM student
        <where>
            <if test="s_grade > 0">
                AND grade = #{s_grade}
            </if>
            <!-- 경우의 수가 많은 경우 -->
            <!-- 검색어 -->
            <if test="s_word != null and s_word != ''">
                <!-- 전체 -->
                <if test="s_type == ''">
                    AND (studno LIKE '%${s_word}%'
                    OR name LIKE '%${s_word}%'
                    OR id LIKE '%${s_word}%')
                </if>
                <!-- 번호, 이름, 아이디 (빈 문자열 아닌 경우) -->
                <if test="s_type != ''">
                    AND ${s_type} LIKE '%${s_word}%'
                </if>
            </if>
        </where>
        ORDER BY studno DESC
    </select>

</mapper>
728x90
반응형