기존 DB, JDBC, SQL 관련 개념 글을 참고하려면 이쪽으로!
[SQL첫걸음] 1장 데이터베이스와 SQL/ 2장 테이블에서 데이터 검색
w. 아사이 아츠시1강 - 데이터베이스데이터 : 컴퓨터 안에 기록되어있는숫자데이터베이스(DB) : 저장장치 내 정리된 데이터의 집합데이터베이스 관리시스템(DBMS) : DB 효율적 관리 SW간접적으로 데
sihyes.tistory.com
'도서 공부(정리)/SQL첫걸음' 카테고리의 글 목록
24학번 컴퓨터공학과
sihyes.tistory.com
WebSocket 삽질기 정리 — “왜 연결이 안 됐는가?”
자료구조, 디렉토리 구조가 이렇게 중요합니다.주구장창 연결 오류떴었는데...성공했어욤!!!!!!!!!!!!!!!!!!!!!!이게 제가 설정한 구조에요주의할점!!!!!**보면 디렉토리가 chat이랑 demo랑 둘다 com.example
sihyes.tistory.com
#1.데이터베이스와 DBMS
#1.1 데이터베이스
: 여러 응용 시스템들의 통합된 정보들을 저장해 운영할 수 있는 공용 데이터들의 집합.
데이터의 저장,검색,갱신을 효율적으로 수행할 수 있도록 고도로 조직화하여 저장한다.
#1.2 DBMS : 데이터베이스 관리 시스템(DataBase Management System)
오라클, MS SQL Server, MySQL, IBM의 DB2 등이 있다.
종류: (데이터베이스 관리 시스템에서 사용하는 그 언어가 SQL이다.)
| RDBMS : 관계형 데이터베이스 | `key`와 `value`들의 관계를 테이블로 표현한 데이터베이스 모델 |
| 객체 지향 데이터베이스 | 정보를 객체의 형태로 표현하는 데이터베이스모델 |
| NoSQL, NewSQL, DBMS | 비정형데이터를 처리하는데 적합하다. |
#2. RDBMS 구조와 기본 용어
데이터베이스 - 다수의 테이블로 구성된다 (각 테이블은 key, value의 관계로 표현된다)
`key` = 테이블의 열
`value` = 테이블의 행, 이는 하나의 record를 표현한다.
여러 테이블 간에 공통된 이름의 열 포함가능. (user테이블의 id, store테이블의 id처럼)
용어
- `릴레이션`: 하나의 개체에 관한 데이터를 2차원 테이블 구조로 저장한것
- `Attribute` : 릴레이션의 열, 파일관리 시스템에서 필드에 해당한다.
- `tuple`: 릴레이션의 행, 파일관리 시스템에서 레코드에 해당한다
- `domain` : 하나의 속성이 가질 수 있는 모든 값의 범위 또는 데이터타입. (문자열,정수,실수 ...)

#3. SQL과 JDBC
#3.1 SQL(Structured Query Language)
- 관계형 데이터베이스 관리 시스템에서 사용하는 쿼리용 언어
- 데이터베이스 스키마 생성, 자료의 검색, 관리, 수정, 그리고 데이터베이스 객체 접근 관리를 위해 고안된 언어
- 데이터베이스로부터 정보를 추출하거나 갱신하기 위한 표준 대화식 프로그래밍 언어
- 다수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택
#3.2 JDBC (Java Database Connectivuty)
- 관계형 데이터베이스에 저장된 데이터를 접근 및 조작할 수 있게 하는 API
- 다양한 DBMS에 대해 일관된 API로 데이터베이스 연결, 검색, 수정, 관리 등을 할 수 있게 함
(과거에는 데이터베이스 종류마다 접속방법이 달라 개발이 번거로웠다.) - JDBC 드라이버 : DBMS마다 고유한 JDBC 드라이버 제공
▶ 이것만 변경하면 자바코드 변경없이 다양한 종류의 데이터베이스와 통신이 가능하다.
#4. HeidiSQL과 MariaDB, MySQL
#4.1 HeidiSQL
Window GUI기반 무료 DB관리 툴. 기존에 사용하던 MySQL Workbench보다는 비교적(꽤많이) 사용자 친화적이고, 입문자가 사용하기 쉬워보인다.
그리고, 프로그램이 워크벤치보다 매우매우 가볍다고한다. (실제로 돌릴때 가벼운게 체감된다.) 돌아가는 작업관리자를 보자.





확실히 하이디는 메모리를 4~5배이상 적게쓴다 ㄷㄷ. 어쩐지 가볍더라.
AWS 배포할때보면 MariaDB/Mysql 모두 호환되는것을 확인할 수 있었다.
찾아보니 MariaDB가 MySQL기반으로 한 오픈소스 기반 RDBMS라고한다. 어쩐지...
아무튼 수업중에 mariadb를 설치하라고하셨는데, 나는 이미 3306포트를 MySQL로 사용하고있기때문에 별도로 설치를 진행하지는 않았다.
하이디 SQL이 진짜 UI가 깔끔하고 이쁘다. (시각적으로 잘뽑힘.. 쿼리문을 사용하지 않는사람들에게는 정말 좋을듯)
키 관련 내용
[SQL 첫걸음] 6장 데이터베이스 객체 작성과 삭제
📌 목차25강 데이터베이스 객체26강 테이블 작성ㆍ삭제ㆍ변경27강 제약28강 인덱스 구조29강 인덱스 작성과 삭제30강 뷰KEYWORD : 데이터베이스 객체 작성, '인덱스'구조25강 - 데이터베이스 객체데
sihyes.tistory.com
#5. JDBC
#3.2와 이어집니다.

JDBC프로그래밍의 핵심 5단계
#5.1 JDBC프로그래밍의 핵심 5단계
- 1단계 : JDBC 드라이버 로드
사용하려는 데이터베이스의 JDBC 드라이버 클래스를 JVM에 로드. (JDBC 4.0 이후, jar 파일이 classpath에 포함되어있다면 생략 가능.)
반드시 써야하는 경우도 있으니 주의한다*
(서버 환경에서 드라이버가 자동로딩이 안될 때, DB드라이버가 여러개일때, 구버전 JDBC를 사용할 때 등) - 2단계 : 데이터베이스 연결(Connection)
DriverManager를 통해 DB서버URL, 사용자계정, 비밀번호를 사용해 실제 데이터베이스와 연결을 맺는다. 성공하면 Connection 객체가 반환된다. - 3단계 : SQL 문 실행 (Statement / PreparedStatement)
- Connection 객체로부터 SQL을 실행할 수 있는 Statement 또는 PreparedStatement 객체를 생성.
- statement: 정적인 SQL 문을 실행할 때 사용.
- preparedStatement: 성능과 보안 때문에 사용을 강력히 권장.
SQL을 미리 컴파일하여 반복 실행 시 성능이 좋고, ?를 이용한 값 바인딩으로 SQL 인젝션(SQL Injection) 공격을 원천적으로 방어할 수 있다.
- 4단계: 결과처리 (Result Set)
SELECT 문을 실행한 후 반환되는 ResultSet 객체는 조회된 데이터의 집합
next() 메서드를 호출하여 한 행(row)씩 이동하며 데이터를 읽어온다. - 5단계: 자원해제 (Close)
사용한 객체를 사용한 역순으로 닫아 시스템의 자원 누수를 막아준다.
Connection, PreparedStatment, ResultSet
자원이 자동해제되는 try-with-resources (Java 7 이상)을 사용 권장.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) { // 여기에서는 1단계를 생략한것같다.
// TODO Auto-generated method stub
String url = "jdbc:mysql://192.168.0.13:3306/java2_3";
String username = "stdUser";
String password = "비밀비밀 ㅎㅎ";
try(Connection conn = DriverManager.getConnection(url, username, password)){
System.out.println("DB 연결 성공!"); // 2단계를 의미한다.
// String selectSql = "SELECT * FROM user";
// Statement stmt = conn.createStatement(); //디비연결 생성
// ResultSet rs = stmt.executeQuery(selectSql); //받아온 결과 rs에저장
//
// while(rs.next()) {
// int no = rs.getInt("no");
// String dept = rs.getString("dept");
// String sid = rs.getString("stdID");
// String name = rs.getString("name");
//
// System.out.printf("no: %d, 학과 : %s , 학번 : %s, 이름: %s \n",no,dept,sid,name);
// }
String insertSql = "INSERT INTO student (dept,stdID,name,review) VALUES (?, ?, ?,?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSql)){ // 3단계를 의미한다.
pstmt.setString(1,"컴퓨터공학과");
pstmt.setString(2, "2466044");
pstmt.setString(3, "이시은");
pstmt.setString(4, "실습 보고 연결하기 오래걸렸어요..");
pstmt.executeUpdate();
System.out.println("학생정보삽입 성공");
}
// 5단계. try() 괄호 안에 선언된 리소스는 자동으로close() 호출된다.
// 예외가 발생하더라도, finally없이정리가능.
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
#5.2 기존프로젝트에 적용
기존에 로그인 요청하던 로그이다. Hibernate가 넣어주면서, ? 처리하는걸 볼 수 있다. 기존에 왜 ? 로 뜨는지 궁금했었는데, 이번 수업을 통해 그 사유를 알수있었다.
?를 이용한 값 바인딩으로 SQL 인젝션(SQL Injection) 공격을 원천적으로 방어할 수 있다. (이게 그 DNS 스푸핑인가 스니핑인가 이런걸까?)

Hibernate
자바 어플리케이션에서 관계형 데이터베이스를 사용하는 작업을 간소화하는 객체 관계 매핑(ORM) 라이브러리.
(= Hibernate는 JPA(자바 표준)의 구현체 중 하나인 ORM(Object-Relational Mapping) 프레임워크)
- Java 객체 ↔ RDB 테이블 사이의 변환을 자동화해줌
- 개발자가 SQL을 직접 쓰는 횟수를 줄여줌
- 트랜잭션, 캐싱, 지연 로딩 등 편리한 기능 제공
Spring Boot에서 JPA를 쓴다고 하면 실제로는 내부에서 Hibernate가 대부분의 일을 처리한다 (!)
application.yml파일이다. 내가 하던 프로젝트에 있던걸 가져왔다. 이제 이걸 샅샅이 뜯어보자
jpa:
hibernate:
ddl-auto: validate
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
format_sql: true
`ddl-auto: validate`
- 애플리케이션 실행 시→ Entity(@Entity) 클래스와 DB 테이블 구조가 일치하는지 검사만
- 수정된 경우 Hibernate가 스키마를 변경하지 않음
- 즉 운영 환경에 안전한 옵션
` dialect: MySQL8Dialect`
Hibernate가 MySQL 8에 맞게 SQL을 생성하도록 지시하는 것.
DB마다 SQL 문법이 미묘하게 다르기 때문에 꼭 필요해.
`show-sql: true, format_sql: true`
- 실행되는 SQL을 콘솔에 예쁘게 출력
JDBC vs Hibernate(JPA) 관계
개발자 → JPA(Hibernate) → JDBC → DB
Hibernate는 내부적으로 JDBC를 사용해서 DB에 접속하고 SQL을 실행!
'컴퓨터공학과 > Java 1 & 2' 카테고리의 다른 글
| java - spring db jpa crud (0) | 2025.11.30 |
|---|---|
| [java] Gui (+Thread) 실습#6 (1) | 2025.11.02 |
| [Java] SOLID 실습 짱구의 매너전략 (0) | 2025.10.15 |
| [Java] 커피메이커 리팩토링 - SOLID 원칙 적용 +V2,V3 | 추가패턴조사 (0) | 2025.10.11 |
| [Java] Thread (0) | 2025.09.22 |