728x90
반응형

BoardService 컴포넌트 구조

  • 일반적으로 비즈니스 컴포넌트는 네 개의 자바 파일로 구성된다. 
  • 각 자바 파일을 작성하는 순서와 이름 규칙도 어느 정도는 정해져 있는 것이 일반적

 

Vaule Object 클래스

  • VO(Value Object) 클래스는 레이어와 레이어 사이에서 관련된 데이터를 한꺼번에 주고받을 목적으로 사용하는 클래스다.
  • DTO(Data Transfer Obejct)라고 하기도 한다.
  • 데이터 전달을 목적으로 사용하는 객체다.

 

VO 클래스 작성시 DB 테이블 구조

create table users (
  id varchar2(8) primary key,
  password varchar2(8),
  name varchar2(20),
  role varchar2(5)
);
insert into users values ('test','test123','관리자','Admin');
insert into users values ('user1','user1','홍길동','User');
create table board(
  seq number(5) primary key,
  title varchar2(200),
  writer varchar2(20),
  content varchar2(2000),
  regdate date default sysdate,
  cnt number(5) default 0
);
insert into board(seq,title,writer,content) values (1,'가입인사','관리자','잘부탁해요');

 

BOARD 테이블에 포함된 칼럼과 같은 이름의 멤버변수를 private 접근제한자로 선언

선언 후 private 멤버변수에 접근하는 getter/setter  메소드 선언

 

BoardVO.java

package com.springbook.biz.board;

import java.sql.Date;

public class BoardVO {
	private int seq;
	private String title;
	private	String writer;
	private String content;
	private Date regDate;
	private int cnt;
	
	public int getSeq() {
		return seq;
	}
	public void setSeq(int seq) {
		this.seq = seq;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	
	@Override
	public String toString()
	{
		return "BoardVO [seq=" + seq + ", title = " + title + ", writer = " + writer + ", contents" + content + ", regDate = " + regDate + ", cnt" + cnt +"]"; 
	}
}

 

 

 

DAO(Data Access Object) 클래스

  • 데이터베이스 연동을 담당하는 클래스
  • DAO 클래스에는 CRUD(Create, Read, Update, Delete) 기능의 메소드가 구현되어야 한다. 이때 H2 데이터베이스에서 제공하는 JDBC 드라이버가 필요하다.

BoardWeb/pom.xml 파일에 <dependencies> 태그 찾아 추가

<!-- H2 DBMS -->     
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>1.4.196</version>
		</dependency> 

[그림1] 드라이버 내려받기

 

H2 드라이버가 'Maven Dependencies'에 추가된다.

[그림2] H2 드라이버 추가

 

 

JDBC Utility 클래스

  • 모든 DAO 클래스에서 공통으로 사용할 JDBCUtil 클래스를 작성하여 Connection흭득과 해제 작업을 공통으로 처리하도록 한다.

JDVCUtil.java

package com.springbook.biz.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;

public class JDBCUtil {

	public static Connection getConnection() {
		try
		{
			Class.forName("org.h2.Driver");
			return DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test","sa", "");
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}
	
	public static void close(PreparedStatement stmt, Connection conn)
	{
		if(stmt != null)
		{
			try 
			{
				if(!stmt.isClosed()) stmt.close();
			}
			catch(Exception e) 
			{
				e.printStackTrace();
			}
			finally
			{
				stmt = null;
			}
			
		}
		
		if(conn != null)
		{
			try
			{
				if(!conn.isClosed()) conn.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			finally
			{
				conn = null;
			}
		}
		
	}
	
	public static void close(ResultSet rs, PreparedStatement stmt, Connection conn)
	{
		if(rs != null)
		{
			try
			{
				if(!stmt.isClosed()) stmt.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			finally
			{
				stmt = null;
			}
		}
		
		if(stmt != null)
		{
			try
			{
				if(!rs.isClosed()) rs.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			finally
			{
				stmt = null;
			}
		}
		
		if(conn != null)
		{
			try
			{
				if(!conn.isClosed()) conn.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			finally
			{
				conn = null;
			}
		}
		
	}
	

}

 

 

DAO 클래스

  • 앞의 BoardVO 객체를 매개변수와 리턴타입으로 사용하면서 BOARD 테이블과 CRUD 기능을 처리할 BoardDAO 클래스 작성

 

BoardDAO.java

package com.springbook.biz.board.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;


@Repository("boardDAO")
public class BoardDAO {
	
	// JDBC 관련 변수
	private Connection conn = null;
	private PreparedStatement stmt = null;
	private ResultSet rs = null;
	
	// SQL 명령어들
	private final String BOARD_INSERT = "insert into board(seq, title, writer, content) values((select nvl(max(seq), 0)+1from board),?,?,?)";
	private final String BOARD_UPDATE = "update board set title=?,"
			+ "content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET = "select * from board where seq=?";
	private final String BOARD_LIST = "select * from board order by seq desc";
	
	//CRUD 기능의 메소드 구현
	// 글 등록
	
	public void insertBoard(BoardVO vo)
	{
		System.out.println("====> JDBC로 insertBoard() 기능 처리");
		try
		{
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			JDBCUtil.close(stmt, conn);
		}
	}
	
	// 글 수정

	public void updateBoard(BoardVO vo)
	{
		System.out.println("====> JDBC로 updateBoard() 기능 처리");
		try
		{
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_UPDATE);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getContent());
			stmt.setInt(3, vo.getSeq());
			stmt.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			JDBCUtil.close(stmt, conn);
		}
	}
	
	
	// 글 삭제

	public void  deleteBoard(BoardVO vo)
	{
		System.out.println("====> JDBC로 deleteBoard() 기능 처리");
		
		try
		{
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_DELETE);
			stmt.setInt(1, vo.getSeq());
			stmt.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			JDBCUtil.close(stmt, conn);
		}
	}
	
	
	// 글 상세 조회

	public BoardVO getBoard(BoardVO vo)
	{
		System.out.println("====> JDBC로 getBoard() 기능 처리");
		BoardVO board = null;
		try
		{
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_GET);
			stmt.setInt(1, vo.getSeq());
			rs = stmt.executeQuery();
			if(rs.next())
			{
				board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("Title"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			JDBCUtil.close(rs, stmt, conn);
		}
			
		return board;
	}
	
	
	// 글 목록 조회

	public List<BoardVO> getBoardList(BoardVO vo)
	{
		System.out.println("====> JDBC로 getBoardList() 기능 처리");
		List<BoardVO> boardList = new ArrayList<BoardVO>();
		
		try
		{
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_LIST);
			rs = stmt.executeQuery();
			
			while(rs.next())
			{
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("Title"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				boardList.add(board);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			JDBCUtil.close(rs, stmt, conn);
		}
		
		return boardList;
	}
	
}
	

 객체를 스프링 컨테이너가 생성할 수 있도록 클래스 선언부에 @Repository 어노테이션을 설정한다.

 

 

CRUD 기능의 메소드 이름 

기능 메소드 이름
등록 insert테이블명
수정 update테이블명
삭제 delete테이블명
상세 조회 get테이블명(혹은 select테이블명)
목록 검색 get테이블명List(혹은 select테이블명List)

 

 

 

BoardService.java

package com.springbook.biz.board;

import java.util.List;

public interface BoardService {
	
	
	//CRUD 기능의 메소드 구현
	
	// 글 등록
	void insertBoard(BoardVO vo);

	// 글 수정
	void updateBoard(BoardVO vo);

	
	// 글 삭제
	void deleteBoard(BoardVO vo);

	
	// 글 상세 조회
	BoardVO getBoard(BoardVO vo);

	
	// 글 목록 조회
	List<BoardVO> getBoardList(BoardVO vo);

}

 

 

Service 구현 클래스 작성

  • BoardServiceImpl클래스는 BoardService 인터페이스의 모든 추상 메소드를 재정의해 구현해야 한다.
  • 클래스 선언부에 객체 생성을 위한 @Service 
  • 클라이언트 프로그램에서 boardService라는 이름으로 객체를 요청할 수 잇도록 아이디도 설정

BoardServiceImpl.java

package com.springbook.biz.board.impl;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.BoardService;

@Service("boardService")
public class BoardServiceImpl implements BoardService{
	@Autowired
	private BoardDAO boardDAO;
	
	public void insertBoard(BoardVO vo)
	{
		boardDAO.insertBoard(vo);
	}
	
	public void updateBoard(BoardVO vo)
	{
		boardDAO.updateBoard(vo);
	}
	
	public void deleteBoard(BoardVO vo)
	{
		boardDAO.deleteBoard(vo);
	}
	
	public BoardVO getBoard(BoardVO vo)
	{
		return boardDAO.getBoard(vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo)
	{
		return boardDAO.getBoardList(vo);
	}
}

 

 

스프링 설정 파일 수정

  • 작성한 BoardService 컴포넌트를 스프링 기반으로 테스트하려면 스프링 설정 파일 <context:component-scan> 설정을 수정해야 한다.

[그림3] 스프링 설정 파일 수정

스캔의 범위를 com.springbook.biz 패키지로 지정했으므로 BoardServiceImpl 클래스와 BoardDAO 클래스가 스캔 범위에 포함되어 객체가 생성될 것이다.

 

 

BoardServiceClient.java

package com.springbook.biz.board;

import java.util.List;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;


public class BoardServiceClient {
	public static void main(String[] args)
	{
		
		//1. Spring 컨테이너를 구동한다.
		AbstractApplicationContext container = 
				new GenericXmlApplicationContext("applicationContext.xml");
		
		//2. Spring 컨테이너로부터 BoardServiceImpl 객체를 Lookup 한다.
		BoardService boardService = (BoardService) container.getBean("boardService");
		
		
		//3. 글 등록 가능 테스트
		BoardVO vo = new BoardVO();
		vo.setTitle("임시 제목");
		vo.setWriter("이이이");
		vo.setContent("아아아아아아~ 내용...");
		boardService.insertBoard(vo);
		
		
		//4. 글 목록 검색 기능 테스트
		List<BoardVO> boardList = boardService.getBoardList(vo);
		for(BoardVO board : boardList)
		{
			System.out.println("====> " + board.toString());
		}
		
		//5. Spring 컨테이너 종료
		container.close();
	}
}

 

 

실행 결과

[그림4] BoardServiceClient 실행 결과

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기