이번 시간에는 자바와 데이터베이스를 연동하여 사용하는 방법에 대해 정리한다.

참고로 DB는 SQL Develper 를 사용하여 진행하였다.

 

1. 연결할 DB 생성

DB와 연결하기 위해 임시로 작업할 DB와 테이블을 생성하였다.

 

<1. sys 에서 권한 설정>

drop user dev CASCADE;--계정 삭제

--계정 생성
CREATE user dev
IDENTIFIED by "1234"
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;

--계정에 관리자 권한 부여
GRANT DBA TO dev;
 

<2. dev 에서 테이블 생성>

-- 간단한 사용자 정보 저장용 테이블
CREATE TABLE USERTBL
(
    u_id VARCHAR2(20) NOT NULL,
    u_name VARCHAR2(10) NOT NULL,
    u_pass VARCHAR2(20) NOT NULL,
    
    CONSTRAINT ut_pk PRIMARY KEY (u_id)
);

-- 테이블에 데이터 입력
INSERT INTO USERTBL VALUES 
('tester', '홍길동', '1234');
-- 입력, 수정, 삭제 승인
commit;

-- 테이블 데이터 가져오기
SELECT * FROM usertbl;

INSERT INTO USERTBL VALUES ('test01', '고길동', '1234');
 

SQL Developer 에서 작성한 쿼리문이다. 만약 이해가 안된다면 이전에 작성한 DB 정리 포스팅을 보자.

 

2. jdbc(Java Database Connectivity) 설정하기.

자바에서 DB 와 연결하기 위해서는 ojdbc6-11.2.0.3.jar 이라는 파일이 필요하다.

jdbc란 자바에서 데이터베이스에 접속할 수 있도록 지원하는 API(Application Programming Interface) 이다.

 

jdbc를 이클립스에서 설정하는 방법은 아래의 링크를 참고하자.

https://blog.naver.com/jsg910111/221697866013

이미지 썸네일 삭제
쿠키님, 코딩 좀 해주세요..! : 네이버 블로그

이름은 쿠키 종족은 고양이 잘하는 건 골골송. 블로그 너무 어렵다.

blog.naver.com

 

3. DB에 접속하기

설정이 끝났다면 아래의 코드를 작성한다.

package com.dao;

import java.sql.*;

import com.dto.User;

public class Database {	// DAO 클래스
	
	// ojdbc에서 DB 접속에 필요한 드라이버를 생성
	private String driver = "oracle.jdbc.driver.OracleDriver";	
	// 접속 ip 및 포트번호 설정 , sid
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";	
	private String dbuser = "dev";
	private String dbpass = "1234";
	
	//DBMS 처리를 위한 변수
	// 접속용 인스턴스. 드라이버 매니져가 
        // Connection 인터페이스의 참조 인스턴스 생성 후 conn 사용
	private Connection conn;			
	// SQL 쿼리 실행용 쿼리문 실행기	 + SQL 에 데이터를 전송	
	private PreparedStatement pstmt;	
	// select 쿼리 실행 결과 저장
	private ResultSet rs;				
	
	//생성자에서 드라이버를 로드
	public Database() {
		try {
                       // 드라이버 매니져에게 드라이버를 넘겨 줌
			Class.forName(driver);		 
		} catch (ClassNotFoundException e) {
			//e.printStackTrace();
			System.out.println("jdbc driver load fail!");
		}			
	}
        public void getConnection() {
		if(conn == null) {
			try {
				conn = DriverManager.getConnection(url, dbuser, dbpass);
			} catch (SQLException e) {
				//e.printStackTrace();
				System.out.println("Oracle connection fail!");
			}
		}
	}

}
 

위의 Database 클래스의 멤버를 보면 다음과 같다.

1) driver : ojdbc 에서 경로를 참조하여 DB와 접속에 필요한 드라이버를 생성

2) url : DB와 연결을 위한 접속 경로를 설정한다. 아래의 이미지를 참고하자.

.

3) dbuser : 접속할 DB 의 이름이다.

4) dbpass : DB 접속을 위한 패스워드이다.

 

여기까지가 DB 접속에 반드시 필요한 설정을 하는 내용이다. 물론 변수의 이름은 바뀌어도 된다.

하지만 변수에 들어가는 문자열의 경우 자신의 DB 환경에 맞게 설정을 해줘야한다.

 

다음은 접속에 필요한 인스턴스를 생성하는 작업이다.

1) Connection conn : DB와 연결을 담당하는 인스턴스 생성한다..

2) PreparedStatement pstmt : DB에 쿼리문을 전송하거나 쿼리문을 실행할 때 사용된다.

3) ResultSet rs : SELECT 쿼리의 실행 결과를 저장한다.

 

※ 참고로 conn, pstmt, rs 는 인스턴스이다. 하지만 Connection 등은 인터페이스 이다.

하지만 인터페이스에서는 일반적으로 인스턴스 생성이 불가능하다. 하지만 위 코드는 에러가 발생하지 않는다.

그 이유는 Connection 등의 문장이 실행되면 드라이버 매니져가 생성되어 conn 등의 인스턴스 변수와

주소를 공유하기 때문에 사용이 가능한 듯 하다.

 

생성자에서는 Class.forName() 메소드를 통해 드라이브 매니져에게 새로 생성한 드라이브 매니져를

넘겨주는 것을 확인할 수 있다.

 

마지막으로 getConnection() 메소드를 호출하면 설정한 url, dbuser, dbpass 를 통해 DB와 접속할 수 있다.

 

4. 전체 코드 보기

핵심적인 DB 연결 방법을 살펴보았다면 이젠 연결된 DB를 사용할 때이다.

아래의 프로젝트는 단순히 회원가입과 로그인 기능을 구현한 예제이다. 설명은 주석으로 대체한다.

(DB는 1 에서 작성한 테이블을 사용한다.)

 

<DTO Class :: User Class>

DB와 데이터를 주고 받기 위한 저장용 Class 생성

package com.dto;

public class User {
	private String u_id;
	private String u_name;
	private String u_pass;
	
	
	public String getU_id() {
		return u_id;
	}
	public void setU_id(String u_id) {
		this.u_id = u_id;
	}
	public String getU_name() {
		return u_name;
	}
	public void setU_name(String u_name) {
		this.u_name = u_name;
	}
	public String getU_pass() {
		return u_pass;
	}
	public void setU_pass(String u_pass) {
		this.u_pass = u_pass;
	}
}
 

<DAO Class :: Database Class>

DB와 데이터를 주고 받기 위해 필요한 작업을 처리.

package com.dao;

import java.sql.*;
import com.dto.User;
public class Database {	// DAO 클래스
	
	// ojdbc 
	private String driver = "oracle.jdbc.driver.OracleDriver";	
	// 접속 ip 및 포트번호 설정 , sid
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";	
	private String dbuser = "dev";
	private String dbpass = "1234";
	
	//DBMS 처리를 위한 변수
	// 접속용 인스턴스. 드라이버 매니져가 Connection 인터페이스의 참조 인스턴스 생성 후 conn 사용
	private Connection conn;			
	// SQL 쿼리 실행용 쿼리문 실행기	 + SQL 에 데이터를 전송	
	private PreparedStatement pstmt;	
	// select 쿼리 실행 결과 저장
	private ResultSet rs;				
	
	//생성자에서 드라이버를 로드
	public Database() {
		try {
			Class.forName(driver);		// 드라이버 매니져에게 드라이버를 넘겨 줌 
		} catch (ClassNotFoundException e) {
			//e.printStackTrace();
			System.out.println("jdbc driver load fail!");
		}			
	}
	
	public void getConnection() {
		if(conn == null) {
			try {
				conn = DriverManager.getConnection(url, dbuser, dbpass);
			} catch (SQLException e) {
				//e.printStackTrace();
				System.out.println("Oracle connection fail!");
			}
		}
	}
	
	public void closeDB() {
		try {
			// DB 종료 시 진행 순서 결과종료 -> 쿼리실행기 종료 -> 접속 종료
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		} catch (SQLException e) {
			//e.printStackTrace();
		}
	}
	
        // 유저 정보를 DB 입력하는 메소드
	public boolean insertUser(User user) {
		int result = 0;
		String query = ("insert into usertbl values (?,?,?)"); // ? 는 값 위치
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, user.getU_id());   // value 1번
			pstmt.setString(2, user.getU_name()); // value 2번
			pstmt.setString(3, user.getU_pass()); // value 3번
			
			//쿼리문 실행
                        // insert, update, delete 절은 executeUpdate() 사용
                       	result = pstmt.executeUpdate();	
			
		} catch (SQLException e) {
			//e.printStackTrace();
			return false;
		}
		
		return true;
	}

	// 로그인할 정보를 탐색/비교
	public User selectUser(String id) {
		User user = null;
                //DB에서 입력한 id를 찾음 (? 는 입력한 id의 내용이 들어가는 자리)
		String query = "select * from usertbl where u_id = ?";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1,id);
			rs = pstmt.executeQuery();  // select는 executeQuery() 사용

			if(rs.next()) {	// DB에 데이터가 있으면 T / 없으면 F 
				user = new User();
				user.setU_id(id);
				user.setU_name(rs.getString("u_name"));
				user.setU_pass(rs.getString("u_pass"));
			}
			else {
				System.out.println("ID 가 없습니다.");
			}
			
		} catch (SQLException e) {
			//e.printStackTrace();
			System.out.println("process fail");
		}
		return user;
	}
}
 

<main Class> controller

메소드 호출을 통해 데이터를 전달하는 클래스.

package com;

import java.util.Scanner;

import com.dao.Database;
import com.dto.User;
import com.service.Service;
import com.view.View;

public class JdbcMain {

	
	public static Database db;	// DB 인스턴스 생성
	public static View dv = new View();	// view 인스턴스 생성
	public static Service ds = new Service(); // service 인스턴스 생성
	
	public static void main(String[] args) {
		
		db = new Database();	// 드라이버 로드
		db.getConnection();		// 오라클과 접속
		
		
		
		while(true) {
			dv.printMenu();
			int sel = dv.SelectMenu();
			
			if(sel == 0) {
				System.out.println("종료합니다.");
				break;
			}
			switch(sel) {
			case 1:	// login
				loginProc();	// 로그인 메소드
				break;
				
			case 2:	// join user
				regiProc();		// 회원가입 메소드
				break;
			}
			
		}
	}
	
	// 회원가입 메소드
	private static void regiProc() {
		User user = new User();	// 회원가입할 유저의 인스턴스 생성
		user = dv.inputRegiProc(user);	// 회원 정보 입력
		// 회원 정보를 DB 연결을 위해 Service에게 전달
		boolean b = ds.insertUserData(user);
		if(b) {
			dv.printRegiSuccess();	// 성공 문구 출력
		}
		else {
			dv.printRegiFail();	// 실패 문구 출력
		}
	}

	private static void loginProc() {
		User user = new User(); // 로그인할 유저의 인스턴스 생성
		// view에서 처리할 작업
		user = dv.inputLoginData(user);	// ID와 PW 입력
		// DB에서 검사를 위해 Service에 입력된 정보 제공
		user = ds.getLoginData(user);	
		if(user != null) {	// 입력된 정보가 DB에 있다면
			dv.printLoginSuccess(user);	// 로그인 성공 출력
		}
		else {
			dv.printLoginFail();	// 로그인 실패 출력
		}
	}
}
 

<Service Class>

컨트롤러에서 전달받은 데이터를 DB 처리를 위해 DB에 값 전달

package com.service;

import com.JdbcMain;
import com.dao.Database;
import com.dto.User;

public class Service {
	
	// 회원가입 메소드
	public boolean insertUserData(User user) {
		// 입력한 데이터를 DB에 전달 후 리턴값 반환
		boolean b = JdbcMain.db.insertUser(user);
		return b;
	}
	
	
	// 로그인 메소드
	public User getLoginData(User user){
		//Service에서 할 일

		String userId = user.getU_id(); // 입력받은 아이디 저장
		String userPass = user.getU_pass(); // 입력받은 비밀번호 저장
		
		//DB에 입력받은 id와 동일한 데이터가 있는지 체크
		User dbuser = JdbcMain.db.selectUser(userId);
		
		if(dbuser != null) { // 동일한게 있다면 비밀번호 체크
			if(userPass.equals(dbuser.getU_pass())) {
				// 비밀번호가 같다면 성공
				return dbuser;
			}
			// 실패했다면 null 반환
			else {
				return null;
			}
		}
		return null;
	}
}
 

<View Class>

화면에 출력 또는 데이터 입력을 담당하는 클래스.

package com.view;

import java.util.Scanner;

import com.JdbcMain;
import com.dto.User;

public class View {
	public static Scanner scan = new Scanner(System.in);

	public User inputRegiProc(User user) {
		
		// 여기서 부터 view 에서 할 작업
		scan.nextLine();			// 엔터키 스킵
		System.out.println("회원 가입");
		System.out.print("Id\t : ");
		user.setU_id(scan.nextLine());
		System.out.print("Name\t : ");
		user.setU_name(scan.nextLine());
		System.out.print("PW\t : ");
		user.setU_pass(scan.nextLine());
		
		return user;
	}
	
	public User inputLoginData(User user) {
		scan.nextLine();		
		System.out.println("로그인");
		System.out.print("Id\t : ");
		user.setU_id(scan.nextLine());
		System.out.print("PW\t : ");
		user.setU_pass(scan.nextLine());
		
		return user;
	}
	
	public void printMenu() {
		System.out.println("회원 관리 프로그램");
		System.out.println("=====================");
		System.out.println("1. 로그인");
		System.out.println("2. 회원가입");
		System.out.println("0. 종료");
		System.out.println("=====================");
		System.out.print("선택 >> :");
	}
	
	public static int SelectMenu() {
		return scan.nextInt();
	}
	
	public static void printRegiSuccess() {
		System.out.println("회원 등록 성공");
	}
	public static void printRegiFail() {
		System.out.println("회원 등록 실패");
	}
	
	public static void printLoginSuccess(User user) {
		System.out.println(user.getU_name() + "님 환영합니다.\n");
	}
	public static void printLoginFail() {
		System.out.println("로그인 실패");
	}
}
 

 

 

'JAVA' 카테고리의 다른 글

StringBuffer  (0) 2022.08.28
String 클래스 문자열 메소드  (0) 2022.08.28
싱글톤 패턴  (0) 2022.08.28
인터페이스  (0) 2022.08.28
추상화  (0) 2022.08.28

+ Recent posts