JDBC 드라이버는 DriverManager라는 클래스를 통해서 로딩
Connection 객체 생성
DriverManager를 통해 데이터베이스와 연결되는 세션(Session)인 Connection 객체를 생성
Statement 객체 생성
Statement 객체는 작성된 SQL 쿼리문을 실행하기 위한 객체로써 객체 생성 후에 정적인 SQL 쿼리 문자열을 입력으로 가진다.
생성된 Statement 객체를 이용해서 입력한 SQL 쿼리를 실행
실행된 SQL 쿼리문에 대한 결과 데이터 셋입니다.
JDBC API를 통해 사용된 객체들은 사용 이후에 사용한 순서의 역순으로 차례로 Close
CrudRepository<Message, Long>
CrudRepository
는 데이터베이스에 CRUD(데이터 생성, 조회, 수정, 삭제) 작업을 진행하기 위해 Spring에서 지원해주는 인터페이스Message
: 엔티티 클래스 객체에 담긴 데이터를 데이터베이스 테이블에 CRUDLong
: 식별자를 의미하는 @Id
애너테이션이 붙어있는 멤버 변수의 데이터 타입테이블명
에 해당한다.@Id
애너테이션을 추가한 멤버 변수 → 고유 식별자 역할 , DB의 Primary key로 지정한 컬럼
에 해당‘message_id’
컬럼에 AUTO_INCREMENT
설정이 되어 있으므로 ‘message_id’
컬럼에 값을 입력하지 않더라도 데이터가 저장이 될 때 마다 자동으로 포함이 된다application.properties
또는 application.yml
파일의 설정 정보 등록을 통해 데이터베이스 설정, 데이터베이스의 초기화 설정 등의 다양한 설정을 할 수 있다.spring:
h2:
console:
enabled:truepath: /h2
datasource:
url: jdbc:h2:mem:test
sql:
init:
schema-locations: classpath*:db/h2/schema.sql // (1) 테이블 생성 파일 경로
@Table
애너테이션을 추가하지 않으면 기본적으로 클래스명이 테이블의 이름과 매핑@Table(”NAME”)
와 같이 테이블 이름을 변경가능AggregateReference
클래스로 한번 감싸주는 방법으로 구현AggregateReference
클래스는 테이블의 외래키처럼 다른 객체의 ID 값을 참조할 수 있도록 해준다.private AggregateReference<Member, Long> memberId
@MappedCollection
애너테이션의 역할@MappedCollection(idColumn = "ORDER_ID")
idColumn
애트리뷰트는 자식 테이블에 추가되는 외래키에 해당되는 컬럼명AggregateReference
로 Id를 감쌀 필요가없다.find + By
+ SQL 쿼리문에서 WHERE 절의 컬럼명
+ (WHERE 절 컬럼의 조건이 되는 데이터)
Optional
을 지원하기 때문에 리턴값을 Optional로 래핑할 수 있다findByxxxx
에서 사용하는 컬럼명은 반드시 엔티티 클래스의 멤버 변수명을 적어주어야 한다개발자가 직접 쿼리문을 작성해서 질의를 할 수 있도록 해준다.
ex) @Query("SELECT * FROM COFFEE WHERE COFFEE_ID = :coffeeId")
:coffeeId
는 findByCoffeeId(Long coffeeId)
의 coffeeId
변수 값이 채워지는 동적 쿼리 파라미터(named parameter)Spring Data JDBC에서 내부적으로 Java의 리플렉션 기술과 Proxy 기술을 이용해서 Repository
인터페이스의 구현 클래스 객체를 생성해준다.
비즈니스 로직에서 어떤 검증이 필요한 로직은 별도의 로직으로 추출해서 검증 메서드에 검증을 해달라고 요청하는 것이 코드의 간결성과 가독성을 향상시킨다.
Spring Data JDBC에서는 @Id
애너테이션이 추가된 엔티티 클래스의 멤버 변수 값이 0 또는 null이면 신규 데이터라고 판단하여 테이블에 insert
쿼리를 전송합니다.
반면에 @Id 애너테이션이 추가된 엔티티 클래스의 멤버 변수 값이 0 또는 null이 아니라면 이미 테이블에 존재하는 데이터라고 판단하여 테이블에 update
쿼리를 전송
findAll()
메서드의 리턴값은 Iterable<T>
이다. 알맞은 타입으로 캐스팅필요!
orElseThorow()
는 객체가 null 이 아니라면 해당 객체를 리턴하고 null이라면 예외를 던집니다