본문 바로가기
학습/SPRING

14. 스프링 - mybatis 기본 설정

by Elfen Lied 2023. 1. 5.
반응형

기본 설정 프로젝트를 만들고 이 프로젝트를 복사해서 활용할 것

 

- log4j 정리

## 마이바티스 모듈 추가
	- mybatis
	- mybatis-spring 2.x.x
	
## 마이바티스 설정
	- 설정 파일 :	com.jafa.config.RootConfig
	- @MapperScan 매퍼 인터페이스 패키지 설정
	- SqlSessionFactoryBean
		- DataSource빈 전달
		- mapperLocation : classpath:mappers/**/*Mapper.xml
	- SqlSessionTemplate
		- SqlSessionFactory : 	SqlSessionFactoryBean.getObject()로 부터 얻는다.
		- SqlSessionFactory빈 생성자 주입

## 매퍼 인터페이스 및 매퍼XML 작성
	- 매퍼인터페이스 : com.jafa.repository.TestRepository
	- 매퍼 파일 : classpath:mappers/TestMapper.xml
	- 테스트 케이스 : com.jafa.mybatis.testMapperTest

## log4j 설정
	- 모듈 추가
		log4j
		slf4j-log4j12
		jcl-over-slf4j
		spring-core : exclude (commons-logging)
	- 로그 설정 파일 : classpath:log4j.xml

## log4jdbc-log4j2 설정
	- 모듈 추가
		- log4jdbc-log4j2-jdbc4.1
	- RootConfig에서 DataSource 재설정
	- log4jdbc-log4jdbc.log4j2.properties
	- log4j.xml 로그레벨 조정

 


 

- 디펜던시 : pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.22.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.22.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.2.22.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jdbc</artifactId>
        <version>10.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>

    <!-- 마이바티스 시작 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.11</version>
    </dependency>
    <!-- 마이바티스 끝 -->

    <!-- log4j 시작 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>2.0.6</version>
    </dependency> <!-- 타입과 스코프 삭제함 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>2.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.2.22.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
        <version>1.16</version>
    </dependency>
    <!-- log4j 끝 -->

</dependencies>

 

pom.xml 파일 <build></build> 부분에 있는 <configuration> 의 <release>가 16으로 되어있다면 11로 바꿀것

바꾸고 메이븐 업데이트 실행하고 ( JavaSE-11 ) 확인할것

 


- src/main/java

- com.jafa.config 패키지 RootConfig, ServletConfig, WebConfig 클래스 생성

 

- RootConfig

package com.jafa.config;

import java.io.IOException;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan("com.jafa.repository")
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		DataSource dataSource = new DataSource();
		dataSource.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
		dataSource.setUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:XE");
		dataSource.setUsername("springdb");
		dataSource.setPassword("1234");
		return dataSource;
	}
	
	@Bean
	public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {
		SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
		factory.setDataSource(dataSource());
		factory.setMapperLocations(new PathMatchingResourcePatternResolver()
								.getResources("classpath:mappers/**/*Mapper.xml"));
		return factory;
	}
	
	@Bean
	public SqlSessionTemplate sqlSessionTemplate() throws IOException, Exception {
		return new SqlSessionTemplate(sqlSessionFactoryBean().getObject());
	}
}

 

- ServletConfig

package com.jafa.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@ComponentScan("com.jafa")
public class ServletConfig implements WebMvcConfigurer {
	
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/resources/**")
				.addResourceLocations("/resources/");
	}
}

 

- WebConfig

package com.jafa.config;

import javax.servlet.Filter;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class[] {RootConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class[] {ServletConfig.class};
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] {"/"};
	}

	@Override
	protected Filter[] getServletFilters() {
		CharacterEncodingFilter filter = new CharacterEncodingFilter();
		filter.setEncoding("utf-8");
		filter.setForceEncoding(true);
		return new Filter[] {filter};
	}
}

 


 

- 모든 경로 폴더부터 만들기

 

- src/main/resources/mapper 폴더 만들기

 

 

- 테스트 코드를 위한 경로 지정

src/test/안에 java폴더, resources 폴더 생성

 

- 경로 폴더를 만든 뒤 메이븐 업데이트를 해준다.

업데이트를 하고 나면 각각 경로가 나타난다

 


 

- src/main/resources안에 log4j.xml 와 log4jdbc.log4j2.properties 파일 넣기

 

- log4j.xml
주석으로 표시한 태그들은 필요시 풀면 됨.

콘솔창에 표시할 태그들만 활성화 하기

<?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="com.jafa" >
        <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> -->
    
    <!-- 마이바티스 로그 레벨 설정 -->
    <!-- <logger name="jdbc.audit">
        <level value="warn" />
    </logger>
    <logger name="jdbc.resultset">
        <level value="warn" />
    </logger>
    <logger name="jdbc.connection">
        <level value="warn" />
    </logger> -->

    <logger name="jdbc.sqltiming">
        <level value="warn" />
    </logger>
    <logger name="jdbc.sqlonly">
        <level value="info" />
    </logger>
    <logger name="jdbc.resultsettable">
        <level value="info" />
    </logger>

 	
    <!-- Root Logger -->
    <root>
        <priority value="warn" />
        <appender-ref ref="console" />
    </root>
    
</log4j:configuration>

 

- log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

 


 

- 메인 화면 나타내기

 

- src/main/java

- com.jafa.controller 패키지 HomeController 클래스 생성

 

- HomeController

package com.jafa.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
	
	@GetMapping("/")
	public String home() {
		return "index";
	}
}

컨트롤러 만들었다면 메인화면.jsp를 준비한다.

return에 들어간 "index"와 이름을 같게 해준다.

index.jsp

 


 

- src/main/webapp/WEB-INF/views/index.jsp 생성

 

- index.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>메인화면</h1>

</body>
</html>

 

만든후 프로젝트에서 우클릭 Run As -> Run on Server로 실행하기

 

브라우저에 출력되면 됨

만약 CSS, JS, image 등을 넣고 싶으면 

src/main/webapp/resources/ css, js, image 폴더를 만들어 안에 넣으면 됨.

 


 

- 테스트 케이스

 

- src/main/java

- com.jafa.repository 패키지 TestRepository 클래스 생성

 

- TestRepository

package com.jafa.repository;

import java.util.Date;

public interface TestRepository {
	Date getCurrentDate();
}

 


 

- src/test/java

- com.jafa 패키지 AppTest JUnit4 생성

 

- AppTest

package com.jafa;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import com.jafa.config.RootConfig;
import com.jafa.config.ServletConfig;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class, ServletConfig.class})
@WebAppConfiguration
public class AppTest {
	
}

 

 

- src/test/java

- com.jafa.config 패키지 RootConfigTest JUnit4 생성

 

- RootConfigTest

  • JUnit 생성하고 extends AppTest 잊지말것.
package com.jafa.config;

import static org.junit.Assert.assertNotNull;

import java.sql.SQLException;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import com.jafa.AppTest;

public class RootConfigTest extends AppTest {
	
	@Autowired
	DataSource dataSource;
	
	@Test
	public void dataSourceTest() throws SQLException {
		assertNotNull(dataSource);
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
		String now = jdbcTemplate.queryForObject(
				"select sysdate from dual",	String.class);
		System.out.println(now);
	}
	
}

 

 

- src/test/java

- com.jafa.repository패키지 TestRepositoryTest JUnit4 생성

 

- TestRepositoryTest

package com.jafa.repository;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.jafa.AppTest;

public class TestRepositoryTest extends AppTest {

	@Autowired
	TestRepository testRepository;
	
	@Test
	public void test() {
		System.out.println(testRepository.getCurrentDate());
	}

}

 


 

- src/main/resources/mappers/TestMapper.xml XML파일 생성

기본 틀은 ( https://mybatis.org/mybatis-3/ko/getting-started.html

매핑된 SQL 구문 살펴보기 란에서 복사해서 수정하기

<?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.jafa.repository.TestRepository">
  
  <select id="getCurrentDate" resultType="java.util.Date">
	select sysdate from dual
  </select>
  
</mapper>
  • mapper namespace는 클래스가 있는 패키지와 클래스명을 쓴다
  • select id에는 namespace에서 입력한 클래스에 있는 메소드명을 적는다
  • resultType에는 완전한 클래스 이름을 넣는다.

TestRepositoryTest 에서 JUnit 으로 실행

통과 되고 콘솔에 잘 찍히면 됨

반응형

댓글