Spring Framework(4) DB연결

으누·2024년 10월 22일

Spring , DB 연결 사용

pom.xml

<?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>

오라클 JDBC 드라이버 pom.xml 등록

SQL TABLE 생성

< books_table.txt >

/
CREATE TABLE books (
code VARCHAR2(20) PRIMARY KEY, -- 도서 코드
name VARCHAR2(100), -- 도서명
price NUMBER, -- 도서가격
maker VARCHAR2(50) -- 출판사
);
/

1. DTO 생성

도서코드, 도서명, 도서 가격, 출판사

public class BooksDTO {

	private String code;
	private String name;
	private int price;
	private String maker;

메서드 객체를 생성

public BooksDTO(){
super();
}

get set 설정

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;
	}

toString 설정

	@Override
	public String toString() {
		return "BooksDTO [code=" + code + ", name=" + name + ", price=" + price + ", maker=" + maker + "]";
	}
	

JDBCUtil 페이지를 만들어 오라클 DB 계정 생성

	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();
		}
}
}

DAO 생성하기

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)입니다.

IMPL 페이지 만들기

@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 메서드 호출 결과를 반환합니다. 이 결과는 데이터베이스에 성공적으로 삽입된 레코드 수를 나타냅니다.

Main 출력

	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 메서드를 호출하여 입력된 도서 정보를 데이터베이스에 등록합니다. 반환된 값은 삽입 작업의 성공 여부를 나타냅니다.

profile
코딩 일기장

0개의 댓글