1-3. 스프링 웹프로젝트 - DB(DataBase)를 연동해주자 (1/2)

2020. 8. 9. 10:42勉強 공부/Spring framwork


_____________________

따라하더라도 나만의 것을 만드는 것

1-3

DB(DataBase)를 연동해주자

DB 셋팅 및 접속 테스트
Part.1

_____________________

 

 

 

 

 

 

 

 

 

 

DB연결에 프로젝트의 환경을 살짝 수정 해줍시다~

 

웹 시스템은 가장 먼저 web.xml을 참조하여

스프링의 설정과 관련된 파일들의 위치를 파악하고

그 파일들을 참조 합니다.

 

현재 web.xml을 보면

src~~~~~spring 폴더에

root-context.xml

servlet-context.xml

등 두개의 파일이 있습니다.

 

실무에서는 규모가 큰 프로젝트를 할 수도 있기 때문에

관리하기 쉽도록 위치를 바꿔줍니다.

 

 

 

1.  위에 src/main/resources 에  「 servlet-context.xml 」 을 옮긴후

2.  spring 디렉토리를 생성해서 「 root-context.xml 」 을 옮깁니다.

 

 

 

이후

두 파일을 옮겼으므로

web.xml 파일도 수정을 해줘야 합니다.

web.xml

 <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*-context.xml</param-value> 
</context-param>

<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

root-context.xml 같은 경우는 이름을 *-context.xml로 수정하였습니다.

추후에 추가할 설정 파일을 000-context.xml 등과 같이 만들어 저장하면

스프링에서 자동으로 뒷글자 -context.xml를 인식할 수 있습니다.

이후에 추가될 데이터베이스 관련 설정 파일도

dataSource-context.xml 를 만들어 저장할 예정입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

__________________________________________

이제 데이터베이스사용자를 추가 해줍시다.

 

저같은 경우 MariaDB 를 사용했습니다.

 

터미널 에서

 

brew list
엔터


mariadb 를 언젠가 설치해서 이미 있다던가?

mySQL 이 있다면?

혹은 다른 DB가 있다면

설치중 출돌이 생겨서 설치되지 않아요.

 

아무런 DB 가 없다면

이제부터 잘 따라오시죠

 

Terminal

brew update
엔터

brew search mariadb
엔터

brew install mariadb
엔터 & 설치

mariadb -u roou -p
passworld 문구 나오면 그냥 엔터
mariadb 에 접속 됩니다.

 

 

 

 

 

 

저는~ 혼자 시작한 초보자 입니다.
출처: https://freehoon.tistory.com/101 [훈잇 블로그]
참고해서 따라하는 중입니다.
『훈잇』 님 감사해요~

 

 

 

 

 

 

데이터베이스 및 사용자 추가

이제 블로그를의 데이터를 저장할 데이터베이스와 사용자를 추가 할 차례 입니다.

 

Terminal

MariaDB[mysql]> CREATE DATABASE 'MESS';

MariaDB[mysql]> CREATE USER 'mess'@'%' IDENTIFIED BY 'mess';

MariaDB[mysql]> grant all privileges on MESS.* TO 'mess'@'localhost' with grant option;

MariaDB[mysql]> FLUSH PRIVILEGES;

MESS 라고 하는 DB 생성

mess 라고하는 user 생성
MESS 라고하는 DB의 내부 테이블 (MESS.*)에 대해

mess라는 비밀번호「 IDENTIFIED BY 'mess'; 」 로 접근 가능하게 설정

두번째, 세번째에서 설정한 내용을 반영하는 명령어 입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

데이터베이스사용자를 만들었다면

이제 스프링에 데이터베이스 접속과 mtbatis 관련 셋팅을 할 차례 입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Depnedency 추가

 

pom.xml 의

<dependencies>  ~~~~~~~~~~  </dependencies>
사이에 아래의 문구를 추가합니다.

pom.xml

<!-- DB 사용을 위해 추가해주는 문구 -->

<!-- Maria DB -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.0.3</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>

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

<!-- DBCP 데이터베이스 풀 커넥션 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

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

 

 

 

 

 

테스트 해보기 위해서

junit 의 버전을 4.12로 수정합니다. 위치는 

pom.xml 에

추가했던 내용중  <dependency> 목록중 하단에 에 있어요.

저는 혹시몰라

아래 내용 처럼 주석처리 했습니다.

테스트가 끝나고 복구해둬야 하니깐요.

pom.xml

<!-- Test -->
<!-- <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency> -->
<!-- Test -->

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

 

 

 

 

 

 

작동 테스트하기위해서

pom.xml 에 기본설정되어있는 자바나 스프링의 버전도 수정을 합니다.

위치는  pom.xml 상단

<properties> ~~~~~~~~ </properties>

에 있습니다.

pom.xml

<!--<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties> -->


<!-- 테스트를 위해서 수정 -->
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.1.4.RELEASE</org.springframework-version>
<org.aspectj-version>1.9.2</org.aspectj-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>

 

 

 

JDK 버전을 변경 했으니까

「 Maven - update project 」 를 해줘야 합니다.

 

 

 

이 두개의  Properties 에서 java 버전을 바꿔줍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이제

데이터베이스 설정 파일을 추가 해줘야 합니다.

 

 

 

 

dataSource-context.xml

파일을 생성해주고

아래 내용을 입력해줍니다.

dataSource-context.xml

<?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:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="
http://mybatis.org/schema/mybatis-spring 
http://mybatis.org/schema/mybatis-spring.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- dataSource 객체 설정 -->
<!-- 데이터베이스의 접속 정보를 설정합니다. -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mariadb.cj.jdbc.Driver" />
<property name="url" value="jdbc:mariadb://127.0.0.1:3306/mess?useSSL=false&amp;serverTimezone=Asia/Seoul" />       
        <property name="username" value="mess"></property>
        <property name="password" value="mess"></property>
</bean>  

<!-- SqlSessionFactory 객체 설정 -->
<!-- 이 문구는 mybatis 와 관련되어 있는 정보입니다. -->

<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />       
<property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" />
</bean>

<!-- SqlSession Template 설정 -->
<!-- 이 문구는 mybatis 와 관련되어 있는 정보입니다. -->

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="SqlSessionFactory" />
</bean>
</beans>

<!--dataSource 객체 설정 -->

데이터베이스의 접속 정보를 설정합니다.

 

useSSL=false&amp;

mybatis에서 옵션설정을 하라는 오류가 생기는것을 방지하기위해 SSL 을 사용하지 않게 지정serverTimezone=Asia/Seoul"서버타임존의 위치가 맞지않아 생기는 오류를 방지하기위해 서버의 타임존을 서울로 지정

 

 

<!-- SqlSessionFactory 객체 설정 -->

<!-- SqlSession Template 설정 -->

이 문구는 mybatis 와 관련되어 있는 정보입니다.

SqlSessionFactory 안에 있는 mapperLocations 는 데이터베이스에서 실행 할 SQL 쿼리문이 있는 위치 입니다.

'classpath:' 가 /src/main/resources/ 입니다.

따라서 위와 같이 되어 있으면 /src/main/resources/main 아래 모든 하위 디렉토리를 포함하여 

Mapper.xml로 끝나는 모든 파일을 참조 한다는 뜻입니다.

 

 

우선 여기에 게시판 제작을 위한 'boardMapper.xml'을 만들어 두도록 합니다.

boardMapper.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="com.freehoon.web.board.boardMapper">

</mapper>

 

 

 

 

 

 

 

 

 

 

 

__________________________________________

 

데이터베이스 접속 테스트

 

아래 그림과 같이

/src/test/java

안에

「 com.project.200801.web 」

이름의 패키지를 생성합니다

 

 

 

 

그 안에

class 생성으로

「 MysqlConnectionTest.java 」

파일을 생성합니다.

MysqlConnectionTest.java

package com.project200801.web;

import java.sql.Connection;

import javax.inject.Inject;
import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/dataSource-context.xml" })
public class MysqlConnectionTest {
private static final Logger logger = LoggerFactory.getLogger(MysqlConnectionTest.class);

@Inject
private DataSource ds;

@Test
public void testConnection() {
try (Connection con = ds.getConnection()){
logger.info("\n MySQL 연결 : " + con);
} catch (Exception e) {
e.printStackTrace();
}
}
}

 

 

 

 

 

 

 

 

 

이제 잘 작동하는지 테스트 해 봅시다.

서버를 작동 시킨 후

작성한 소스 안에서 우클릭 후 Run As 해주세요.

 

 

아........................
Access denied for user 'mess'@'localhost'
3일간 고생했습니다.

참고하는 블로그 글은 mysql 인데 제 취향껏 mariaDB 사용 한다고
억지 부려서 오류가 나나?
저도 mysql 로 바꿔도 보고
계정 권한도 모든권한 줘보고
하다가 잠잘시간되고...
3일간 헛수고 뺑뺑이 다 해보다가


겨우겨우 답을 찾았어요.ㅠㅠㅠㅠㅠㅠㅠ


CREATE USER 'mess'@'%';
만 만들면
Access denied for user 'mess'@'localhost'
오류가 납니다.
다른분들은 잘 되나본데...... 저만안되는 이유를 아직 몰라요.
아시는분 있다면 알려주시면 감사합니다.


CREATE USER 'mess'@'localhost';
이렇게도 만들어줘야 오류가 안나고 정상작동 하더군요.
너무너무 길고긴 싸움이었습니다.
어떤글을 보니 모든접속권한을 줘도 localhost 로 안들어가질 경우가 있다고 하는데
정확한 원인 이유를 모르겠어요.

 

 

 

 

 

 

ㅎㅎㅎㅎ

콘솔에서 이렇게 정상적으로 나와야합니다 ㅠㅠㅠ

 

 

 

 

 

  

 

 

 

 

같은곳에  MybatisTest.java 클래스를 생성 해줍니다.

그리고 아래 문구 입력 해주세요.

MybatisTest.java

package com.project200801.web;

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/dataSource-context.xml" })
public class MybatisTest {
private static final Logger logger = LoggerFactory.getLogger(MybatisTest.class);

@Inject
private SqlSessionFactory sessionFactory;

@Test
public void testSessionFactory() {
logger.info("\n Session Factory : " + sessionFactory);
}

@Test
public void testSqlSession() {
try (SqlSession session = sessionFactory.openSession()) {
logger.info("\n Sql Session : " + session);
} catch (Exception e) {
e.printStackTrace();
}
}
}

다행이 이것도 정상작동 하는군요 ㅠㅠㅠㅠ

정말 너무 고생 많았습니다.

 

선생님 없이 오류를 직접찾아 고치려고 하니 ... 너무너무 힘들어요.

선생님이 있는분들은 꼭 선생님한테 질문하세요. ㅋㅋㅋㅋ

 

 

다음에는 또 DB셋팅 part.2 에요