Java

[Java] 순수 자바 + 순수 JDBC 이용한 CRUD 프로젝트

펭귄코기 2023. 5. 26. 14:52

지금까지 spring 또는 springboot 와 같은 프레임워크 위에서 개발을 하다보니

당연하게 여겨지던것들이 프레임워크 없이 개발을 하려다 보니

이게 왜 필요했는지 없다면 어떻게 해야하고 있다면 어디부분이였는지 와 같은

보이지 않았던 것들이 보이는 기회를 얻는 시간이였고

완성한 내용을 시각적인 자료로 남기고자 글을 적는다

 

1. 사용한 버전 및 환경

- Java 11

- Oracle 19c

- ojdbc8

- gradle

- intelliJ

 

2. 사용한 인터페이스 및 클래스 및 메서드

- Interface Connection

특정 DB의 연결 세션 이다

 

- Interface PreparedStatement

SQL문을 대신 실행시켜주는 기능을 한다

 

- Interface DriverManger

JDBC drivers 모움을 관리하기 위한 서비스이다

 

- Class ResultSet

DB 결과 정보를 담아두는 역할을 한다

 

- Class Member

유저 정보가 담긴 클래스이다

 

- Class Main

동작시킬 메인 클래스이다

 

- Method prepareStatement()

db 접속 정보에 sql문을 담아 동작 준비를 해준다

 

- Method executeQuery()

select 작업을 할때 사용한다, select 된 정보를 리턴 해준다

 

- Method executeUpdate()

insert, update, delete 작업을 할때 사용한다

이때 실행하여 업데이트된 행의 갯수를 int 로 리턴 해준다

 

- Method next()

cursor 밑에 row의 존재 유무를 확인해준다

존재하면 true, 존재하지 않으면 false를 리턴한다

 

- Method selectAll()

모든 유저 정보를 반환해 준다

 

- Method insert()

유저 정보를 저장한다

 

- Method update()

유저 정보를 수정한다

 

- Method delete()

유저 정보를 삭제한다

 

3. 코드

package org.example;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 메인 클래스 입니다
 */
public class Main {

	/**
	 * JDBC 연결 정보 입니다
	 */
	private static final String DB_URL = "jdbc:oracle:thin:@192.168.10.39:1521/ORCL";
	// jdbc:oracle:thin:@192.168.10.39:1521/ORCL
	// jdbc:oracle:thin:@localhost:1521:ORCL
	private static final String DB_USERNAME = "";
	private static final String DB_PASSWORD = "";

	/**
	 * sql 문을 담을 변수입니다
	 */
	private static String sql = "";

	/**
	 * sql 구문을 실행하기 위한 변수 입니다
	 */
	private static PreparedStatement pstmt = null;

	/**
	 * sql 실행 결과를 받아오는 변수 입니다
	 */
	private static ResultSet rs = null;

	/**
	 * 멤버 객체 입니다
	 */
	Member member = new Member();

	/**
	 * 메인 메서드 입니다
	 * @param args 외부로부터 값을 입력 받습니다
	 */
	public static void main(String[] args) {
		try(Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD)) {
			System.out.println("DB 연결 성공");

			Main main = new Main();

			main.insert(conn, "hi", "1234", "한국");
			main.selectAll(conn);
			main.update(conn, "hi", "5555", "미국");
			main.delete(conn, "hi");

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 모든 유저를 불러오는 메서드 입니다
	 * @return 모든 유저 정보
	 */
	private List<Member> selectAll(Connection conn) throws SQLException {

		System.out.println("selectAll 입장 완료");

		sql = "select id, pw, name from member";

		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {

			List<Member> members = new ArrayList<>();

			try(ResultSet rs = pstmt.executeQuery()) {
				while (rs.next() && rs.isClosed() == false) {
					member.setId(rs.getString("id"));
					member.setPw(rs.getString("pw"));
					member.setName(rs.getString("name"));
					members.add(member);
				}
			}

			for(int i = 0; i<members.size(); i++) {
				System.out.println(members.get(i).getName());
			}

			return members;
		}
	}

	/**
	 * 멤버를 생성하는 메서드 입니다
	 * @param conn db 접속정보
	 * @param id 생성할 멤버 id 값
	 * @param pw 생성할 멤버 pw 값
	 * @param name 생성할 멤버 name 값
	 * @throws SQLException 쿼리 예외처리
	 */
	private void insert(Connection conn, String id, String pw, String name) throws SQLException {
		System.out.println("insert 입장 완료");

		sql = "insert into member(id, pw, name) values(?, ?, ?)";

		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			pstmt.setString(3, name);
			pstmt.executeUpdate();
		}

		System.out.println(id + "님이 추가 되었습니다");
	}

	/**
	 * 멤버를 수정하는 메서드 입니다
	 * @param conn db 접속정보
	 * @param id 수정할 멤버 id 값
	 * @param pw 수정할 멤버 pw 값
	 * @param name 수정할 멤버 name 값
	 * @throws SQLException 쿼리 예외처리
	 */
	private void update(Connection conn, String id, String pw, String name) throws SQLException {

		System.out.println("update 입장 완료");

		sql = "update member set id = ?, pw = ?, name = ? where id = ?";

		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			pstmt.setString(3, name);
			pstmt.setString(4, id);
			pstmt.executeUpdate();
		}

		System.out.println(id + "님이 수정 되었습니다");

	}

	/**
	 * 멤버를 삭제하는 메서드 입니다
	 * @param conn db 접속정보
	 * @param id 삭제할 멤버 id 값
	 * @throws SQLException 쿼리 예외처리
	 */
	private void delete(Connection conn, String id) throws SQLException {

		System.out.println("delete 입장 완료");

		sql = "delete from member where id = ?";

		try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setString(1, id);
			pstmt.executeUpdate();
		}

		System.out.println(id + "님이 삭제 되었습니다");

	}

	/**
	 * 멤버 클래스 입니다
	 */
	@Getter
	@Setter
	@NoArgsConstructor
	class Member {
		private String id;
		private String pw;
		private String name;

		public Member(String id, String pw, String name) {
			this.id = id;
			this.pw = pw;
			this.name = name;
		}
	}
}