주니어 기초 코딩공부/Spring 기초

[Spring] 스프링 + MyBatis + MySQL의 연동

jju_developer 2023. 2. 6. 17:07
728x90

안녕하세요 jju_developer입니다.

오늘을 MyBatis에 대한 개념 정리를 해보겠습니다.

Mybatis

Mybatis는 자바 오브젝트와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping) 프레임워크입니다.

SQL을 별도의 파일로 분리해서 관리하게 해 줍니다.
Hibernate나 JAP(Java Persistence Api)처럼 새로운 DB프로그래밍 패러다임을 익혀야 하는 부담 없이

SQL을 그대로 이용하면서 JDBC코드 작성의 불편함도 제거해 주고 도메인 객체나 VO객체를 중심으로 개발이

가능하다는 장점이 있습니다.

Mybatis의 특징

  1. 쉬운 접근성과 코드의 간결함
    JDBC의 모든 기능을 Mybatis가 대부분 제공하기 때문에
    복잡한 JDBC코드를 걷어내며 깔끔한 소스코드를 유지할 수 있는 것입니다.
    수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있습니다.
  2. SQL문과 프로그래밍 코드의 분리
    SQL에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일하지 않아도 됩니다.
  3. 다양한 프로그래밍 언어로 구현가능합니다.
    Java, C#, .NET, Ruby

 

일반적인 스프링 웹 프로젝트의 구성
 일반적으로 웹 프로젝트는 3개의 레이어(혹은 tier)로 구성합니다.

0.8 스프링 프로젝트 구축 절차 (요약)

0.8.1 설정 순서
####################################################################################
# 표준 설정
1. Spring Legacy Project 생성: Templates: Spring MVC Project 선택
2. 프로젝트 설정 변경
a. Project Facets
b. Java Buil Path에서 “Junit 5”를 추가한다.
c. pom.xml 파일의 Java 버전(1.8)과 Spring 버전(4.1.7), maven-compiler-plugin(3.5.1), source(1.8), target(1.8)로 변경한다.
3. DBMS 연결 테스트
a. pom.xml 파일에
- db 라이브러리 추가
- maven-compiler-plugin 버전 변경: 3.5.1, 1.8, 1.8
b. MySQLConnectionTest.java 테스트
- pom.xml에 jdbc 설정
- MySQLConnectionTest.java로 연결 테스트
4. 스프링 + MyBatis + MySQL의 연동 테스트
a. pom.xml에 spring-jdbc, spring-test, MyBatis, mybatis-spring 추가
b. log4j 파일 복사: src/main/resources/폴더에 두 개의 파일(log4j.xml, log4jdbc.log4j2.properties, logback.xml)을 복사해 놓는다.
c. root-context.xml 설정: MySQL과의 연결을 담당하는 dataSource, sqlSessionFactory 설정한다.
d. mybatis-config.xml 파일의 추가
e. dataSource 연결 테스트: org.zerock.test.DataSourceTest.java
f. MyBatis의 연결 테스트: src/test/java/org/zerock/web/MyBatisTest.java
5. web.xml에 스프링의 UTF-8 처리 필터 등록
####################################################################################
# 웹애플리케이션 설정
6. CSS, JavaScript 준비: bootstrap theme 이용, Context Path 변경
7. 영속 계층
a. VO, DAO, XML Mapper
b. root-context.xml에 SessionFactory, SqlSessionTemplate의 추가
8. 비즈니스 계층
a. BoardService 등록
b. root-context.xml에 scan 등록
9. 컨트롤러
/board/register
10. views(*.jsp) 생성

####################################################################################

위 과정을 살펴보겠습니다.

pom.xml에 해당 MyBatis를 넣고 저장하면

Maven Dependancies

Maven Dependancies에 추가한 MyBatis가 자동으로 저장됩니다.

 

 log4j 관련 파일 생성
• src/main/resources/폴더에 두 개의 파일(log4j.xml, log4jdbc.log4j2.properties)을 복사해 놓습니다.

ex00에서 해당 4개를 가져와 src-> main-> resources에 엎어치기 하였습니다.

설정에 관련된 파일입니다. 해당 파일이 없으면 서비스가 올라가지 않습니다.

 

 Spring Project에서 root-context.xml 파일의 수정
• src/main/webapp/WEB-INF/spring/root-context.xml 파일은 STS가 스프링 프로젝트를 생성할 때 만들어 주는 파일에서 가장 중요한 파일입니다.
• MySQL과의 연결을 담당하는 DataSource 설정합니다.

 

<!-- lab begin -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex"></property>
<property name="username" value="zerock"></property>
<property name="password" value="zerock"></property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- lab end -->

root-context.xml

root-context.xml 컨테이너에 객체를 만드는 것입니다.

해당 xml 파일에 접속 URL, 계정이름, 비밀번호를 통해서 connection을 하여 dataSource라는 객체에 담습니다.

이것을 세션 팩토리라는 곳에 connection을 넣습니다.

이 세션팩토리를 통해서 커넥션을 만드는 것입니다.

<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>

세션팩토리를 만드는 구조

스프링에 컨테이너가 있는데, 

그 컨테이너 안에 데이터소스와, sql세션팩토리 객체를 두 개 생성한 것입니다.

property니까 setter로 객체를 참조하여 만드는 것입니다.

spring container

그 다음 !!

*루트는 서비스 dao, 빈객체를 넣어 설정

*서블릿은 프레젠트 레이어 설정

 

servlet-context.xml과 root-context.xml 차이점

 servlet-context.xml:
• <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
 즉, DispatcherServlet의 request-processing에 관한 내용이 선언되어 있습니다.
• url과 관련된 controller나, @(어노테이션), ViewResolver, Interceptor, MultipartResolver 등의 설정을 해줍니다.


 root-context.xml
• <!-- Root Context: defines shared resources visible to all other web components --> 즉, 다른 웹 컴포넌트들과 공유하는 자원들을 선언하는 용도로 사용됩니다.
• servlet-context.xml 과는 반대로 view와 관련되지 않은 객체를 정의한다. 따라서 Service, Repository(DAO), DB 등 비즈니스 로직과 관련된 설정을 해줍니다.
 servlet context는 root context의 bean를 참조할 수 있지만, 반대의 경우는 불가능합니다.

 

 

0.5.4 MyBatis와 스프링 연동
 SqlSessionFactory 객체 설정: MyBatis와 스프링 연동 작업에서의 핵심은

Connection을 생성하고, 처리하는 SqlSessionFactory의 존재입니다.

SqlSessionFactory는 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체입니다.

 

그다음 연결 테스트를 진행합니다.

 

데이터 소스 테스트는 순수하게 스프링 설정으로 하는 테스트입니다.

 

처음에 mySql 연결 테스트(MySQLConnection.java)는 자바코드를 이용해서 폼에 정의한 jdbc를 이용하여 (다운 X) MySql에 연결한 것이고

MySQLConnection.java 커낵션 정보가 내부에 있음


지금 하는 것은

DataSourceTest.java는 스프링 설정(rootContext.xml에 빈객체를 만듦)을 통해서 자바 코드로 jdbc연결하여

MySql에 연결까지 하는 것입니다.

=> 자바 코드는 xml에만 있음!!!

데이터 소스 필드에 @inject 주입합니다 => 데이터 타입이 같은 객체가 ds에 저장됩니다.

@inject 를 통해 출력 하는 코드입니다.

결론: java-> Spring(rootContext.xml 설정)-> jdbc-> mysql

sqlSessionFactory 생성


최종적으로  결론: java-> Spring(rootContext.xml 설정)-> jdbc-> mysql 여기에 이 jdbc와 mysql 사이에 있는

myBatis 테스트를 보겠습니다.

 

[ex00/src/test/java/org/zerock/web/MyBatisTest.java]

1. 스프링 설정에 따라 스프링 컨테이너에 객체를 만들고

2. 컨테이너에 설정된 객체들의 주입을 받습니다.

객체: dataSource, sqlSessionFactory

3. sqlFactory라고 했으니까 sqlSessionFactory가 주입됩니다.

 

myBatisTest.java

 

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets 
		and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>

	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

<!--필터 추가  -->
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

<!--/ 필터 추가  -->


</web-app>

파라미터 넘어올 때 utf-8로 넘어오게 필터 설정하였습니다.

여기까지가 스프링 프로젝트 표준 설정입니다.

 

여기까지 설정하면 애플리케이션을 만들 준비가 된 것입니다.

 

다음시간에는 기본적인 기능의 게시물 관리에 대해 알아보겠습니다.

 

수고하셨습니다 ^^

728x90