본문 바로가기
ETC/Spring

Spring과 Oracle 연동하기

by Gnaseel 2019. 11. 25.
728x90
반응형

Spring Oracle 연동

목표

  • mybatis를 사용해서 spring과 oracle을 연동
  • 필수적인 코드만 사용하고, 새로운 폴더나 파일의 생성을 최소화해서 이해하기 쉽게함
  • 전체적인 흐름이 어떻게 흘러가는지 파악할 수 있게 설명함

1. 라이브러리 의존성 추가(maven의 pom.xml)

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>

<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>12.1.0.1-atlassian-hosted</version>
</dependency>

우선 우리가 해야 할 일은 spring에서 oracle, mybatis를 사용하기 위해 라이브러리를 다운로드받고 관리하는 것이다.

그러기 위해서는 위와같이 pom.xml에 몇가지 라이브러리를 추가해야한다.

pom.xml

<repositories>
  <!-- 오라클 JDBC라이브러리 관리 사이트 -->
 		<repository>
			<id>Spring Plugins</id>
			<url>http://repo.spring.io/plugins-release/</url>
		</repository>
</repositories>

하지만 ojdbc같은 경우는 저작권 문제로 maven에서 직접 지원하지 않는 라이브러리이기 때문에
라이브러리 정보가 담겨있는 repository를 추가해야 한다.
<dependencies> 위에 적당히 적어주면 된다.

혹시 위 내용이 이해가 가지 않는다면 라이브러리 의존성에 대해서 공부하고 오자.

 

참고로 ojdbc같은 경우는 항상 추가할때마다 느끼는거지만 상당히 저장소가 불안정하므로

그냥 단순하게 직접 다운받아 넣는것도 괜찮은 방법이다.

 

방금 우리는 spring에서 mybatis를 사용해 oracle을 제어 할 모든 라이브러리를 추가했다.
이제부터는 그 라이브러리를 실제로 사용해보자.

2. root-context에 데이터소스, sql팩토리 추가

root-context.xml

    <bean>
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        id="dataSource">
        <property value="oracle.jdbc.driver.OracleDriver"
            name="driverClassName" />
        <property value="jdbc:oracle:thin:@localhost:1521:orcl"
            name="url" />
        <property value="당신의이름" name="username" />
        <property value="당신의비밀번호" name="password" />
    </bean>


    <bean class="org.mybatis.spring.SqlSessionFactoryBean"
        id="SqlSessionFactory">
        <property name="dataSource" ref="dataSource" />
        <!-- classpath: 위치에 mybatis-config파일을 만들어줘야함 -->
        <property value="classpath:mybatis-config.xml"
            name="configLocation" />
        <!-- classpath: 위치에 Mapper파일을 만들어줘야함 -->
        <property value="classpath:/mapper/*Mapper.xml"
            name="mapperLocations" />
    </bean>

    <!-- 이 부분에서 에러가 발생하는건 정상임 -->
    <mybatis-spring:scan base-package="com.sp.ex.mapper(당신의 mapper자바 폴더 위치_폴더를 지금 만드시면 됩니다.)"/>

이제 우리는 root-context에 내용을 추가해야 한다.
root-context는 모든 컨텍스트에서 사용되는 공통 bean을 정의하는 장소인데
통상적인 경우 Service layer와 Service layer가 DB에 접근하는 repository layer부분에서 사용되는 bean을 정의한다.
우선 코드의 내용이 이해가 안된다면 spring bean이라는 키워드로 검색하면 원하는 결과를 얻을 수 있을 것이다.

  • 첫번째 빈
    dataSource는 스프링이 아닌 일반 웹 프로젝트에서 커넥션 연결을 해본 사람이라면 이해가 쉬울것이다.
    Connection con = DriverManager.getConnection(~~~~);

db에 접근할 때 항상 만들던 저 코드의 역할을 bean으로 대채하는 것이다.
혹시 이 부분이 이해가 어렵다면 우선 spring을 사용하지 않고, java와 oracle을 연동하는 쉬운 예제들을 보며 공부하는게 이해하기 더 쉬울수도 있다.
물론 이해하지 않고 코드를 복사해서 사용해도 작동하지만, 어차피 이해해야 하는 내용이다.

  • 두번째 빈
    아래 SqlSessionFactory는 dataSource를 직접 다룰 맵퍼에 대해 경로를 지정하는 역할을 한다.
    기본적으로 src/main/resources위치에서 classpath: 뒤에 붙은 경로를 합쳐 찾는다.
    예를들어 저 mybatis-config.xml파일은 src/main/resources/mybatis-config.xml에 위치한다. 물론 지금 만들어야 한다.

    mybatis-config.xml - src/main/resources

<?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/*Mapper.xml파일은 src/main/resources/mapper폴더 안에서 Mapper.xml로 끝나는 파일을 가리킨다.

* 기호는 Mapper.xml파일 앞에 어떤 이름이 붙어도 Mapper.xml이라고 가정한다는 뜻이다.
즉 ABCMapper.xml도 QWERMapper.xml도 다 *Mapper.xml에 포함되는 것이다.

    <mybatis-spring:scan base-package="com.sp.ex.mapper" />

이 부분은 에러가 나는게 당연하다.
namespace를 추가하지 않았기 때문이다.
하단 namespace 탭에 들어가서 mybatis-spring을 추가해준다.
base-package에는 맵퍼 자바파일이 위치한 경로를 써주면 된다.

우리는 이제 사용할 라이브러리를 모두 등록했고, DB에 연결될 커넥션과 mapper에 대한 bean 생성을 마쳤다.
다음 챕터에서는 실제로 mapper를 구현하고, 간단한 dao, dto를 만들어 실험할 것이다.

3. DTO, DAO 제작

DAO나 DTO에 대한 기본적인 이해가 있다는 가정 하에 기술하겠다.
DTO는 적당히 멤버변수 만들고 게터세터 달아주자.
라고 넘기려 했는데 역시 코드를 쓰는게 실습 편의상 좋을 것 같아서 첨부한다.

MemberDTO.java

public class MemberDTO {
    private String id;
    private String name;
    private String password;
    public MemberDTO() {
    }
    public MemberDTO(String id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

간단한 DAO

MemberDAO.java

@Component
public class MemberDAO {

    @Autowired
    private SqlSession session;


    public void memberInsert(MemberDTO member) {
         session.insert("com.sp.ex.mapper.MemberMapper.insertMember",member);
    }
}

우선 @Component나 @Autowired가 무엇인지 모르겠는 경우 spring annotation이라는 키워드로 검색한다면 원하는 결과를 찾을 수 있을 것이다.
바로 넘어갈 수 있게 한마디로 정의한다면 @Component는 이 클래스를 bean으로 관리하겠다는 의미고, @Autowired는 의존성 주입이라고 생각하면 된다.
의존성 주입이 무엇인지 모르겠는경우 factory method pattern이라는 키워드가 이해하는데 큰 도움이 될것이다.

session.insert의 첫번 째 매개변수는 mapper자바파일의 위치와 (아직 안만듦) 그 메소드를 작성해주면 되고, 두번 째 매개변수는 DTO를 넘기면 된다.

4. 맵퍼 제작

간단한 맵퍼를 만들어보자.

MemberMapper.java

public interface MemberMapper {
    public List<MemberDTO> viewAll();
    public void insertMember(MemberDTO dto);
}

아까 봤던 정겨운 insertMember가 바로 여기있다.
정의는 xml에 가서 해보자.

MemberMapper.xml - src/main/resources

<?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.sp.ex.mapper.MemberMapper">

    <select id="viewAll" resultType="com.sp.ex.dto.MemberDTO">
        SELECT * FROM userlist
    </select>

    <insert id="insertMember" parameterType="com.sp.ex.dto.MemberDTO">
        Insert into userlist(name, id,password) values(#{id}, #{name}, #{password})
    </insert>
</mapper>

namespace 뒷부분에 너의 맵퍼java파일이 들어간 경로를 알려줘야 맵핑을 할 수 있다.
이 부분은 이해가 힘들만한 부분이 없다.
para 타입이나 result 타입만 자기가 만든 DTO의 경로의 위치를 찾아 잘 맵핑 해 주자.

물론 오라클 DB를 사용해서 userlist라는 테이블을 만들고, 속성으로 id, name, password를 추가해주자.

5. 컨트롤러 제작

MainController.java

@Controller
@RequestMapping("/Main")
public class MainController {

    @Autowired
    private MemberMapper mapper;

    @RequestMapping("test")
    public String test(Model model) {
       //예시
        return "member/test123";
    }

    @RequestMapping("insertMember")
    public String insertMember(@RequestParam("id")String id, @RequestParam("name")String name, @RequestParam("pw")String pw) {
        System.out.println("Insert! id = "+id );
        mapper.insertMember(new MemberDTO(id, name, pw));
        return "member/test";
    }

    @RequestMapping("home")
    public String main() {
        return "home";
    }
}

/Main으로 입력받은 명령은 다 여기로온다.
메소드들은 디렉토리 이름에 따라 실행된다.
즉 local~~/Main/test라는 url에 접속하면
src/main/~~views/member/test123에 연결되고
local~~/Main/home라는 url에 접속하면
src/main/~~views/home에 연결되는 것이다.

6. 간단하게 뷰 만들고 테스트

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
asdfasdf
아무내용이나 쓰셔도 됩니당
</body>
</html>

기존 스프링 메인화면 url뒤에 /Main/insertMember와 쿼리문을 붙여주면 된다.

http://localhost:805/ex/Main/insertMember?id=abc&name=myname&pw=12345

예를들어 나같은 경우는 저렇게 쓰면 작동한다.

이제 오라클 DB를 켜서 잘 작동 되었는지 확인하면 된다.

반응형