개발은 재밌어야 한다
article thumbnail
반응형

스프링으로 게시판을 만들어보는 포스팅을 작성해보려고 합니다.

최종적인으로 완성 형태는 Vue, Spring, MariaDB을 사용한 형태로 완성하려고 합니다.

 

 

일단 이전 포스팅에서 작성한 프로젝트를 기반으로 사용합니다.

 

Lombok을 사용하여 Java 개발시에 자주 사용되는 getter/setter, toString(), 생성자등을 변수를 선언한 것만으로도 자동으로 생성해줘서 코드를 줄이는데 유용합니다.

 

Lombok 다운로드는 http://prprojectlombok.org/에서 jar 파일 형태로 다운 받을수 있습니다.

받은 lombok.jar를 실행킵니다.

Quit Installer 눌러서 설치를 해주세요

이제 pom.xml에 lombok의 라이브러리를 추가해주고 Log4j 라이브러리는 1.2.15로 설정되어 있으므로, 아래와 같이 1.2.17버전으로 바꾸고 Junit도 4.12버전으로 수정하도록 하겠습니다.

 

		<!-- spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
	
		<!-- spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>		
		</dependency>
		
		<!-- spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

이번에는 스프링 프레임워크와 MyBatis를 연동해서 좀 더 빠르게 SQL을 처리할 수 있는 구조를 만들어 보겠습니다.

MyBatis는 흔히 'SQL 매핑(mapping) 프레임워크'로 분류되는데, 개발자들은 JDBC 코드의 복잡하고 지루한 작업(Connection 맺고 마지막에 close(), PrepareStatement 생성과 처리, 데이터 set, SELECT에서 ResultSet 처리)을 피하는 용도로 많이 사용합니다.

 

JPA를 통한 ORM 방식도 있는데, 이 부분도 나중에 다뤄볼 예정입니다.

 

MyBatis와 mybatis-spring을 사용하기 위해서 pom.xml 파일에 추가적인 라이브러리들을 설정해야 합니다.

  • spring-jdbc/ spring-tx : 스프링에서 데이터베이스 처리와 트랜잭션 처리
  • mybatis/mybatis-spring: MyBatis와 스프링 연동용 라이브러리

 

mvnrepository.com/artifact/org.mybatis/mybatis

mvnrepository.com/artifact/org.mybatis/mybatis-spring

mvnrepository.com/artifact/org.springframework/spring-tx

mvnrepository.com/artifact/org.springframework/spring-jdbc

Maven Repository에서 Mybatis를 검색하여 라이브러리 코드를 가져와 설정합니다.

저는 제일 많이 사용하는 3.4.6버전을 가져와 사용하도록 하겠습니다.

 

pom.xml에 Mybatis 라이브러리를 불러올 수 있게 복사해서 붙여주도록 합니다.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>

 

mybatis-spring도 가장 많이 사용하는 1.3.2 버전을 사용하겠습니다.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
</dependency>

스프링 JDBC와 트랜잭션은 해당 프로젝트의 스프링 버전이 있기에 해당 버전과 맞게 하기 위해서 따로 maven repository에서 가져오지 않고 해당 스프링 프로젝트 버전에 맞추도록 하겠습니다.

<!-- Spring Transaction -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

<!-- Spring JDBC -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

이제 프로젝트에서 pom.xml파일에 라이브러리 코드들을 복사해서 <dependencies></dependencies>안에 위에 있는 라이브러리 코드들을 붙여 넣어겠습니다.

 

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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.dream</groupId>
	<artifactId>controller</artifactId>
	<name>Board</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>		
		<!-- spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
	
		<!-- spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>		
		</dependency>
		
		<!-- spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
		
		<!-- mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.2</version>
		</dependency>
		
		<!-- Log4jdbc -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>
		
		<!-- lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.0</version>
			<scope>provided</scope>
		</dependency>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>        
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

이번에는 MariaDB를 설치해보록 하겠습니다.

제가 사용할 버전은 5.3.12버전입니다. OS에 맞게 설치를 해주시면 됩니다.

downloads.mariadb.org/mariadb/5.3.12/

 

MariaDB 5.3.12 Stable - MariaDB

 

downloads.mariadb.org

 

설치는 다음과 같습니다.

비밀번호는 각자에 맞게 설정해주세요
3306포트를 사용하시면 충돌할 수 있으니 별도의 포트번호로 설정해주세요
install을 누르면 설치가 진행됩니다.

 

이번엔 MariaDB를 스프링과 연동해보자

maven repository에서 찾아 추가해주도록 한다.

mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client

<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.7.2</version>
</dependency>

이것도 pom.xml에 추가해주록 합니다.

이번에는 src > main > webapp > WEB-INF > spring > root-context.xml에 namespace를 체크를 해줍니다.

빨간색의 namespace들을 체크해주고 Source를 들어가 dataSource빈과 sqlSessionFactory빈을 추가해줍니다.

<beans></beans> 코드 안에 빈을 정의한다.

	<!-- MariaDB JDBC DataSource -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="org.mariadb.jdbc.Driver" />
		<property name="url" value="jdbc:mariadb://127.0.0.1:3306/test" />
		<property name="username" value="root" />
		<property name="password" value="qlqjs1" />
	</bean>
    
	<!-- mybatis SqlSessionFactoryBean -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:/mybatis-config.xml" />
        	<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
	</bean>	

 여기서 Bean이라는 것이 나온다.

 

Bean(빈)이란?

Bean이란 Spring이 생명주기를 관리하는 객체이다. 이때 빈의 scope를 지정 할 수 있고 Singleton과 Proptotype으로 지정할 수 있다. proptotype은 객체 호출시에 매번 새롭게 생성하게 된다.

 

bean에 property를 통해서 빈이 생성될 때 변수(name)과 value(값)을 주입해서 빈 생성과 동시에 빈으로 생성된 클래스에 값을 주입할 수 있다.

 

src > main > resource 폴더에 file을 선택합니다.

 

mybatis-config.xml파일을 생성해줍니다.

src > main > resource 폴더에 mapper 패키지를 생성해줍니다.

mapppers 아래에 testMapper.xml 파일을 생성하고 코드를 추가합니다.

<?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">

<mapper namespace="test.mappers.testMapper">

</mapper>

잘 연결되었는지 테스트 해보겠습니다.

src > test > java에 클래스파일 2개를 생성해줍니다

DBConnetcionTest.java

package com.dream.controller;

import java.sql.Connection;

import javax.inject.Inject;
import javax.sql.DataSource;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
public class DBConnectionTest {
    
    @Inject
    private DataSource ds;
 
    @Test
    public void testConnection(){
    	
        try (Connection con = ds.getConnection()) {
 
            System.out.println("DB연결 성공");
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

MyBatisConnectionTest.java

package com.dream.controller;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class MyBatisConnectionTest
{
    @Inject
    private SqlSessionFactory sqlFactory;
    
    @Test
    public void testFactory(){
        System.out.println("sqlFactory : "+sqlFactory);
    }
    
    @Test
    public void testSession() throws Exception{
        
        try(SqlSession session = sqlFactory.openSession()){
            
            System.out.println("session  : "+session);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이제 Junit으로 테스트를 해봅니다.

DB연결 성공이 출력이 되었습니다.

 

 

프로젝트 파일은 깃허브에서 확인 할 수 있습니다.

github.com/skarbgud/Board-Project

 

skarbgud/Board-Project

Contribute to skarbgud/Board-Project development by creating an account on GitHub.

github.com

 

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!