Java Web Programming Workbook_2.1
title: 자바 웹 개발 워크북 - 구멍가게 코딩단 2.1 search: true categories:
- java tags:
- Dbeaver-community
- mariadb
- jdbc
- sql type
-
2.1 JDBC 프로그래밍 준비
1. DBeaver-community 설치
brew install DBeaver-community
2. mariadb 실행 후 DBeaver와 연결하기
3. dbeaver로 webdb table, webuser user 생성
- 터미널 명령어는 다음과 같다.
create datebase webdb; create user 'webuser'@'localhost' identified by 'webuser'; grant all privileges on webdb.* to 'webuser'@'localhost'; flush privileges;
4. intellij에 새 프로젝트 ‘jdbcex’ 생성
5. intellij database 연동 설정
6. JDBC 드라이버 라이브러리 build.gradle 설정에 추가
- JDBC(Java Database Connectivity) 드라이버: 자바 프로그램과 데이터베이스를 네트워크 상에서 연결해 데이터를 교환하는 프로그램
- JDBC 안의 API가 연결을 해주며 java.sql, javax.sql 패키지를 사용한다
- mvnrepository에서 ‘MariaDB Java Client’ 검색
// https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client implementation("org.mariadb.jdbc:mariadb-java-client:3.0.4") - build.gradle에 추가
dependencies { compileOnly('javax.servlet:javax.servlet-api:4.0.1') 중간 생략... // https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client implementation("org.mariadb.jdbc:mariadb-java-client:3.0.4") } - gradle icon 클릭해 갱신하기
> Task :prepareKotlinBuildScriptModel UP-TO-DATE Download https://repo.maven.apache.org/maven2/org/mariadb/jdbc/mariadb-java-client/3.0.4/mariadb-java-client-3.0.4.pom, took 140 ms (0 B) 이하 중략... BUILD SUCCESSFUL in 2s7. MariaDB와 연결 확인 test code 작성하기
``` package org.zerock.dao;
import java.sql.Connection;//데이터베이스와 네트워크의 연결을 관리하는 인터페이스 import java.sql.DriverManager;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test;
public class ConnectTests { @Test public void testConnection() throws Exception { Class.forName(“org.mariadb.jdbc.Driver”); //jdbc 드라이버 클래스를 메모리상으로 로딩, 드라이버 파일이 없다면 에러 발생
Connection connection = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/webdb", //jdbc 프로토콜 사용: 네트워크 연결 정보(localhost:3306): 데이터베이스 정보(webdb)
"webuser",
"webuser"
); // webdb에 연결 시도
Assertions.assertNotNull(connection); // 데이터베이스와 정상적으로 연결된다면 connection 객체는 null이 아님을 확신한다
connection.close(); // 작업이 완료되면 jdbc와 데이터베이스의 연결 종료, 데이터베이스는 많은 연결을 처리해야 하므로 연결을 종료하지 않으면 새로운 연결을 받을 수 없는 상황이 발생하지 않도록 반드시 종료해주어야 한다. } } ``` 
8. sql create로 tbl_todo table 만들기
- DDL(Data Definition Language): 데이터 정의어
- 데이터베이스를 정의하는 언어를 말하며 데이터를 생성하거나 수정, 삭제 등 데이터의 전체 골격을 결정하는 역할의 언어를 말한다.
- CREATE
- 데이터 베이스, 테이블 등을 생성하는 역할을 한다.
- ALTER
- 테이블을 수정하는 역할을 한다.
- DROP
- 데이터베이스, 테이블을 삭제하는 역할을 한다.
- TRUNCATE
- 테이블을 초기화 시키는 역할을 한다.
create table tbl_todo (
tno int auto_increment primary key,
title varchar(100) not null,
dueDate date not null,
finished tinyint default 0
);
- auto_increment: 여러 데이터 중 특정한 데이터를 구분하기 위해 값을 자동으로 부여, 값이 연속적이지 않고 단순히 구분이 가능한 숫자가 부여된다.
9. insert로 데이터 추가하기
- DML(Data Manipulation Language): 데이터 조작어
- 정의된 데이터베이스에 입력된 레코드를 조회하거나 수정하거나 삭제하는 등의 역할을 하는 언어를 말한다.
- SELECT
- 데이터를 조회하는 역할을 한다.
- 데이터를 조회하는 sql은 query라고 한다.
- INSERT
- 데이터를 삽입하는 역할을 한다.
- UPDATE
- 데이터를 수정하는 역할을 한다.
- DELETE
- 데이터를 삭제하는 역할을 한다. ``` insert into tbl_todo (title, dueDate, finished) values (‘TEST…’, ‘2025-10-18’, 1);
use webdb; select * from tbl_todo; ```
JDBC 프로그래밍을 위한 API와 용어들
- java.sql.Statement/PreparedStatement
- JDBC에서 SQL을 데이터베이스로 보내기 위해서 Statement/PreparedStatement 타입을 이용
- 그 외 프로시저 호출을 위한 CallableStatement 도 있다.
- PreparedStatement : SQL문을 미리 전달하고 나중에 데이터를 보내는 방식
- Statement : SQL 문 내부에 모든 데이터를 같이 전송하는 방식
- 실제 개발에서는 SQL injection을 예방하기위해 PreparedStatement만을 이용하는 것이 관례
- Statement도 Connection과 마찬가지로 close()를 통해서 종료해야 DB 내부의 메모리와 같이 사용했떤 자원들 즉각 정리됨.
- setXXX() : setInt(), setString(), setDate()와 같이 다양한 타입에 맞게 데이터 세팅
- executeUpdate() : DML(insert/update/delete)을 실행하고 결과를 int타입으로 반환 (영향 받은 row의 개수)
- executeQuery() : 쿼리(select) 실행. ResultSet이라는 리턴 타입 이용
- java.sql.ResultSet
- PreparedStatement를 이용해서 insert/update/delete를 처리하는 DML의 경우 int로 반환된다. 반면에 executeQuery로 select를 실행한다면 DB에서 반환하는 레코드(행)을 읽어들이기 위해 ResultSet이라는 인터페이스가 이용된다. 이 인터페이스는 자바 코드에서 데이터를 읽기 때문에 getter 메소드를 사용해 필요한 타입으로 데이터를 읽는다.
- ResultSet의 메소드 중 next()를 사용해서 다음 행(row)의 데이터를 읽을 수 있다. ResultSet은 순차적으로 데이터를 읽도록 구성되어 있다.
- ResultSet도 네트워크를 통해 데이터를 읽으므로 사용이 끝난 후에는 반드시 close()를 해주어야 한다.
- Connection Pool과 DataSource
- JDBC는 필요한 순간에 잠시 DB와 네트워크로 연결하고 데이터를 보내고 받는 방식이다. DB와의 연결(Connection)을 맺는 작업은 시간과 자원 소모가 많다. 여러 번 SQL을 실행하면 성능 저하가 발생하는 것이다. JDBC는 Connection을 미리 생성해서 보관하며, 필요시에 꺼내쓰는 방식인 Connection Pool(커넥션 풀)⭐을 이용해 문제를 해결한다.
- javax.sql.DataSource인터페이스는 커넥션 풀을 자바에서 API형태로 지원하며, 커넥션 풀을 이용하는 라이브러리는 모두 DataSource 인터페이스를 구현하므로 이를 활용해서 JDBC 코드를 작성하게 된다.
- Connection Pool은 기작성된 라이브러리를 이용하는 경우가 많은데, DBCP, C3PO, HikariCP 라이브러리를 이용한다.
- DAO(Data Access Object)
- DAO는 데이터를 전문적으로 처리하는 객체이다. DB의 접근과 처리를 전담하는 객체를 의미한다.
- DAO는 주로 VO를 단위로 처리한다.
- DAO를 호출하는 객체는 DAO가 내부에 어던식으로 데이터를 처리하는지 알 수 없도록 구성한다.
- VO(Value Object) 혹은 엔티티(Entity)
- OOP는 데이터를 객체 단위로 처리한다. 테이블의 한 행(row)는 자바 프로그램에서 하나의 객체가 된다.
- DB에서 하나의 데이터는 엔티티(entity)라고 하며 자바에서는 이를 처리하기 위해 테이블과 유사한 구조의 클래스를 만들어서 객체로 처리한다. 이것이 ‘값을 보관하는 용도’의 VO(Value Object)이다.
- DTO는 각 계층을 오고 가는 데 사용되며, getter/setter를 모두 사용하지만 VO는 데이터베이서의 엔터티를 자바 객체로 표현되며 데이터 자체를 의미하여 getter만을 이용하는 경우가 대부분이다
댓글남기기