이제 Spring Framwork에 MyBatis 를 추가하여 저번에 만들어 둔 Oracle 을 연동할 시간이다.
순서
1. 스프링 프레임워크 프로젝트 생성
2. 스프링 프레임워크 MyBatis 연동
3. Postman 을 통해 테스트API를 JSON 타입으로 호출
선행 작업
- Oracle DB생성
pom.xml 파일을 열고 아래 의존성을 추가해준다.
<!-- 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.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>
<!-- Oracle -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
아마 넣고나면 에러가 날텐데, dependencies 위에 properties 와 repositories 를 추가해주면 된다. properties 의 경우 현재 프로젝트에서 사용할 라이브러리 정보를 명시해 주는 것이고,
repositories 의 경우 ojdbc가 Maven에서 제공하지 않기 때문에 따로 추가해준 것이다. 아래 repository를 추가해주면 Maven이 해당 레퍼지토리를 참고하여 ojdbc를 다운받는다.
<!-- 현재 프로젝트에서 사용할 라이브러리 정보 -->
<properties>
<!-- 자바 버전 -->
<java-version>11</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>4.3.18.RELEASE</org.springframework-version>
</properties>
<repositories>
<!-- ojdbc 다운받기위해 추가 -->
<repository>
<id>oracle</id>
<name>ORACLE JDBC Repository</name>
<url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
</repository>
</repositories>
이제 MyBatis 관련 설정을 하기 위해 src/main/resources
안에 mybatis-config.xml 파일을 생성한다. 이 때는 spring xml 이 아니라 file을 누르고 .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>
혹시 뒤에 링크에서 빨간줄로 에러가 나면 링크에 마우스 가져가서 Fetch external resource 클릭하면 에러가 사라진다. 참고
이제 Oracle DB와 연동하기 위해 root-context.xml 파일의 beans 태그 안에 아래 내용을 추가한다.
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property value="oracle.jdbc.driver.OracleDriver" name="driverClassName" />
<!-- 오라클 경로 -->
<property value="jdbc:oracle:thin:@140.xx.xxx.xxx:1521:xe" name="url" />
<!-- 오라클 사용자 이름 -->
<property value="user" name="username" />
<!-- 오라클 사용자 비밀번호 -->
<property value="pw" 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:/mapper/*Mapper.xml" name="mapperLocations" />
</bean>
<mybatis-spring:scan base-package="com.podhong.podhong.mapper" />
mybatis-spring:scan
의 base-package 같은 경우 자신의 mapper 를 담을 패키지의 경로를 설정해주면 된다. 저거를 수기로 입력하면 beans의 namespace가 자동으로 입력되는데, 복붙은 자동으로 입력되지 않아 수기로 추가해주었다. beans 태그 안에 아래 내용을 추가해준다. xsi:schemaLocation은 맨 뒤에 mybatis 가 씌여있는 경로만 추가해주면 된다.
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd""
이제 기본 설정은 완료되었고, MVC 모델에 맞게 프로젝트 내부를 구성하면 된다. 우선 바로 위에 base-package 에서 설정한 경로에 Mapper.java 인터페이스를 생성한다.
mapper 폴더 우클릭 > New > Java Class 클릭
Interface 클릭 > 이름 설정 후 엔터
이렇게 하면 Mapper 인터페이스 파일이 생성된다. 이제 Mapper.xml 파일을 생성할 차례이다.
src/main/resources
폴더 안에 mapper 폴더를 생성하고 그 안에 SampleMapper.xml 파일을 생성한다. 나중에 이 Mapper.xml 파일에 SQL 문을 작성할 것이다.
Mapper.xml 파일을 생성했으면 파일 안에 아래 내용을 작성해준다. 이 때 namespace 내용은 위에서 생성한 Mapper 인터페이스 경로를 넣어줘야된다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.podhong.podhong.mapper.SampleMapper">
</mapper>
혹시 위에 내용을 넣었을 때 ibatis 링크 부분에서 에러가 나면 pom.xml 에서 mybatis 버전을 아래 버전으로 변경하고
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version> <!-- 사용 중인 MyBatis의 최신 버전 -->
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
그 후 다시 mapper.xml 파일로 돌아와서 doctype을 아래 내용으로 바꾸면 실행 될 것이다.
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
필자도 처음엔 에러가 나고 실행도 되지 않아서 위의 내용으로 변경했다.
mapper 까지 추가됐으니 이제 MVC 모델을 설계할 것이다.
패키지 안에 service, service.sample, service.sample.impl, domain 패키지를 추가로 생성해준다. 폴더는 프로젝트 틀에 맞게 생성하면 된다.
패키지를 생성했으면 각 폴더 내에 아래 파일들을 하나씩 만들어준다.
일단 SampleServiceImpl 에다가 SampleService 인터페이스를 구현한다는 내용을 추가해준다.
package com.podhong.podhong.service.sample.impl;
import com.podhong.podhong.service.sample.SampleService;
public class SampleServiceImpl implements SampleService {
}
이제 Oracle DB 로 가서 VO에 작성할 샘플 테이블과 데이터를 넣어둘 것이다. DBeaver로 들어가서 연결한 Oracle 서버에 테이블을 하나 생성했다.
이제 아래 컬럼 내용들을 VO 에 작성해준다. 그 전에 롬복을 설치할건데 롬복은 간단하게 어노테이션만으로 생성자 코드 등의 소스를 생략하게 해준다. 인텔리제이의 경우 2020.03 이후 버전에서는 롬복이 기본 플러그인으로 설치되어있어 pom.xml 에 의존성만 추가해주면 된다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
의존성을 추가해주고 pom reload 까지 완료했으면 VO 파일에 아래 내용을 넣는다.
package com.podhong.podhong.domain;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.Date;
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class SampleVO {
String SAMPLE_NO;
String SAMPLE_DESC;
Date INSERT_DATE;
}
이제 SampleMapper.xml 파일로 가서 간단한 SQL 문을 작성해준다.
<select id="samplesql" resultType="com.podhong.podhong.domain.SampleVO">
SELECT
SAMPLE_NO
, SAMPLE_DESC
FROM TSAMPLE
</select>
BoardMapper.xml 파일에 위의 내용을 작성하자.끝에 세미콜론(;)은 넣으면 안된다.
id는 해당 SQL문을 호출하기 위한 이름이고 resultType은 결과값을 받을 타입을 지정한 것이다.
자세한 내용은 다음에 다루겠다..
이제 Mapper.xml 과 연결되어있는 SampleMapper.java 인터페이스 파일로 이동해서 메서드를 넣어주었다.
public List<SampleVO> samplesql();
SampleService 인터페이스에도 위와 동일하게 넣었고, 구현체인 SampleServiceImpl.java 파일에 아래 내용을 작성해주었다. 사실 인터페이스에는 동일한 이름을 꼭 넣어야되는건 아니지만, 편의상 그냥 넣었다.
package com.podhong.podhong.service.sample.impl;
import com.podhong.podhong.domain.SampleVO;
import com.podhong.podhong.mapper.SampleMapper;
import com.podhong.podhong.service.sample.SampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class SampleServiceImpl implements SampleService {
@Autowired
private SampleMapper sampleMapper;
@Override
public List<SampleVO> samplesql(){
return sampleMapper.samplesql();
}
}
어노테이션에 대한 설명은 나중에.. 이것저것 시리즈에서 해야겠다. 지금 하기엔 너무 많다.
근데 일단 문제는 그게 아니라
흠...
지선생님한테 물어봐서 해결했다. SampleMapper.java 인터페이스 파일에 @Mapper
어노테이션을 추가해주자.
이러면 에러까지 사라졌다. 이제 거의 다 왔다!
다음 포스트에서 이제 Controller 에서 값 json 형태로 값을 보내고 받는 작업을 하고, 그거를 postman 에서 실행해보는 것까지 할 것이다.