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를 사용하면 메서드 이름만으로 감당하기 어려운 복잡한 쿼리도 처리할 수 있다.