Java application과 DB가 소통하기 위한 API
- JDBC Driver : Java와 특정 DB 간의 연결을 가능하게 해주는 소프트웨어
- Connection : DB와의 실제 연결을 나타낸다. => DB에 명령 전달
- Statement : SQL쿼리를 실행하기 위한 객체 => SQL문 실행
- ResultSet : SELECT쿼리를 통해 얻은 결과 데이터를 담은 객체 => DB에서 읽은 정보를 application에 적용
- Connection을 맺는다
- DB와 Java application 연결 설정
- 쿼리를 작성한다
- SQL 쿼리는 String 형태로 작성해서 전달
- PreparedStatement : 쿼리를 변수로 설정하는 것. 코드가 더 안전해지고, SQL Injection 공격(쿼리를 조작해 이상한 명령이 실행되게 하는거..)도 예방
- SQL쿼리를 처음 실행할 때 DB에서 미리 컴파일한다. 이후 동일한 쿼리를 여러번 실행할때는 이미 컴파일된 쿼리를 재사용한다.(속도 빨라짐)
- 값이 문자열이나 숫자로만 해석된다(인젝션 방지)
- 쿼리를 요청한다
- 객체를 사용하여 SQL문을 실행하면 DB가 결과를 돌려준다.
- 응답을 클래스에 바인딩한다
- DB에서 받아온 데이터를 Java 객체에 맞게 변환하는 과정이다. ResultSet을 통해 각 열과 행의 데이터를 읽고, 필요한 경우 Java 객체로 변환하여 사용한다.
- Connection을 종료한다
- DB와의 연결은 제한된 자원이기 때문에 사용 후 반드시 반환하여 리소스를 절약해야한다.
ORM을 표준화한 인터페이스
JPA의 구현체 중 하나
- 객체 지향 프로그래밍에서 사용하는 객체를 DB의 테이블과 연결
- JPA는 ORM을 위한 자바 표준 Interface이고, Hibernate는 JPA를 구현한 ORM 프레임워크.
- SQL을 직접 작성하지 않고 객체와 데이터베이스 테이블 간의 매핑을 설정하고 CRUD작업을 도와준다.
- FK를 강제한다 -> 테이블 간의 관계를 DB 수준에서 강제하여 잘못된 참조 데이터가 들어가는 것을 방지하겠다는 의미이다.
DB에서 처리 흐름을 보장하는 장치
- 트랜잭션이 성공적으로 완료되면 모든 변경 사항을 DB에 커밋하고, 예외가 발생하면 롤백하여 이전 상태로 돌아간다.
- 데이터를 조회만 한다면 생략하는게 좋다.
- DB 변경이 발생하지 않기 때문에 굳이 묶어서 작업할 필요가 없다.
- DB 조회하는 동안에도 잠금을 사용해 자원을 보호하면 서버 자원이 불필요하게 사용되므로 성능에 좋지 않다.