-
76일차 - 로그 설정 및 동적 쿼리 예제백엔드(웹 서버, WAS)/Spring Boot 2024. 5. 17. 14:15log4jdbc.log4j2.properties0.00MBlogback-spring.xml0.00MB
log4jdbc.log4j2.properties : log4j 와 db driver 매핑
logback-spring.xml : 로그 설정 파일
log4jdbc.log4j2.properties
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- logback-spring.xml 을 통해 상세한 설정이 가능하다. --> <!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 --> <configuration scan="true" scanPeriod="60 seconds"> <!-- 패턴 등록 --> <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/> <!-- Appenders : CONSOLE --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 출력 패턴 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${LOG_PATTERN}</pattern> </encoder> </appender> <!-- SQL LOG 옵션 설정 (쿼리문과 걸린시간, 결과를 보도록 한다.)--> <!-- 커넥션의 연결과 종료를 로그에 남김 --> <logger name="jdbc.connection" level="OFF"/> <!-- 실행되는 쿼리문을 로그로 남김 --> <logger name="jdbc.sqlonly" level="OFF"/> <!-- 쿼리문의 + 걸린 시간 --> <logger name="jdbc.sqltiming" level="INFO"/> <!-- 쿼리를 수행하기 까지의 상세한 내용 하나하나 다 남긴다(로그가 많이 길어진다) --> <logger name="jdbc.audit" level="OFF"/> <!-- SELECT 수행시 결과인 RESULTSET 를 보여준다 --> <logger name="jdbc.resultset" level="OFF"/> <!-- 결과값을 테이블 형식(표)으로 보여준다 --> <logger name="jdbc.resultsettabl e" level="INFO"/> <!-- Root Logger --> <root> <appender-ref ref="console" /> </root> </configuration>
application.propeties
spring.application.name=06_Board # db connect infomation # <beans:property name="driverClassName" value="org.mariadb.jdbc.Driver"/> spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy # <beans:property name="url" value="jdbc:mariadb://localhost:3306/mydb"/> spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/mydb # <beans:property name="username" value="web_user"/> spring.datasource.username=web_user # <beans:property name="password" value="pass"/> spring.datasource.password=pass # mapper location # <beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> # <beans:property name="dataSource" ref="datasource"/> # <beans:property name="mapperLocations"> # <beans:list> # <beans:value>classpath:kr/co/photo/board/dao/*.xml</beans:value> # <beans:value>classpath:kr/co/photo/member/dao/*.xml</beans:value> # </beans:list> # </beans:property> # </beans:property> # </beans:bean> mybatis.mapper-locations=mapper/*_mapper.xml # PORT server.port=80 # ENCODING:UTF-8 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true # JSP(PREFIX,SUFFIX) spring.mvc.view.prefix=/views/ spring.mvc.view.suffix=.jsp # alias-package mybatis.type-aliases-package=kr.co.kjw.dto # logging logging.level.root=info
라이브러리 설치
<!-- log4jdbc --> <!-- 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>
동적 쿼리 예제
application.properties
spring.application.name=07_DynamicSQL # port server.port=80 # encoding server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true # jsp spring.mvc.view.prefix=/views/ spring.mvc.view.suffix=.jsp # database # <beans:property name="driverClassName" value="org.mariadb.jdbc.Driver"/> spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy # <beans:property name="url" value="jdbc:mariadb://localhost:3306/mydb"/> spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/mydb # <beans:property name="username" value="web_user"/> spring.datasource.username=web_user # <beans:property name="password" value="pass"/> spring.datasource.password=pass # mybatis mybatis.mapper-locations=mapper/*_mapper.xml # mybatis.mapper-locations=mapper/**/*_mapper.xml mybatis.type-aliases-package=kr.co.gudi.dto # mybatis.type-aliases-package=kr.co.gudi.**.dto # logging logging.level.root=info
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.17</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>07_DynamicSQL</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>07_DynamicSQL</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.2</version> </dependency> <!-- mariadb --> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <scope>runtime</scope> </dependency> <!-- jasper --> <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>9.0.85</version> </dependency> <!-- jstl --> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl --> <!-- BOOT 에서는 일부 라이브러리에 대해서 버젼 관리를 지원한다 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!-- log4jdbc --> <!-- 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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter-test</artifactId> <version>3.0.3</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
// @RequestMapping(value="/join.do", method=RequestMethod.POST) @PostMapping(value = "join.do") public ModelAndView joinDo() { // Model : 보낼 데이터를 담는 객체, 인터페이스이므로 무조건 컨트롤러에서 받아서 넘겨줘야한다 // ModelAndView : Model + View, 객체이므로 사용하고 싶은 곳에서 객체화하여 사용가능하다 logger.info("회원가입 요청"); return null; }
동적쿼리에서 IF문 사용방법
<insert id="join" parameterType="member"> INSERT INTO member (id,pw,name,age,gender,email) <choose> <when test="!email.equals('')"> VALUES(#{id},#{pw},#{name},#{age},#{gender},#{email}) </when> <otherwise> VALUES(#{id},#{pw},#{name},#{age},#{gender},'없음') </otherwise> </choose> </insert>
when 은 if문과 같은 역할을하고 otherwise 는 else 과 같다
동적쿼리를 이용한 검색 기능
<!-- [MS-SQL] '%' + #{keyword} + '%' [ORACLE] '%' || #{keyword} || '%' [MYSQL] CONCAT('%', #{keyword}, '%') --> <!-- where 태그는 if에 해당되는 내용이 없을땐 동작하지 않고, 있을 경우 where 문을 넣어준다 --> <select id="list" parameterType="map" resultType="member"> SELECT * FROM member <where> <if test="opt=='id' and !keyword.equals('')"> id LIKE CONCAT('%', #{keyword}, '%') </if> <if test="opt=='name' and !keyword.equals('')"> name LIKE CONCAT('%', #{keyword}, '%') </if> <if test="opt=='email' and !keyword.equals('')"> email LIKE CONCAT('%', #{keyword}, '%') </if> </where> </select>
[MS-SQL] '%' + #{keyword} + '%' : 더하기 기호로 문자열을 합칠 수 있다
[ORACLE] '%' || #{keyword} || '%' : 파이프라인으로 합칠 수 있음
[MYSQL] CONCAT('%', #{keyword}, '%') : CONCAT 으로 문자열을 합쳐주는 함수를 사용where 태그는 if에 해당되는 내용이 없을땐 동작하지 않고, 있을 경우 where 문을 넣어준다
실행 결과이다
https://doublesprogramming.tistory.com/83
Spring - 프로젝트 생성
Spring - 프로젝트 생성 01. 프로젝트 생성 File => New => Spring Legacy Project 선택 Project name 작성 => Spring MVC project 선택 => next 클릭 패키지는 반드시 3-level로 작성해야한다. 3-level 중에서 마지막은 contextPat
doublesprogramming.tistory.com
맛도리 블로그 글 2017년정도 스프링 프로젝트 시작부터 현재 배우는 단계까지 잘 정리되어있음
Springboot Test 코드 작성
Test 코드를 작성하는 법을 알아보기 전에 Test 코드의 필요성에 대해서 알아보겠습니다. 1. 왜 Test 코드를 작성하는가? 크게 2가지 이유가 있습니다.' 1-1. Test 코드를 작성하지 않고 결과를 검증하
dingdingmin-back-end-developer.tistory.com
테스트 방법에 대해서 유용한 글
'백엔드(웹 서버, WAS) > Spring Boot' 카테고리의 다른 글
81일차 - 인터셉터, 파일 업로드, 다운로드, 스케쥴러 (2) 2024.05.24 80일차 - RESTAPI, Properties 활용, Spring FW 특징, AOP 활용(로그인 처리) (0) 2024.05.23 79일차 - RESTful (0) 2024.05.23 77~78일차 - Transaction, RESTFUL 개념과 사용 방식 (0) 2024.05.21 75일차 - 스프링부트 환경 구성 및 간단한 예제 개발 (0) 2024.05.16