정규화를 피하는 설계 기법
1차 정규화를 피하는 방법
장부나 전표에서 머리부와 서술부는 별도의 엔티티로 저장한다.
2, 3차 정규화를 피하는 방법
코드 - 코드 값 관계의 속성들은 별도의 엔티티로 구성한다.
반정규화
엔티티의 통합
항상 혹은 대부분 조인에 의한 검색을 하고, 검색이 빈번히 이뤄지는 두 개의 엔티티를 대상으로
수직 분할
엔티티의 튜플 수 및 속성의 수가 매우 많고, 엔티티의 속성들이 그룹화되어 각 그룹이 특정 부서 혹은 응용 프로그램에 의해서만 사용될 때
수평 분할
한 테이블 내 튜플의 조회 빈도에 따라 엔티티 분할
속성 중복에 의한 반정규화
조인하여 가져다 사용하는 속성의 수가 적을 경우 통합은 비효율적, 속성을 중복하여 저장함.
관계에 대한 비정규화
속성에 중복에 의한 반정규화와 비슷하나 차이가 있다면 중복 속성이 다른 엔티티와의 관계를 맺기 위한 외래키로 사용된다는 것이다.
JDBC
Java DataBase Connetivity
자바 어플리케이션에서 DB와 연동할 수 있게 도와주는 API
JDBC용 클래스 (java.sql)
- Driver Managaer
- Connection
- [Prepared]Statement
- ResultSet
실행 절차
- jdbc driver 등록
- db 연결
- sql문 실행 및 결과 받기
- 사용한 jdbc용 객체 자원 반납
javal.sql.Connection
DB 접속을 위한 인스턴스
접속할 DB의 정보를 제시하여 인스턴스 생성
→ Driver Manager의 정적 메소드를 통한 생성
인스턴스 생성 전 접속할 DB Driver 등록 필요
라이브러리 등록을 위해 mvnrepository.com 에서 mysql connjector j 를 gradle에 의존성 추가해주자.
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306:empdb","ino","ino");
// db url(jdbc:mysql://address:portnum/dbname), userid, passwd
System.out.println("conn: " + conn);
} catch (ClassNotFoundException | SQLException e) { // 라이브러리 미등록 or 오타
e.printStackTrace();
} finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
연결 예시 :)
해당 내용의 개선을 위해 properties 파일로 관리하고 커넥션의 연결과 해제를 Template화해주자
public class JDBCTemplate {
public static Connection getConnection() {
Properties prop = new Properties();
Connection conn = null;
try {
prop.load(new FileReader("src/main/java/com/ino/config/connector-config.properties"));
String driver = prop.getProperty("driver");
Class.forName(driver);
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
conn = DriverManager.getConnection(url, user, password);
} catch (IOException | ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet rset) {
try {
if (rset != null && !rset.isClosed()) {
rset.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stmt) {
try {
if (stmt != null && !stmt.isClosed()) {
stmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/empdb
user=ino
password=ino
//connector-config.properties 파일의 내용임
java.sql.Statement
- 정적 sql문 실행 및 실행 쿼리 결과를 반환해주는 인스턴스
- 고정적인 쿼리 실행에 유용
- Connection 객체의 메소드를 통해 생성
- 쿼리 실행 메소드
- executeQuery(sql문) : select 문 실행 → ResultSet 결과 반환
- executeUpdate(sql문) : DML 문 실행 → int (처리된 행 수) 반환
intellij 내장으로
위와 같이 db 조회도 할 수 있다.
이번엔 statement를 통해 쿼리를 조회하고 데이터를 가져와보자.
java.sql.ResultSet
- SELECT 문 실행 후 반환되는 데이터를 담고 있는 객체
- 주요 메소드→ 존재하는 행이 있으면 true, 없으면 false 반환getString(컬럼) : 현재 참조 행의 컬럼 값을 String 반환
- getDate(컬럼) : 현재 참조 행의 컬럼 값을 Date 반환
- getInt(컬럼) : 현재 참조 행의 컬럼 값을 Int 반환
- next() : 결과 행 참조를 위해 커서를 움직여주는 메소드
public class Application1 {
public static void main(String[] args) {
Connection conn = JDBCTemplate.getConnection();
Statement stmt = null; // 쿼리문 실행 후 결과 받는 객체
ResultSet rset = null; // select 문 실행 결과를 담는 객체
String query = "SELECT emp_id, emp_name FROM employee";
try {
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
while(rset.next()){
System.out.println(rset.getString("emp_id") + ", " + rset.getString("emp_name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rset);
close(stmt);
close(conn);
}
}
}
'TIL' 카테고리의 다른 글
TIL 3/21 - JDBC(UPDATE, DELETE), DAO, Service Layer (0) | 2025.03.21 |
---|---|
TIL - 3/20 - JDBC (0) | 2025.03.20 |
TIL 3/18 - DB 모델링, 이상(Anomaly), 정규화 (0) | 2025.03.18 |
TIL 3/17 - VIEW, INDEX, 실행 계획, FUNCTION, PROCEDURE, AWS EC2(보안그룹, 인스턴스 실행) (0) | 2025.03.17 |
TIL 3/14 - 제약조건,No SQL, AWS EC2 (0) | 2025.03.14 |