1-1. resources 폴더 내부에 log4j2.xml 파일을 드래그 앤 드롭
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- Appender, Layout 설정 -->
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout/>
</Console>
</Appenders>
<!-- Logger 설정 -->
<Loggers>
<Logger name="com.zaxxer" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="org.zerock" level="TRACE" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>

1-2. pom.xml 에 추가하기
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.23.1</version>
</dependency>
1-3. LOG4J2 내용 수정 및 추가
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- Appender, Layout 설정 -->
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</Console>
</Appenders>
<!-- Logger 설정 -->
<Loggers>
<Logger name="com.zaxxer" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="org.springframework" level="DEBUG" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="org.zerock" level="INFO" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>

2-1. pom.xml 추가
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.1.11</version>
</dependency>
2-2. test폴더 확인 및 log4j2 복사
test파일이 해당경로에 있는지 확인하고, 없으면 생성해준다. java 및 resources 폴더도 생성이 필요하다.
src/test/resources 아래에 log4j2.xml파일을 생성해두면 테스트할때는 info level로 하는것처럼 따로 설정할수있다.

2-3. test 패키지 생성하고 패키지 잘 돌아가는지 확인하기위해 LoadTests 파일 생성하여 코드 붙혀넣기, pom.xml 추가
📌 테스트를 실행하기 위해서는 public void test1() 의 test1을 더블클릭후에 오른쪽클릭해서
run -> j.unit test
package org.zerock.w1;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.zerock.w1.service.HelloService;
import lombok.extern.log4j.Log4j2;
@ExtendWith(SpringExtension.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j2
public class LoadTests {
@Autowired // helloService를 주입시키는 역할
private HelloService helloService;
@Test
public void test1() {
log.info("-----------------");
log.info(helloService);
}
}
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.3</version>
<scope>test</scope>
</dependency>

3-1. maven 추가
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
3-2. root-context 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->
<bean name="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/bootdb2"/>
<property name="username" value="bootdb2user"/>
<property name="password" value="bootdb2user"/>
<property name="connectionTimeout" value="30000"/>
<property name="minimumIdle" value="2"/>
</bean>
<bean name="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<context:component-scan base-package="org.zerock.w1.service;"></context:component-scan>
</beans>

3-3. db연결확인위해 connetTests 클래스 생성 / contextconfiguration 내용은 loadtest의 내용을 복붙

package org.zerock.w1;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import lombok.Cleanup;
import lombok.extern.log4j.Log4j2;
@ExtendWith(SpringExtension.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j2
public class ConnectTests {
@Autowired
private DataSource ds;
@Test
public void testConnect() throws SQLException {
@Cleanup Connection con = ds.getConnection();
log.info(con);
}
}

4-1. pom.xml
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>6.1.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>6.1.11</version>
</dependency>
4-2. mappers 패키지 생성 , TImeMapper 인터페이스 생성


4-3. root-context 전체내용수정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- bean definitions here -->
<bean name="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3306/bootdb2"/>
<property name="username" value="bootdb2user"/>
<property name="password" value="bootdb2user"/>
<property name="connectionTimeout" value="30000"/>
<property name="minimumIdle" value="2"/>
</bean>
<bean name="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<mybatis-spring:scan base-package="org.zerock.ex00.mappers"/>
<context:component-scan base-package=" org.zerock.w1.mappers;"></context:component-scan>
</beans>
4-4. TimeTests class 생성

5-1. Hello controller 내용 수정
package org.zerock.w1.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.zerock.w1.service.HelloService;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Controller
@RequiredArgsConstructor
@Log4j2
public class HelloController {
private final HelloService helloService;
@GetMapping("/hello")
public void hello(Model model) {
log.info("hello............zz" + helloService);
String timeStr = helloService.getTime();
model.addAttribute("timeStr", timeStr);
}
}
5-2. hello service 내용 수정
package org.zerock.w1.service;
import org.springframework.stereotype.Service;
import org.zerock.w1.mappers.TimeMapper;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class HelloService {
private final TimeMapper timeMapper;
public String getTime() {
return timeMapper.getTime();
}
}
5-3. hello.jsp 내용 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello JSP FILE${timeStr}</h1>
</body>
</html>
5-4. mappers 폴더생성, mapper.xml생성 및 mapper.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"> <!--dtd의 역할은 자동완성-->
<mapper namespace="org.zerock.w1.mappers.TimeMapper"> <!-- 인터페이스의 경로를 똑같이하고 메소드이름 똑같이 -->
<select id="getTime2" resultType="string"> <!-- 인터페이스 메소드이름 적고, 해당 메소드의 타입을 적되, 소문자로 -->
select now()
</select>
</mapper>

5-5. 인터페이스 메소드 생성

5-6. root-context 내부 정보 추가 / 이폴더안에는 mybatis mappers.xml이 들어있다라는의미

5-7. timeTests.java 에 내용 추가

5-8. test2 의 test시에 잘 되는지 확인
6-1. vo 패키지생성, todo 클래스 생성

6-2. 클래스 내부에 vo처럼 변수생성

6-3. TodoMapper 인터페이스 생성

6-4. test코드 생성

6-5. 하지만, sql문을 java와 섞이는 인터페이스에 생성하지 않고 주로 xml에 sql문을 작성한다. todoMapper 인터페이스 수정, todo.xml생성 및 작성


6-6. 기존의 테스트 코드 작성해도 되지만 forEach이용해도 됨
