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
반응형