프로그래밍/Java

[Spring] 스프링 삽질일지 2일차 - 한글 깨짐 문제 해결, mariaDB 설치, 스프링과 데이터베이스 연동

Be개발자 2021. 4. 30. 01:37

 

 

어제는 STS 3 설치 및 pivotal 4 서버를 연동하였다.

이번 프로젝트에서는 데이터 베이스로 MariaDB를 사용한다. 그러므로 오늘은

 

1. 한글 깨짐 현상 해결

2. MariaDB 설치 및 테이블 생성

3. 스프링과 데이터베이스 연동

 

를 해볼까 한다.


1. 한글 깨짐 현상 해결

 

지난번에 서버를 실행했더니 

 

이렇게 글씨가 깨지는 현상이 일어났다. 이는 한글 인코딩의 문제로 web.xml 파일에 UTF-8 인코딩 관련 코드를 추가해줘야 한다.

 

web.xml 파일에 들어가

 

<!-- UTF-8 인코딩 설정 --> 
	<filter>
	    <filter-name>encodingFilter</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>encodingFilter</filter-name>
	    <url-pattern>/*</url-pattern>
	</filter-mapping>

위의 코드를 </web=app> 태그 위에 복붙해주면 된다.

 

 

web.xml 파일을 수정 후, 서버를 실행해보니 

 

결과가 똑같이 나와서 당황하기 잠시, 구글링을 하니 view의 home.jsp 파일도 바꿔줘야 한다고 한다..

 

 

views 폴더의 home.jsp 코드에서 아래의 코드를 위에 삽입해준다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

 

그러고 서버실행을 하니까 한글이 정상적으로 출력되는 것을 확인할 수 있다!

 

 

 

2. MariaDB 연동

일단 MariaDB를 설치하자.

 

다운로드는 https://downloads.mariadb.org/ 

 

mariadb-10.5.9-win64.msi 을 다운받아서 설치하였다.

설치과정은 해당 블로그를 참고하였다.

 

MySQL Client에서 MariaDB를 다운받을 때 설정한 root password를 치고, show databases; 명령어를 통해 설치된 기본 데이터 베이스를 확인한다.

 

MariaDB가 잘 설치된 것을 확인할 수 있다.

 

이제 MariaDB를 설치할 때 함께 설치된 HeidiSQL을 실행한다.

 

처음에 실행할 때 위와 같은 화면이 뜬다. 새로 추가하기 위해 좌측 하단의 신규 버튼을 클릭하여 새로운 데이터베이스를 만든다.

 

 

기본 포트 번호는 3306이고, root password를 입력해준다.

 

 

성공적으로 접속!

 

이제 쇼핑몰(게시판) 만들기에 필요한 데이터베이스를 생성해보자.

필요한 컬럼은 다음과 같다.

 

ID 게시글 번호
NAME 이름
CREATE_ID 작성자
CLICK_CNT 조회수
CREATE_DATE 작성일
STATE 상태
CONTENT 상품 설명
COST 가격

 

데이터 베이스를 생성하기 위해 

왼쪽 빈칸에 우클릭 > 새로 생성 > 데이터베이스

 

 

board_db라는 데이터 베이스 새로 생성!

 

CREATE TABLE `BOARD_TABLE` (

	`ID` INT(11) AUTO_INCREMENT,
	`NAME` VARCHAR(100) NOT NULL,
	`CREATE_ID` VARCHAR(30) NOT NULL,
	`CLICK_CNT` DECIMAL(10,0) NOT NULL,
	`CREATE_DATE` DATE NOT NULL,
	`STATE` VARCHAR(10) NOT NULL,
	`CONTENTS` VARCHAR(4000) NOT NULL,
	`COST` INT(11)

	PRIMARY KEY (`ID`)
);

 

위의 코드를 쿼리에서 실행해준다. 

실행 버튼을 누르고 좌측 board_db로 다시 돌아간다.

 

 

빈공간에 우클릭 > 새로고침

 

을 누르면 위의 그림처럼 board_db 데이터베이스 안에 무언가 생긴것을 확인할 수 있다.

 

성공적으로 데이터베이스 테이블 생성이 된 것을 확인할 수 있다.

 

 

3. 스프링과 데이터베이스 연동

 

src/main/java 아래에 com.board.domain이라는 package 생성 후, BoardVO 클래스를 생성한다.

 

BoardVO 클래스를 다음과 같이 작성해준다.

package com.board.domain;

import java.util.Date;

public class BoardVO {
	
	private int id;
	private String title;
	private String create_id;
	private int click_cnt;
	private Date create_date;
	private String state;
	private String contents;
	private int cost;
	
	

	public int getId() {
		return id;
	}
	public String getTitle() {
		return title;
	}
	public String getCreate_id() {
		return create_id;
	}
	public int getClick_cnt() {
		return click_cnt;
	}
	public Date getCreate_date() {
		return create_date;
	}
	public String getState() {
		return state;
	}
	public String getContents() {
		return contents;
	}
	public int getCost() {
		return cost;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public void setCreate_id(String create_id) {
		this.create_id = create_id;
	}
	public void setClick_cnt(int click_cnt) {
		this.click_cnt = click_cnt;
	}
	public void setCreate_date(Date create_date) {
		this.create_date = create_date;
	}
	public void setState(String state) {
		this.state = state;
	}
	public void setContents(String contents) {
		this.contents = contents;
	}
	public void setCost(int cost) {
		this.cost = cost;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

 

이제 pom.xml에 스프링과 데이터베이스가 연동될 수 있도록 maven을 추가해준다.

 

1) pom.xml에 MyBatis 관련 라이브러리 추가

 

 

 - spring-jdbc/spring-tx: 스프링에서 데이터베이스 처리와 트랜잭션 처리(추가하지 않으면 에러 발생하므로 주의!)

 - mybatis/mybatis-spring: MyBatis와 스프링 연동용 라이브러리

 

mybatis 3.4.6

mybatis-spring 1.3.2

mariaDB 2.3.0

 

<!-- mybatis lib-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${org.springframework-version}</version>
      </dependency>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>${org.springframework-version}</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.6</version>
      </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.2</version>
      </dependency>

 

 

추가로 connection pool, lombok, spring-test, sql logging 을 위한 라이브러리도 다운받는다.

  <!-- MariaDB client lib-->
      <dependency>
          <groupId>org.mariadb.jdbc</groupId>
          <artifactId>mariadb-java-client</artifactId>
          <version>2.3.0</version>
      </dependency>

      <!-- connection pool lib-->
      <dependency>
          <groupId>com.zaxxer</groupId>
          <artifactId>HikariCP</artifactId>
          <version>3.2.0</version>
      </dependency>

      <!-- spring 테스트 lib-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>${org.springframework-version}</version>
      </dependency>

      <!-- Lombok lib-->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.4</version>
          <scope>provided</scope>
      </dependency>

 

또한 myBatis는 내부적으로 JDBC의 PreparedStatement를 이용해 SQL을 처리한다. 그렇기에 SQL에 전달되는 파라미터는 JDBC에서와 같이 '?'로 치환되어 처리된다. 그렇기에 '?'값이 어떤 값으로 처리되었는지 제대로 확인하고 싶으면 log4jdbc-log4j2 라이브러리를 사용해야 한다. 그러므로 pom.xml에 아래 코드를 추가해준다.

 

  <!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
	  <dependency>
	      <groupId>org.bgee.log4jdbc-log4j2</groupId>
	      <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
	      <version>1.16</version>
      </dependency>

라이브러리를 추가한 후에 1)로그 설정 파일 추가 2) JDBC의 연결 정보 수정 을 해야한다.

src/main/resources 밑에 log4jdbc.log4j2.properties 파일을 추가한다.

 

그 후, src/main/resources 아래에 log4jdbc.log4j2.properties 파일을 추가한다.

properties 파일은 New > Other > General > Untitled Text Files에서 생성할 수 있다.

 

 

log4jdbc.drivers=org.mariadb.jdbc.Driver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

2) root-context.xml로 이동해서 오른쪽의 namespace 클릭 후

 

namespaces에서 기본으로 beans가 체크되어 있을 것이다.

context, jdbc, mybatis-spring 을 추가로 체크해주자.

 

그 후, namespaces에서 source로 변환한 뒤 아래 코드를 추가해주자.

	<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
			<property name="driverClassName" value="org.mariadb.jdbc.Driver" />
			<property name="url" value="jdbc:mariadb://127.0.0.1:3306/스키마이름" />
			<property name="username" value="root" />
			<property name="password" value="1234" />
		</bean>
		
		<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 id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
 		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
		</bean>

 

위에서 첫번째 bean의 username과 password의 value값엔 각자 mariaDB 생성 시 설정한 값을 넣어줘야 한다.

 

 

그 후, src/main/resuorces에다 new > other > XML > XML files 을 통해 mybatis-config.xml을 생성한다.

mybatis-config.xml 파일에 아래 내용을 추가한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

 

이제 매퍼(Mapper)를 만들어야 한다.

src/main/resources 아래에 New > Folders를 통해 mappers 폴더를 새로 생성한다. 그리고 그 mappers 폴더 아래에 New > Others > XML Files를 통해 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="boardMapper">
</mapper>

이제 mybatis가 제대로 연동되었는지 확인해볼 차례이다.

 

테스트해보기 전에 pom.xml 파일에서 수정해야할 것이 있다.

기존의 junit은 버전이 4.7로 설정되어 있을 것이다. 이를 4.12로 수정해준다.

 

그 후, src/test/java에 Test.java 파일을 새로 생성해준다. src/main/java가 아닌 src/test/java인 점 주의!

 

 

package com.board.controller; // 각자의 package 명으로 수정

import java.sql.Connection;


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

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
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 Test {

    @Inject
    private DataSource ds;
       
    @Inject
    private SqlSessionFactory sqlFactory;
 
    @org.junit.Test
    public void test() throws Exception{

        try(Connection conn = ds.getConnection()){
            System.out.println(conn);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
   
  
    @org.junit.Test
    public void factoryTest() {
        System.out.println(sqlFactory);
      
    }
  
    @org.junit.Test
    public void sessionTest() throws Exception{
      
        try(SqlSession session = sqlFactory.openSession()) {
            System.out.println(session);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

 

맨 위의 package 명을 제외한 나머지 코드를 전부 Test.java에 복붙한다. 그 후, 소스파일 빈 공간 아무 곳에서 

우클릭 > Run as > JUnit Test 를 실행한다. 

 

이렇게 초록색 막대가 뜨면 MyBatis 연동에 성공한 것이다.

 

+) 여담으로 연동에 실패하면 아래처럼 빨간 막대가 나온다. 

 

++) Test.java에서

 

 

org.unit에 빨간줄이 뜨면서 the import org.junit cannot be resolved 에러가 뜨는 경우가 있다.

그럴 땐 프로젝트 우클릭 > Build Path > Configure Build Path

 

우측의 Add Library 버튼 클릭

JUnit 선택

그러면 아래와 같이 JUnit 4가 추가된 것을 확인할 수 있다.

 

++)

자바 버전 바꿔주기

프로젝트 우클릭 > Properties > build 검색 >Java Compiler

에서 기본 1.6으로 설정된 것을 1.8로 바꿔준다.

 

또한

프로젝트 아이콘에 빨간 엑스표가 뜨는 것을 확인할 수 있는데 이는 JRE 가 1.6버전인 것으로

프로젝트 우클릭 > Properties > project facets 검색 

 

 

Java 버전을 1.8버전으로 바꿔주면 된다.


후후 스프링에 MariaDB, MyBatis까지 연동을 끝냈다!!

JUnit Test까지 초록막대가 나오니 뭔가 큰 산을 넘은 느낌이다 ㅜㅜ 

스프링과 데이터베이스 연동이 끝났으니 이제 본격적으로 쇼핑몰 홈페이지를 구현해야겠다....

흑흑 스프링은 설정이 절반이라고 할 만큼 초기 설정이 매우 복잡하다.

여기까지 잘 따라온 나에게 큰 박수를 쳐주고 싶다...... (짝짝짝)

그러니 내일 점심은 엽떡 로제~~

 

 

<참고 블로그>

mindolsj-dev.tistory.com/9 (한글 깨짐 현상 해결)

developer0513.tistory.com/7?category=793318 (게시판 만들기 + mariaDB)

offbyone.tistory.com/199 (mariaDB 설치)

url.kr/d3skro (스프링과 데이터베이스 연동)

melonpeach.tistory.com/9 (mybatis 연동 junit 테스트)