JDBC를 사용해서 데이터 읽고 쓰기#
- 관계형 데이터를 사용할 경우 자바 개발자들이 가장 많이 사용하는 두 가지 방법은 JDBC와 JPA다.
- 스프링의 JDBC 지원은
JdbcTemplate
클래스에 기반을 둔다. JdbcTemplate
은 JDBC를 사용할 때 요구되는 모든 형식적이고 상투적인 코드없이 개발자가 관계형 데이터베이스에 대한 SQL 연산을 수행할 수 있는 방법을 제공한다.- connection 생성, statement 생성
- connection, statement, result set 닫기
SQLException
예외 처리SQLException
은 checked 예외지만 대부분의 흔한 문제들은 catch 블록에서 해결될 수 없으므로 현재 메서드를 호출한 상위 코드로 처리를 넘겨야 한다.
JdbcTemplate 사용하기#
JdbcTemplate
를 사용하려면 JDBC 스타터 의존성을 빌드 명세에 추가하면 된다.query()
- 첫 번째 인자: SQL
- 두 번째 인자:
RowMapper
인터페이스를 구현한 함수. 이 함수는 쿼리로 생성된 모든 결과 세트의 행 개수만큼 호출되며, 결과 세트의 모든 행을 각각 객체로 생성하고 List
에 저장후 후 반환한다.
queryForObject()
: query()
와 동일하게 실행되지만, List
를 반환하는 대신 하나의 객체만 반환한다.- 첫 번째 인자: SQL
- 두 번째 인자:
RowMapper
인터페이스를 구현한 함수. - 세 번째 인자: SQL에 있는 물음표 대신 교체될 값 인자
update()
: 결과 세트의 데이터를 객체로 생성할 필요가 없다.
타코와 주문 데이터 추가하기#
JdbcTemplate
을 사용해서 데이터를 저장하는 방법 2가지- 직접
update()
메서드를 사용한다. SimpleJdbcInsert
래퍼 클래스를 사용한다.
KeyHolder
객체는 데이터를 추가한 것의 키 값을 제공한다.@SessionAttributes
: 다수의 HTTP 요청에 걸쳐서 존재해야되는 모델이 필요할 때 사용할 수 있다.SessionStatus
: 세션을 재설정할 때 사용할 수 있다.sessionStatus.setComplete()
Converter
: 스프링이 제공하는 인터페이스로 이를 구현해서 @Component
로 빈등록하면 요청을 받을 때 타입을 변환해준다.
스프링 데이터 JPA를 사용해서 데이터 저장하고 사용하기#
- 스프링 데이터 프로젝트는 여러 개의 하위 프로젝트로 구서오디는 다소 규모가 큰 프로젝트다.
- 대부분의 하위 프로젝트는 다양한 데이터베이스 유형을 사용한 데이터 퍼시스턴스에 초점을 둔다.
- 스프링 데이터 JPA: 관계형 데이터 베이스의 JPA 퍼시스턴스
- 스프링 데이터 MongoDB: 몽고 문서형 데이터베잏스의 퍼시스턴스
- 스프링 데이터 Neo4: Neo4j 그래프 데이터베이스의 퍼시스턴스
- 스프링 데이터 Redis: 레디스 키-값 스토어의 퍼시스턴스
- 스프링 데이터 Cassandra: 카산드라 데이터베이스의 퍼시스턴스
스프링 데이터 JPA를 프로젝트에 추가하기#
- 스프링 부터 데이터 JPA 스타터에는 JPA를 구현한 Hibernate까지도 포함되어 있다.
도메인 객체에 애노테이션 추가하기#
- JPA 개체로 선언하려면 반드시
@Entity
애노테이션을 추가해야 한다. - id 속성에는 반드시
@Id
를 지정하여 이 속성의 데이터베이스의 개체를 고유하게 식별한다는 것을 나타내야 한다. - JPA에서는 개체가 인자가 없는 생성자를 가져야 한다.
- 개체 간의 관계를 선언하기 위해
@ManyToMany
애노테이션을 지정할 수 있다. - id 속성에 데이터베이스가 자동으로 생성해 주는 ID 값이 필요해서
GenerationType.AUTO
로 설정된 @GeneratedValue
애노테이션이 지정된다. @PrePersist
애노테이션으로 객체가 저장되지 전에 실행할 함수를 정의할 수 있다.@Table
애노테이션을 통해 개체가 저장되어야할 데이터베이스 테이블을 지정할 수 있다.
JPA 리퍼지터리 선언하기#
- 스프링데이터에서는 리퍼지터리가 제공하는 메서드를 우리가 명시적으로 선언하는대신
CrudRepository
인터페이스를 확장할 수 있다. CrudRepository
인터페이스에는 데이터베이스의 CRUD 연산을 위한 많은 메서드가 선언되어 있다.- 첫 번째 매개변수는 리퍼지터리에 저장되는 개체 타입
- 두 번째 매개변수는 개체 ID 속성의 타입
- 스프링 데이터 JPA는 애플리케이션이 시작될 때 각 인터페이스 구현체를 자동으로 생성해준다.
JPA 리퍼지터리 커스터마이징하기#
- 스프링 데이터는 리퍼지터리 구현체를 생성할 때 인터페이스에 정의된 메서드를 찾아 메서드 이름을 분석하여, 저장되는 객체의 컨텍스트에서 메서드의 용도가 무엇인지 파악한다.
- 스프링 데이터는 일종의 DSL을 정의하고 있어서 퍼시스턴스에 관한 내용이 리퍼지터리 메서드의 시그니처에 표현된다.
@Query
를 사용하면 메서드 이름만으로 감당하기 어려운 복잡한 쿼리도 처리할 수 있다.
comments powered by