<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.boo</groupId>
<artifactId>jdbc</artifactId>
<name>P04_jdbc</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>11</java-version>
<org.springframework-version>5.2.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- 오라클 JDBC 드라이버를 가져오기 위해 리포지토리를 추가합니다. -->
<repositories>
<repository>
<id>oracle</id>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<!-- 오라클 JDBC 드라이버 -->
<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>23.2.0.0</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
< books_table.txt >
/
CREATE TABLE books (
code VARCHAR2(20) PRIMARY KEY, -- 도서 코드
name VARCHAR2(100), -- 도서명
price NUMBER, -- 도서가격
maker VARCHAR2(50) -- 출판사
);
/
도서코드, 도서명, 도서 가격, 출판사
public class BooksDTO {
private String code;
private String name;
private int price;
private String maker;
public BooksDTO(){
super();
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
@Override
public String toString() {
return "BooksDTO [code=" + code + ", name=" + name + ", price=" + price + ", maker=" + maker + "]";
}
private static final String driver = "oracle.jdbc.OracleDriver";
private static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
private static final String id = "dbtest";
private static final String pwd = "a1234";
데이터베이스 연결 관리
getConnection():
목적: 데이터베이스와의 연결을 생성하고 반환합니다.
설명:
Class.forName(driver): JDBC 드라이버를 로드합니다. 이는 JDBC API가 데이터베이스와 상호작용할 수 있도록 해줍니다.
DriverManager.getConnection(url, id, pwd): 데이터베이스에 연결을 생성합니다. 연결을 성공적으로 생성하면 Connection 객체를 반환합니다. 이 객체를 통해 SQL 쿼리를 실행할 수 있습니다.
예외 처리: 연결 과정에서 문제가 발생할 수 있으므로 예외를 처리하여 에러 메시지를 출력합니다.
2. 리소스 해제 및 관리
close(ResultSet rs, PreparedStatement pstmt, Connection con):
목적: 사용한 데이터베이스 리소스(결과 집합, 준비된 명령문, 연결)를 안전하게 해제합니다.
설명:
if(rs != null) rs.close(): ResultSet이 null이 아닐 경우, 사용 후 닫습니다. 이렇게 함으로써 메모리 누수를 방지할 수 있습니다.
if(pstmt != null) pstmt.close(): PreparedStatement를 닫아 리소스를 해제합니다.
if(con != null) con.close(): Connection을 닫아 데이터베이스와의 연결을 종료합니다. 연결이 너무 많으면 데이터베이스가 과부하 상태가 될 수 있기 때문에 반드시 연결을 닫아야 합니다.
예외 처리: 리소스를 해제하는 과정에서도 오류가 발생할 수 있으므로 예외를 처리하여 에러 메시지를 출력합니다.
public static Connection getConnection() {
Connection con = null;
try {
Class.forName(driver);
con= DriverManager.getConnection(url, id ,pwd);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC 관련 변수
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
SQL 명령어
private final String BOOKS_INSERT = "insert into books values(?, ?, ?, ?)";
insert(도서 등록) 만들기
public int insertBooks(BooksDTO dto) {
int su = 0;
try {
con = JDBCUtil.getConnection();
pstmt = con.prepareStatement(BOOKS_INSERT);
pstmt.setString(1, dto.getCode());
pstmt.setString(2, dto.getName());
pstmt.setInt(3, dto.getPrice());
pstmt.setString(4, dto.getMaker());
su = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, pstmt, con);
}
return su;
}
int insertBooks(BooksDTO dto);
int: 메서드가 반환하는 데이터 타입. 삽입 성공 여부를 나타내는 정수값입니다.
insertBooks: 메서드 이름.
(BooksDTO dto): 메서드가 하나의 매개변수를 받습니다. BooksDTO 객체는 도서의 정보를 담고 있는 데이터 전송 객체(DTO)입니다.
@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
private BooksDAO booksDAO;
@Override
public int insertBooks(BooksDTO dto) {
return booksDAO.insertBooks(dto);
}
}
@Service 애너테이션:
@Service("bookService"): 이 애너테이션은 Spring이 이 클래스를 서비스 컴포넌트로 인식하도록 합니다. bookService라는 이름으로 이 서비스의 빈(Bean)을 등록하게 됩니다. 이 이름은 다른 컴포넌트에서 이 서비스를 주입받을 때 사용할 수 있습니다.
@Autowired 애너테이션:
@Autowired: Spring의 의존성 주입 기능을 사용하여 BooksDAO 객체를 자동으로 주입합니다. BooksDAO는 데이터베이스와의 상호작용을 처리하는 DAO 클래스입니다. Spring은 BooksDAO 타입의 빈을 찾아서 이 필드에 주입합니다.
의존성 주입을 통해, 클래스 간의 결합도를 낮추고 코드의 테스트 용이성을 높입니다.
insertBooks 메서드:
@Override: 인터페이스에서 정의된 메서드를 구현한다는 것을 나타냅니다.
public int insertBooks(BooksDTO dto): 이 메서드는 BooksDTO 객체를 매개변수로 받아, BooksDAO의 insertBooks 메서드를 호출하여 도서 정보를 데이터베이스에 삽입합니다.
return booksDAO.insertBooks(dto);: booksDAO의 insertBooks 메서드 호출 결과를 반환합니다. 이 결과는 데이터베이스에 성공적으로 삽입된 레코드 수를 나타냅니다.
public static void main(String[] args) {
GenericXmlApplicationContext context =
new GenericXmlApplicationContext("applicationContext.xml");
BookService bookService = context.getBean("bookService", BookService.class);
BooksDTO dto = new BooksDTO();
Scanner scanner = new Scanner(System.in);
// - 도서 등록 --//
System.out.println("--- 도서 정보 등록 ---");
System.out.print("도서번호 >> ");
dto.setCode(scanner.nextLine());
System.out.print("도서명 >> ");
dto.setName(scanner.nextLine());
System.out.print("도서가격 >> ");
dto.setPrice(scanner.nextInt());
scanner.nextLine();
System.out.print("출판사 >> ");
dto.setMaker(scanner.nextLine());
int su = bookService.insertBooks(dto);
if(su > 0)
System.out.println("도서등록 성공!");
else
System.out.println("도서등록 실패~");
}
}
applicationContext.xml 파일을 사용하여 Spring 컨텍스트를 초기화합니다. 이 파일은 Spring의 설정을 포함하고 있으며, 빈(Bean)들을 정의합니다.
Spring 컨텍스트에서 bookService라는 이름의 빈을 가져옵니다. 이 빈은 도서 정보를 등록하는 서비스 클래스입니다.
도서 정보를 담기 위한 DTO(Data Transfer Object) 인스턴스를 생성합니다.
bookService의 insertBooks 메서드를 호출하여 입력된 도서 정보를 데이터베이스에 등록합니다. 반환된 값은 삽입 작업의 성공 여부를 나타냅니다.