[스프링 프레임워크]게시판 만들기 #2 : Spring과 오라클 DB 연동 및 데이터 베이스 셋팅
본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다.
기본적인 프로젝트 세팅에 대한 내용은 지난 포스팅을 참고해주시기 바랍니다.
2021.07.05 - [Spring] - [스프링 프레임워크] 게시판 만들기 #1 : 프로젝트 생성 및 세팅
이번 포스팅은 Oracle을 연동하고 데이터베이스에 게시판 테이블을 생성하는 방법을 설명합니다.
그전에 pom.xml에 대한 간단한 알아보도록 하겠습니다.
지난 포스팅에서 설명드린 Spring Framework에 특징 중 IOC(제어 반전 컨테이너)는 의존성 주입에 대한 부분이었습니다.
의존성 주입이란 한 객체가 다른 객체를 필요로 할 때, 객체들을 xml로 관리하여 객체를 주입해주는 것으로 수정이 필요할 때 xml 파일을 수정하는 것으로 유지보수가 좋은 코드를 만드는 것입니다.
pom.xml에 dependency를 추가하는 것으로 외부 라이브러리를 손쉽게 관리할 수 있습니다. 여기서 프로그램(한 객체)이 라이브러리(다른 객체)를 필요로 한다고 할 수 있겠습니다.
pom.xml에 dependency 추가
Oracle과 연동을 위해 pom.xml에 dependency를 추가합니다.
dependency를 추가하면 자바의 반영을 이용하여 Maven에서 라이브러리를 자동으로 다운로드하게 됩니다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
하단의 ojdbc6은 저작권의 문제로 Maven에서 지원하지 않고 있습니다.
따라서 ojdbc6을 다운로드할 수 있도록 참고할 수 있는 repository를 추가해주도록 합니다.
<properties>
<java-version>1.8</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>
<!-- 오라클 JDBC라이브러리 관리 사이트 -->
<repositories>
<repository>
<id>oracle</id>
<name>Oracle JDBC Repository</name>
<url>http://repo.spring.io/plugins-release/</url>
</repository>
</repositories>
그런데 repository는 URL을 참고하여 가져오는 것이기 때문에 불안정하여 못 들고 오는 경우가 있습니다.(제가 그렇네요)
그럴 경우에는 ojdbc 라이브러리를 직접 추가해주도록 합니다.
Oracle을 위해 sqldeveloper를 다운하였으면 다운로드한 경로에 jdbc/lib 에 가게 되면 jar파일이 있습니다.
또는 직접 다운로드가 필요하신 분들께서는 아래의 블로그를 참고해주세요.
https://fruitdev.tistory.com/89
프로젝트 우클릭 -> Build Path -> Configure Build Path에 들어가서 Add External Jars를 통해 추가해주고
좌측 메뉴에 Deployment Assembly -> Add -> Java Build Path Entries에서도 추가해주도록 합니다.
root-context.xml
Oracle 연동을 위해 계정 정보를 추가하고 Mybatis 사용을 위한 설정을 추가합니다.
root-context.xml의 Namespaces에 다음 항목을 체크하고 코드를 추가합니다.
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property value="oracle.jdbc.driver.OracleDriver" name="driverClassName" />
<property value="jdbc:oracle:thin:@localhost:1521:xe" name="url" />
<!-- 오라클 사용자 이름 -->
<property value="MYSTUDY" name="username" />
<!-- 오라클 사용자 비밀번호 -->
<property value="mystudypw" name="password" />
</bean>
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="SqlSessionFactory">
<property name="dataSource" ref="dataSource" />
<property value="classpath:/mybatis-config.xml" name="configLocation" />
<property value="classpath:/mappers/*Mapper.xml" name="mapperLocations" />
</bean>
<mybatis-spring:scan base-package="com.board.mapper"></mybatis-spring:scan>
src -> main -> webapp -> resources에 다음과 같은 파일을 생성합니다.
- mappers/boardMapper.xml
- mybatis-config.xml
생성한 boardMapper.xml과 mybatis-config.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.board.mappers.board">
</mapper>
mybtis-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>
여기까지 완료했으면 각자의 Tomcat 서버에 올려서 서버를 실행시켜 테스트를 진행하면 됩니다.
발생한 오류
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:mappers/**/Mapper.xml]:
class path resource [mappers/] cannot be resolved to URL because it does not exist
저는 서버에 올려서 실행 도중 이런 오류가 발생했습니다..
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:mappers/**/Mapper.xml]:
class path resource [mappers/] cannot be resolved to URL because it does not exist
root-context.xml에서 mapper.xml과 mybatis-context.xml의 경로를 못 읽어서 발생한 오류입니다.
파일을 생성한 경로가 이상이 없다는 전제하에
root-context.xml의 설정을 classpath*:/ 이렇게도 해보고 /mappers/**/*Mapper.xml 이렇게도 해보고 온갖 경로를 바꿔봤습니다만 계속 Exception이 발생하는 것을 보고 이건 애초에 resoucres까지 경로를 못 읽어온다는 판단을 해
아래와 같이 경로를 수정하였더니 오류가 사라졌습니다. 저처럼 오류가 발생하신 분들은 아래처럼 해보시기 바랍니다.