Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링 고급 - 스프링 aop
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch6
- 스프링 db1 - 스프링과 문제 해결
- 스프링 mvc1 - 서블릿
- 스프링 mvc1 - 스프링 mvc
- 2024 정보처리기사 수제비 실기
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch9
- 자바의 정석 기초편 ch3
- 자바의 정석 기초편 ch1
- 스프링 mvc2 - 로그인 처리
- 스프링 mvc2 - 검증
- 코드로 시작하는 자바 첫걸음
- 게시글 목록 api
- 자바의 정석 기초편 ch7
- 2024 정보처리기사 시나공 필기
- 스프링 입문(무료)
- 자바의 정석 기초편 ch5
- 자바의 정석 기초편 ch14
- 자바의 정석 기초편 ch11
- 자바의 정석 기초편 ch4
- 자바의 정석 기초편 ch12
- 자바의 정석 기초편 ch8
- 자바의 정석 기초편 ch2
- 스프링 db2 - 데이터 접근 기술
- jpa 활용2 - api 개발 고급
- @Aspect
- 스프링 mvc2 - 타임리프
- 자바 기본편 - 다형성
Archives
- Today
- Total
나구리의 개발공부기록
JDBC 이해 - 프로젝트 생성 및 H2 데이터베이스 설정, JDBC 이해, JDBC와 최신 데이터 접근 기술, 데이터 베이스 연결 본문
인프런 - 스프링 완전정복 코스 로드맵/스프링 DB 1편 - 데이터 접근 핵심 원리
JDBC 이해 - 프로젝트 생성 및 H2 데이터베이스 설정, JDBC 이해, JDBC와 최신 데이터 접근 기술, 데이터 베이스 연결
소소한나구리 2024. 9. 11. 10:42 출처 : 인프런 - 스프링 DB 1편 데이터 접근 핵심 원리 (유료) / 김영한님
유료 강의이므로 정리에 초점을 두고 코드는 일부만 인용
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
1. 프로젝트 생성 및 H2 데이터베이스 설정
1) 프로젝트 생성
(1) 프로젝트 생성 후 build.gradle에 해당 내용을 추가
- test에서 롬복을 적용
//테스트에서 lombok 사용
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
(2) 실행
- 실행 후 로그에 Started JdbcApplication in 0.514 seconds (process running for 0.808) 내용이 뜨면 성공
2) H2 데이터베이스 설정
- H2 데이터베이스는 개발이나 테스트 용도로 사용하기 좋은 가볍고 편리한 DB이며, SQL을 실행할 수 있는 웹 화면을 제공함
- https://www.h2database.com/
(1) 다운로드
- H2 데이터베이스 버전은 스프링 부트에 맞춰서 설치해야 문제가 안생길 가능성이 높음
-
스프링 부트 2.x를 사용하면 1.4.200 버전을, 스프링 부트 3.x를 사용하면 2.1.214 버전 이상을 사용
- External Libraries에 h2를 검색하면 버전을 확인할 수 있음
- 다음 링크에 가면 다양한 h2 버전을 다운 받을 수 있음
- https://www.h2database.com/html/download-archive.html
(2) 실행
- MAC, 리눅스 사용자는 터미널에서 cd h2디렉토리의 경로/bin -> chmod 755 h2.sh -> ./h2.sh 로 실행
- 윈도우 사용자는 h2.bat 파일로 실행
- 만약에 입력했는데 에러페이지 같은게 뜬다면 ip경로만 localhost로 바꿔주면 접속됨(뒤에는 건들지 말것)
(3) 데이터 베이스 파일 생성 방법
- 사용자명은 sa로 그대로 입력
- 최초 한번은 JDBC URL: jdbc:h2:~/test 입력 후 연걸을 해준 후 ~/test.mv.db가 생성 되었는지 확인 해야 함(연결 시험 버튼 아님)
- 이후 부터는 jdbc:h2:tcp://localhost/~/test 이렇게 접속
3) 테이블 생성 및 데이터 입력
- h2콘솔에 아래의 쿼리문들을 입력해서 테이블 생성 및 데이터 입력 조회 해보기
drop table member if exists cascade;
create table member (
member_id varchar(10),
money integer not null default 0,
primary key (member_id)
);
insert into member(member_id, money) values ('hi1',10000);
insert into member(member_id, money) values ('hi2',20000);
select * from memeber;
3. JDBC 이해
1) JDBC 등장 이유 - 과거의 이야기
(1) 클라이언트, 애플리케이션 서버, DB
- 애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터 베이스에 보관
- 클라이언트(앱 or 웹 등)에서 직접 DB에 연결하지는 않고 애플리케이션 서버에 요청을 보내면 애플리케이션 서버가 DB에 SQL을 전달해서 DB에 보관하게 됨
(2) 애플리케이션 서버와 DB - 일반적인 사용법
- 애플리케이션 서버는 다음 과정을 통해서 데이터 베이스를 사용함
- 1. 커넥션 연결 : 주로 TCP/IP를 사용해서 커넥션 연결
- 2. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달
- 3. 결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답, 애플리케이션 서버는 응답 결과를 활용
(3) 애플리케이션 서버와 DB - DB 변경
- 과거에는 각각의 데이터베이스마다 사용법이 달랐는데 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답 받는 방법이 모두 달랐으며 이러한 관계형 데이터 베이스가 수십개가 있음
- 여기에는 2가지 큰 문제가 있었는데, 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야하고, 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL전달, 그리고 그 결과를 응답받는 방법을 새로 학습을 해야 했음
- 이러한 문제를 해결하기 위해 JDBC라는 자바 표준이 등장함
2) JDBC 표준 인터페이스
- JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공
(1) 대표적으로 제공하는 표준인터페이스 3가지 기능
- java.sql.Connection - 연결
- java.sql.Statement - SQL을 담은 내용
- java.sql.ResultSet - SQL 요청 응답
- 자바는 이렇게 표준 인터페이스를 정의해 두어서 개발자는 해당 표준 인터페이스만 사용해서 개발하면 됨
- 그런데 인터페이스만 있다고 해서 기능이 동작하는 것은 아니고 JDBC 인터페이스를 각각의 DB벤터(회사)에서 자신의 DB에 맞도록 제공하는데 이것을 JDBC 드라이버라고함
- MySQL DB에 접근할 수 있는 것은 My SQL JDBC 드라이버, Oracle DB에 접근할 수 있는 것은 Oracle JDBC 드라이버라고 함
(2) 드라이버 사용 예시
3) 정리
(1) JDBC의 등장으로 해결된 문제
- 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버의 데이터베이스 사용코드도 함께 변경해야 했던 문제 -> 애플리케이션 로직은 JDBC 표준 인터페이스에만 의존하게 되면서 DB를 다른 종류로 변경해도 JDBC 구현 라이브러리만 변경하면 애플리케이션 서버의 사용 코드를 그대로 유지할 수 있게됨
- 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 그리고 그 결과를 응답 받는 방법을 새로 학습 해야했던 문제 -> 개발자는 JDBC 표준 인터페이스 사용법만 학습하면 수십개의 데이터베이스에 모두 동일하게 적용할 수 있게됨
(2) 표준화의 한계
- JDBC의 등장으로 표준화가되어 많은 것이 편리해 졌지만 각각의 데이터베이스마다 SQL, 데이터타입 등의 일부 사용법이 다름
- ANSI SQL이라는 표준이 있기는 해도 일반적인 부분만 공통화 했기 때문에 한계가 있음
- 대표적으로 실무에서 기본으로 사용하는 페이징 SQL은 각각의 데이터베이스마다 사용법이 다름
- 결국 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 SQL은 해당 데이터베이스에 맞도록 변경해야함
- 참고로 JPA(Java Persistence API)를 사용하면 이렇게 각각의 데이터베이스마다 다른 SQL을 정의해야 하는 문제도 많은 부분 해결 할 수있음
3. JDBC 와 최신 데이터 접근 기술
- JDBC는 1997년에 출시될 정도로 오랜 기술이고 사용하는 방법도 복잡함
- 그래서 JDBC를 직접 사용하기보다는 편리하게 사용하는 다양한 기술이 존재하는데 대표적으로 SQL Mapper와 ORM 기술로 나눌 수 있음
1) SQL Mapper vs ORM 기술
(1) SQL Mapper
- 장점 : JDBC를 편리하게 사용하도록 도와줌 - SQL 응답 결과를 객체로 편리하게 변환, JDBC의 반복 코드를 제거
- 단점: 개발자가 SQL을 직접 작성해야함(어떻게 보면 당연하지만 ORM 기술에 비해서..)
- 대표 기술: 스프링 Jdbc Template, MyBatis
(2) ORM 기술
- 객체를 관계형 데이터베이스 테이블과 매핑해주는 기술
- 이 기술 덕분에 개발자가 반복적인 SQL을 직접 작성하지 않고 ORM 기술이 대신에SQL 동적으로 만들어 실행해 줄 뿐 아니라, 각각의 데이터베이스마다 다른 SQL을 사용하는 문제도 중간에서 해결해줌(각 데이터베이스에 맞춰서 동적으로SQL이 실행됨)
- 대표 기술: JPA, 하이버네이트, 이클립스링크
- JPA는 자바 진영의 ORM 표준 인터페이스이고 이것을 구현한 것으로 하이버네이트와 이클립스 링크 등의 구현 기술이 있음
(3) 비교
- SQL Mapper는 SQL만 직접 작성하면 나머지 번거로운 일은 SQL Mapper가 대신 해결해주고 SQL만 작성할 줄 알면 금방 배워서 사용할 수 있음
- ORM 기술은 SQL 자체를 작성하지 않아도 되어서 개발 생산성이 매우 높아지고 편리한 반면 쉬운 기술은 아니므로 실무에서 사용하려면 깊이있게 학습이 필요함
- 각각의 기술들을 코드로 다 알아볼 예정이지만 JDBD Template는 깊이있게 학습하고 나머지 기술들은 분량이 너무 많으므로 기본적인 요소와, 세팅, 기술들의 장단점을 정리하여 어떤 기술을 언제 사용해야 하는지 알고 필요할 때 찾아서 학습 하는 것이 목표
** 중요
- 이런 기술들 모두 내부에서는 JDBC를 사용하므로 JDBC를 직접 사용하지는 않더라도 JDBC가 어떻게 동작하는기 본 원리를 알아 두어야 함
- 그래야 해당 기술들을 더 깊이 있게 이해할 수 있고 무엇보다 문제가 발생했을 때 근본적인 문제를 찾아서 해결할 수 있음
- 자바 개발자라면 JDBC는 무조건 꼭 알아두어야 하는 필수 기본 기술임
4. 데이터 베이스 연결
- H2 데이터 베이스 서버를 먼저 실행 해두고 실습할 것
1) 데이터 베이스 연결 코드
(1) ConnectionConst
- 데이터 베이스에 접속하는데 필요한 기본 정보를 편리하게 사용할 수 있도록 상수로 정의
package hello.jdbc.connection;
// 생성할 수 없도록 abstract 클래스로 상수를 모아놓은 클래스를 정의
public abstract class ConnectionConst {
// H2 데이터베이스에 접근하는 프로토콜
public static final String URL = "jdbc:h2:tcp://localhost/~/test";
public static final String USERNAME = "sa";
public static final String PASSWORD = "";
}
(2) DBConnectionUtil
- DriverManager.getConnection(...) : 데이터 베이스에 연결(각 url, user, password 정보를 직접 입력해도 됨)
- 이렇게 연결하면 라이브러리에 있는 데이터베이스 드라이버를 찾아서 해당 드라이버가 제공하는 커넥션을 반환해줌
- 해당 실습에서는 H2데이터베이스 드라이버가 작동해서 실제 데이터베이스와 커넥션을 맺고 그 결과를 반환
package hello.jdbc.connection;
@Slf4j
public class DBConnectionUtil {
public static Connection getConnection() {
// 여기에 URL, USERNAME, PASSWORD 입력하면 연결됨 - 아까 상수로 정의한 값 입력
try {
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("get connection={}, class={}", connection, connection.getClass());
return connection;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
(3) 연결 테스트 - DBConnectionUtilTest
- 로그 결과를 보면 class=class org.h2.jdbc.JdbcConnection 부분을 확인 할 수 있는데, 이것이 H2 데이터베이스 드라이버가 제공하는 H2 전용 커넥션이고 해당 커넥션은 JDBC 표준 커넥션 인터페이스 java.sql.Connection 인터페이스를 구현하고 있음
- Connection is broken ..... 이라고 뜨면 H2 데이터베이스가 실행되지 않았거나 설정에 오류가 있는 것...
package hello.jdbc.connection;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
@Slf4j
class DBConnectionUtilTest {
@Test
void connection() {
Connection connection = DBConnectionUtil.getConnection();
Assertions.assertThat(connection).isNotNull(); // null이 아니면 성공
}
}
2) JDBC DriverManager 연결 이해
- JDBC는 java.sql.Connection 표준 인터페이스를 정의하고 H2 데이터 베이스 드라이버는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection 구현체를 제공
- JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고 커넥션을 획득하는 기능을 제공함
(1) 연결 순서
- 애플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출
- DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하며 이 드라이버들에게 순서대로 정보들을 넘겨서 커넥션을 획득할 수 있는지 확인
- URL, 이름, 비밀번호 등 접속에 필요한 추가 정보
- 각각의 드라이버는 URL 정보를 체크해서 본인이 처리할 수 있는 요청인지 확인하고 본인이 처리할 수 있는 URL이라면 실제 데이터 베이스에 연결해서 커넥션을 획득하고 해당 커넥션을 클라이언트에 반환하고 본인이 처리할 수 없다면 다음 드라이버에게 순서가 넘어감
- 예를 들어 url이 jdbc:h2... 로 시작하는 요청이 들어오면 H2 드라이버는 본인이 처리할 수 있으므로 커넥션 획득 - 클라이언트 반환이 이루어지고, 만약 MySQL 드라이버가 먼저 실행 되어서 해당 요청을 받았다면 본인이 처리할 수 없다는 결과를 반환하게 되고 다음 드라이버에게 순서가 넘어감
- 요청 순서는 바뀔 수 있음
- 이렇게 찾은 커넥션 구현체가 클라이언트에 반환됨
'인프런 - 스프링 완전정복 코스 로드맵 > 스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
스프링과 문제 해결 - 트랜잭션, 트랜잭션 템플릿, 트랜잭션 AOP(이해/적용/정리), 스프링 부트의 자동 리소스 등록 (0) | 2024.09.13 |
---|---|
스프링과 문제 해결 - 트랜잭션, 문제점들, 트랜잭션 추상화 및 동기화, 트랜잭션 매니저 (0) | 2024.09.13 |
트랜잭션 이해, 데이터베이스 연결 구조와 DB 세션, 트랜잭션 - DB예제, DB 락, 트랜잭션 적용 (0) | 2024.09.12 |
커넥션 풀과 데이터소스 이해, DataSource 예제1 - DriverManaget, DataSource 예제2 - 커넥션 풀, DataSource 적용 (0) | 2024.09.11 |
JDBC 이해 - JDBC 개발(등록 / 조회 / 수정 / 삭제) (1) | 2024.09.11 |