Posted by 세상을 살아가는 사람
,

채규태 지음 스프링 퀵 스타트는 H2 데이터베이스를 사용하고 있다.

나는 오라클 데이터베이스를 사용하여 실습을 진행하고자 한다.

이를 위해 변경사항을 정리해 본다.

1. 데이터베이스 테이블 스페이스 및 사용자 생성

- 사전 전제조건 : Oracle 데이터베이스 19c가 설치되어 있다. SQL developer에서 dba로 접속하여 다음과 SQL 작업을 한다.

- 테이블 스페이스 생성

  + 오라클 데이터베이스가 D:\oraclexe에 설치되어 oradata\ORCL 밑에 테이블 스페이스를 위한 dbf 파일을 생성한다.

create tablespace quickts
datafile 'D:\oraclexe\oradata\ORCL\quickts.dbf' size 100M
autoextend on next 5M;

- 사용자 생성 및 권한 부여

  + username : quick, password : quick

  + quick에게 일반 개발자 권한을 부여한다.

alter session set "_ORACLE_SCRIPT"=true;
create user quick identified by quick
default tablespace quickts temporary tablespace temp;

grant connect, resource to quick;  -- 접속, 자원 사용에 대한 권한
alter user quick quota unlimited on quickts; -- 테이블스페이스 사용 권한

commit;

  + quick 계정을 사용하여 sql developer에 접속 (SID = orcl)

 

2. 데이터베이스 테이블 생성

여기서는 Day 01 Class 6 비지니스 컴포넌트 실습 1을 실습하기 위하여 board 테이블을 생성한다. sql developer를 사용하여 사용자 quick로 접속하여 다음 SQL을 수행한다. seq 컬럼은 12c 이후에 추가된 기능을 사용하여 MySQL과 같이 auto_increment 기능을 적용하였다.

create table board (
    seq INTEGER GENERATED AS IDENTITY,
    title VARCHAR(100) not null,
    writer varchar2(50) not null,
    content varchar2(4000) not null,
    regDate date default sysdate,
    cnt integer default 0
);

alter table board add constraint pk_board primary key (seq);

 

3. JDBC 라이브러리를 사용하여 오라클 데이터베이스를 사용하기 위하여 다음과 같이 Connection을 가져온다. 이때 필요한 driver name, URL, username, password를 설정한다.

- JDBC 드라이브 이름 : oracle.jdbc.driver.OracleDriver

- 데이터베이스 URL : jdbc:oracle:thin:@localhost:1521:orcl

- Username : quick

- Password : quick

package com.springbook.biz.common;

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

public class JDBCUtil {
	private static final String DRIVER_NAME = "oracle.jdbc.driver.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String USERNAME = "quick";
	private static final String PASSWORD = "quick";

	public static Connection getConnection() {
		try {
			Class.forName(DRIVER_NAME);
			return DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} 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 (!rs.isClosed())
					rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs = null;
			}
		}
		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;
			}
		}
	}
}

4. BoardDAO.java를 수정

- 게시글 추가를 위한 SQL 문을 수정 : insert into board(title, writer, content) values(?,?,?)

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;

// DAO(Data Access Object)
@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(title, writer, content) values(?,?,?)";
	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"));
				board.setCnt(rs.getInt("CNT"));
				boardList.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(rs, stmt, conn);
		}
		return boardList;
	}
}

5. 테스트 코드의 위치

교재에 있는대로 하면 src/test/java/BoardServiceClient.java가 동작하지 않고, Class Not Found Exception이 발생한다.

따라서 파일을 src/main/java/com.springbook.biz.board 패키지 밑으로 이동하여 실행한다.

게시글이 추가되고, 검색이 됨을 알 수 있다.

sql developer를 사용하여 테이블의 데이터를 확인한다.

Posted by 세상을 살아가는 사람
,

자바를 이용한 스프링 강의를 계속하면서 그동안 변경된 개발 환경과 현재 시점에서 개발환경을 어떻게 설정을 해야 하는지 정리해 본다.
1. JDK 1.8을 사용한 개발 환경
- 처음에는 JDK 1.8을 사용하여 개발을 진행
- 이클립스 : 2020-06-R 버전을 사용하여 JAVA EE을 개발하였고, Eclipse Marketplace를 통해 STS를 설치하여 스프링을 개발하였었다.
- 그랬다가 어느 시점에 이클립스에서 STS plugin을 지원하지 않았다. 그래서 이클립스에서 플러긴을 사용하지 않고, 이클립스 기능을 제공하는 STS를 따로 설치하여 스프링을 개발하였다.
2. 별도의 STS를 사용한 스프링 개발 환경
- JDK 1.8을 지원하기 위하여 STS-3.9.15,RELEASE-e4.16.0을 사용
- 이클립스 버전도 JDK 1.8을 지원하기 위해 e4.16(2020-06-R) 버전인 것이다.
- JSP를 개발하기 위한 JAVA EE IDE도 eclipse-jee-2020-06-R 버전을 사용하였다.
3. JDK 11을 사용한 스프링 개발 환경
- 전자정부표준프레임워크 v4.0에서 JDK 11을 지원하고, 상용으로 JDK 11이 사용되게 되는 것 같다. 따라서 JDK 8을 사용하지 않고, JDK 11을 사용하는 환경을 고려해 본다.
- 자바 버전 : JDK 11.0.15
- 이클립스 : 2021-06-R Java EE IDE
- 이클립스 마켓 플레이스에서 "Spring Tools 3 Add-On for Spring Tools 4 3.9.22.RELEASE" Plugin을 설치하여 스프링 개발환경을 설정한다.
- 이때 pom.xml에서 다음과 같은 에러가 발생하면 다음 plugin 설정을 추가한다.
Description Resource Path Location Type
Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer pom.xml /ex08 line 1 Maven Configuration Problem

            <plugin>
            	<groupId>org.apache.maven.plugins</groupId>
            	<artifactId>maven-war-plugin</artifactId>
            	<version>3.3.1</version>
            </plugin>

- 별도의 STS를 사용하여도 되겠지만, 이클립스를 사용한 JSP 개발환경과의 연속성을 위해 이렇게 설정하는 것도 좋은 방법이다.
4. Spring Tools 4 (aka Spring Tool Suite 4) 4.15.1.RELEASE 설치
이클립스에서 STS plugin으로 . "Spring Tools 3 Add-On for Spring Tools 4 3.9.22.RELEASE"을 설치한 후에, Spring Tools 4 (aka Spring Tool Suite 4) 4.15.1.RELEASE을 설치하면, STS4를 설치할 수 있다.

Posted by 세상을 살아가는 사람
,