티스토리 뷰

- 데이터베이스와 DBMS

데이터베이스 : 공용 데이터들 집합

DBMS : DataBase Management System : 데이터베이스 관리 시스템 ex) 오라클, MySQL

 

관계형 데이터베이스 

- 키와 값들의 관계 테이블 여러 개로 구성돼있다.

- 릴레이션 : 데이터를 2차원 테이블 구조로 저장한 것을 말한다.

- 키 = 열 = 속성, 애트리뷰트 = 필드에 해당

- 값 = 행 = 투플 = 레코드에 해당 

- 도메인 = 값의 데이터타입(범위)


- SQL & JDBC

SQL : Structured Query Language : CRUD(Create, Read, Update, Delete)하기 위해 사용하는 쿼리용 언어

사투리처럼 오라클, MySQL 등 조금씩 다르다.

 

JDBC : Java DataBase Connectivity : 관계형 DB에 접근 및 조작하게 해주는 API(Application Programming Interface)

자바 어플리케이션이 DBMS(MySQL같은)와 연결해서 데이터 다룰 수 있도록 해주는 API. 

- MySQL -> mysql-connector-j(jdbc 드라이버)

- Oracle -> o jdbc(jdbc 드라이버)

자바 - JDBC(연결해주는 역할) - DBMS

 

- HeidiSQL에서 테이블 만들고, 데이터 추가하기

- 기본키, 고유키


 

- CRUD : 데이터 다루는 4가지 기능 Create, Read, Update, Delete


- 실습 코드(Create(Insert), Read, Update, Delete)

import java.sql.*;

public class Main {

	public static void main(String[] args) {
		//DB 접속 위한 url, 사용자명, 비밀번호 설정
		String url="jdbc:mysql://192.168.0.13:3306/java2_3"; //db 서버 주소와 db 이름
		String username = "stdUser"; //db 사용자 계정
		String passwd = "wkvmtlf2"; //db 사용자 비밀번호
		
		//try-with-resource라고 한다. ()예외처리 발생하는 모든 걸 계속해서 써도 된다. 여러 line
		//connection 맺은 것들, 괄호 안에서 생성한 자원 자동으로 CLOSE() 처리됨
		try (Connection conn = DriverManager.getConnection(url, username, passwd)){
			//Connection conn = DriverManager.getConnection(url, username, passwd);
			System.out.println("DB연결 성공!");
			
			//Select쿼리
			String selectSql = "SELECT * FROM student";
			
            //sql 실행용 statement 객체 생성
			try(Statement stmt = conn.createStatement()){
			
			//selectSql 쿼리를 여기다가 넣어서 execute 실행한다.  쿼리 날려서 받아온 결과를 rs에 저장한다.
			ResultSet rs = stmt.executeQuery(selectSql);
			//ResultSet은 테이블의 결과 집합 담고 있다.
            
			//no, dept, stdID, name, review
			while(rs.next()) {//다음 행이 있으면 true
            	//각 컬럼 값 가져오기
				int no = rs.getInt("no");
				String dept = rs.getString("dept");
				String stdID = rs.getString("stdID");
				String name = rs.getString("name");
				String review = rs.getString("review");
				
				System.out.printf("No : %10d | 학과 : %10s | 학번 : %10s | 이름 : %10s | 리뷰 : %s \n", no, dept, stdID, name, review);
			}
			
			
		}
		
        //INSERT 쿼리 실행
		String insertSql = "INSERT INTO student (no, dept, stdID, name, review) VALUES (?, ?,?,?,?)";
		//PreparedStatement 사용 : ?에 값 바인딩 가능
		try (PreparedStatement pstmt = conn.prepareStatement(insertSql)){
			pstmt.setInt(1, 25);
			pstmt.setString(2, "컴퓨터공학과");
			pstmt.setString(3, "2176136");
			pstmt.setString(4, "박남규");
			pstmt.setString(5, "우와~~~~ jdbc 연결, 삽입 성공~~~");
            //SQL 실행 (INSERT, UPDATE, DELETE는 executeUpdate 사용)
			pstmt.executeUpdate();
			System.out.println("학생 정보 삽입 성공");
		}
		
	} catch (SQLException e) {
		e.printStackTrace();
	
	}

	}
}
		//3. UPDATE문
		String updateSql = "UPDATE student SET name = ?, dept = ? WHERE stdID = ?";
		try(PreparedStatement stmt = conn.prepareStatement(updateSql)){
			//바꿀 값 지정
			stmt.setString(1, "테일러");
			stmt.setString(2, "영어영문학과");
			
			//조건 지정
			stmt.setInt(3, 21761361);
			stmt.executeUpdate();
			System.out.println("학생 정보 업데이트 성공");
		}
		
		//4. DELETE문
		String deleteSql = "DELETE FROM student WHERE no = ?";
		try(PreparedStatement stmt = conn.prepareStatement(deleteSql)){
			stmt.setInt(1, 25);
			stmt.executeUpdate();
			System.out.println("학생 정보 삭제 성공");
		}


- JDBC 프로그래밍 핵심 5단계

1. JDBC 드라이버 로드 : 위 코드에서는 DriverManager.getConnection(url, username, passwd) 여기서 MySQL 드라이버를 자동으로 찾아서 로드

 

2. 데이터베이스 연결 (Connection) :DriverManager를 통해 url, 사용자, 비밀번호 사용해 실제 데이터베이스와 연결 맺기. 성공 시 Connection 객체 반환, 이 객체로 statement, preparedstatement 만들고 sql 실행 가능

DriverManager.getConnection(url, username, passwd)

 

3. SQL문 실행(Statement / PreparedStatement)

statement : 보통 select 할 때 씀

preparedStatement : ? 이용한 값 바인딩으로 sql 공격을 원천적으로 방어할 수 있다.

 

4. 결과처리(Result Set)

 

5. 자원해제(Close) : 자원 자동해제되는 try-with-resources 사용하자. 

try(이 안에다가 자원 넣어놓음. Connection conn, PreparedStatement pstmt, ResultSet rs)


- DB 연결 / CRUD 모듈화 

User, DatabaseConnector, UserDAO(Data Access Object:데이터 접근 객체) , Main

User 클래스 : 유저 한 명 정보 표현

DatabaseConnector : DB랑 연결(Connection)만. UserDao가 DB 필요로 할 때마다 커넥션을 반환

UserDao : DB에 접근해 CRUD 실행한다. DB 테이블과 java 유저 연결해주는 역할

Main :

userDao 객체 생성 : db 접근 준비

user 객체 생성해서 CRUD한다. 그러면 userDao 객체는 databaseConnector가 넘겨준 커넥션들로 crud 수행.


- 한 걸음 더 : DAO, DTO(Data Transfer Object), 인터페이스(Service, Repository) 추가

비즈니스 로직(service)과 db 로직(DAO)을 완전히 분리. 

인터페이스로 DB 접근 방식 바뀌어도 service는 수정 안해도 됨. 

DatabaseConnector, User(DTO), UserRepository(crud 규칙 인터페이스), UserDao implements UserRepository, UserService, Main

 

UserService : 비즈니스 로직 담당, 데이터 저장/조회는 repository DAO에게 위임

UserRepository : 서비스가 db 접근 규칙 보여줌. 서비스가 구체클래스(DAO)에 의존하지 말고 나(인터페이스)에게 의존하도록. 그럼 구체 클래스 바뀌어도 큰 수정 필요 없다.

 


heidiSQL에 테이블을 만들고 이를 이클립스 내부에서 CRUD 쿼리를 통해 변경시킬 수 있다는 게 매우 흥미로웠다. 그리고 같은 네트워크 아래에서 타인의 DB 테이블에 들어가 흔적을 남기고 오는 실습도 재밌었다. 그리고 UPDATE문, DELETE문을 추가해 실습해보면서 한 클래스 안에 다 담다 보니 내가 원하는 결과를 보기 어려워서 그런 측면에서도 클래스를 쪼개 기능을 분리하는 게 필요하다는 걸 여실히 느꼈다. (중간에 인서트가 왜 안되지 했는데 같은 행을 인서트하고, 삭제하고 있었다...ㅎㅎㅎ) 

또한 마지막에 가서도 서비스 로직과 데이터 처리 로직을 분리하는 solid원칙의 single responsibility를 준수하는 식의 리팩토링이 매우 중요하다는 걸 알 수 있었다. 구체 데이터 다루는 부분을 바꾸어도 service 쪽은 건드리지 않아도 되게끔 만드는 것. 

요즘 마피아 게임 프로젝트 코드를 짜고 있는데 자꾸만 if-else문을 쓰려 하는 스스로를 되돌아보게 되었다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함