ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) DataSource 이용한 데이터베이스 (db, oracle) 연동 예제
    Spring/컨셉 2018. 9. 6. 11:17

    스프링 통해 mvc 데이터베이스 연동 예제

    스프링에서 데이터베이스 연동을 위해 필수적인 Dependency 2가지를 pom.xml에 추가하는 것이 필요하다. 

    ※ 프로젝트는 STS를 통해 작성되었고, MVC 패턴에 대해 숙지하고 있음을 전제로 작성했습니다.

    - pom.xml 파일의 Dependencies 탭으로 이동해 Add 버튼 클릭

    commons-dbcp 입력 후 하위요소 중 1.4[jar] 선택 후 OK

    Oracle의 경우 Maven 지원을 해주지 않기 때문에 개인 util과 같은 방법으로 등록해야 한다. jcbc.jar 파일이 필요하므로 등록 절차 포스팅

    1) jdbc 파일을 일정 경로에 둔다. 필자는 c폴더로 지정

    프로젝트 마우스 오른쪽 버튼 - Run As - Maven build... 클릭

    Goals에 경로, groupId, artifactId 등 파일 정보를 넣는다.

    install:install-file -Dfile=c:\ojdbc6.jar -DgroupId=com.oracle.ojdbc -DartifactId=ojdbc6 -Dversion=6.0 -Dpackaging=jar

    ※ Dfile, version 등은 경로, jdbc 버전에 맞춰 작성 할 것!

    콘솔창에 BUILD SUCCESS 보이면 성공, 실패는 오타일 확률이 높으므로 복사해서 붙여쓰기를 권장.

    pom.xml에 다음과 같이 dependency 정보 등록. 

    Maven Dependencies 에 jdbc 파일 등록 확인

    다음과 같이 boardVO 관련 정보를 지정하기 위한 bean Configuration File boardContext.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"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<!-- service, biz, dao에 대한 것 만든다. Controller는 applicationContext.xml에 등록 -->
    	
    	<bean id="boardDaoImpl"
    			class="com.blog.naver.board.dao.BoardDaoImpl">
    		<!-- 다른 Context에 있는 bean 사용 가능함! -->
    		<property name="dataSource" ref="dataSource" />		
    	</bean>
    	
    	<bean id="boardBizImpl"
    			class="com.blog.naver.board.biz.BoardBizImpl">
    		<property name="boardDao" ref="boardDaoImpl" />
    	</bean>
    
    	<bean id="boardServiceImpl"
    			class="com.blog.naver.board.service.BoardServiceImpl">
    		<property name="boardBiz" ref="boardBizImpl"/>
    	</bean>
    </beans>
    

    ootContext 만들어 데이터베이스 설정을 위한 Bean들을 따로 관리한다.
     rootContext 파일명으로 갖는 Spring Bean Configuration File 생성 후 DaoImpl 코드에서 Connection을 대체할 Bean 생성한다.



    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    	<!-- rootContext 만들어 데이터베이스 설정을 위한 Bean들 등록 -->
    	
    	<!-- Connection을 대체할 Bean 생성 -->
    	<bean id="dataSource"
    			class="org.apache.commons.dbcp.BasicDataSource">
    		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    		<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
    		<property name="username" value="BOARD_2" />
    		<property name="password" value="1234" />
    	</bean>
    
    </beans>

    rootContext.xml
    BasicDataSource 클래스와 property 태그 이용해 데이터베이스 접속이 가능하다. 
    Class.forName() 등의 메소드를 사용하지 않아도 되는 것이다.

    다음과 같은 BOARD_2 스키마에 접속할 수 있도록 해보자.

    1. MVC 모델에서 Model 하나당 Bean Configuration File (이하 Context 파일) 하나 만들어 관리한다.
    Context 파일 관리하는 폴더 마우스 오른쪽 - New - Spring Bean Configuration File 클릭

    2. 파일명 정한 후 Finish 

    3. web.xml에 다른 Context 파일들 등록시키도록 한다. /web-app 태그 위에 Ctrl + space 클릭 후 맨 아래 위치한 contextloaderlistener 찾아 클릭

    4. param-value 태그에 Context 파일의 경로 지정
    *Context.xml로 지정해 모든 Context 파일들을 관리하도록 한다.
    이렇게 하면 이후 등록될 Model(VO)에 대해서 따로 등록할 필요가 없다. 이전 서블릿을 사용할 때보다 훨씬 간편해졌음을 느낄 수 있었다.

    이후 코드 작성. mvc 패턴대로 작성하면 된다. 다른 점은 Dao의 경우 private 멤버로 DataSource 객체가 있고, 생성자가 아닌 Setter를 통해 멤버 변수 초기화를 해준다는 점이다.







    package com.blog.naver.board.vo;
    
    public class BoardVO {
    	
    	private int boardId;
    	private String subject;
    	private String content;
    	private String writer;
    	private int likeCount;
    	private String writeDate;
    	private String ip;
    	
    	
    	public int getBoardId() {
    		return boardId;
    	}
    	public void setBoardId(int boardId) {
    		this.boardId = boardId;
    	}
    	public String getSubject() {
    		return subject;
    	}
    	public void setSubject(String subject) {
    		this.subject = subject;
    	}
    	public String getContent() {
    		return content;
    	}
    	public void setContent(String content) {
    		this.content = content;
    	}
    	public String getWriter() {
    		return writer;
    	}
    	public void setWriter(String writer) {
    		this.writer = writer;
    	}
    	public int getLikeCount() {
    		return likeCount;
    	}
    	public void setLikeCount(int likeCount) {
    		this.likeCount = likeCount;
    	}
    	public String getWriteDate() {
    		return writeDate;
    	}
    	public void setWriteDate(String writeDate) {
    		this.writeDate = writeDate;
    	}
    	public String getIp() {
    		return ip;
    	}
    	public void setIp(String ip) {
    		this.ip = ip;
    	}
    	
    }
    

     BoardVO

    package com.blog.naver.board.dao;
    
    import javax.sql.DataSource;
    
    public class BoardDaoImpl implements BoardDao{
    
    	private DataSource dataSource;
    	
    	public void setDataSource(DataSource dataSource) {
    		this.dataSource = dataSource;
    	}
    
    	@Override
    	public String test() {
    		return dataSource + "  dao"; // dataSource null인지도 확인
    	}
    }
    
    

     BoardDaoImpl

    package com.blog.naver.board.biz;
    
    import com.blog.naver.board.dao.BoardDao;
    
    public class BoardBizImpl implements BoardBiz{
    	private BoardDao boardDao;
    
    	public void setBoardDao(BoardDao boardDao) {
    		this.boardDao = boardDao;
    	}
    
    	@Override
    	public String test() {
    		return boardDao.test() + " biz";
    	}
    	
    }
    
    

     BoardBizImpl

    package com.blog.naver.board.service;
    
    import com.blog.naver.board.biz.BoardBiz;
    
    public class BoardServiceImpl implements BoardService{
    
    	private BoardBiz boardBiz;
    	
    	public void setBoardBiz(BoardBiz boardBiz) {
    		this.boardBiz = boardBiz;
    	}
    
    	@Override
    	public String test() {
    		return boardBiz.test() + "  service";
    	}
    }
    
    

     BoardServiceImpl

    package com.blog.naver.board.web;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.blog.naver.board.service.BoardService;
    
    @Controller
    public class BoardController {
    	
    	private BoardService boardService;
    	
    	public void setBoardService(BoardService boardService) {
    		this.boardService = boardService;
    	}
    	
    	@RequestMapping("/board")
    	public String test(){
    		String test = boardService.test();
    		System.out.println(test);
    		return "11";
    	}
    	
    }
    
    

     BoardController

    인터페이스들은 생략

    프로젝트명/board url로 접근하면 console창에 다음과 같이 dao, biz, service 패키지에 접근했음을 확인할 수 있다.




Designed by Tistory.