studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 패키지 구조
  • core
  • datasource
  • object
  • support
  • 사용법
  • 접근 방식 선택
  • JdbcTemplate
  1. Spring 관련 정리

Spring JDBC

JDBC를 쓸 때 개발자가 해야되는 여러 low-level 작업들을 스프링에서 대신 처리해주는 모듈이다. 주로 connection 관리, SQL문 실행 및 결과 정리, 예외처리, 트랜잭션 처리 등을 도와준다.

패키지 구조

core

JdbcTemplate 클래스와 수많은 callback 인터페이스들, 그리고 관련된 각종 클래스들을 포함하고 있다. 이 아래에 또 simple, namedparam 패키지 등이 존재하며 각각 JdbcTemplate를 좀 더 사용하기 쉽게 만든 클래스들이 들어있다.

datasource

DataSource 에 쉽게 접근할 수 있게 도와주는 유틸리티 클래스들을 포함하고 있다. 또한 간단한 DataSource 구현체들도 여기에 들어가있어 테스트에 쓸 수 있다. 아래에 embedded 패키지가 있어 embedded database를 쓸 수 있게 도와준다.

object

재사용 가능하고 thread-safe한 자바 객체로 RDBMS의 query, update, stored procedure 등을 사용할 수 있게 도와주는 클래스들을 포함하고 있다.

support

일부 유틸리티 클래스들과 SQLException을 처리하는 기능을 포함하고 있다. 스프링에서는 JDBC 사용 중 발생하는 에러들을 org.springframework.dao 패키지 아래에 있는 exception으로 바꿔준다.

사용법

접근 방식 선택

  1. JdbcTemplate : 기본적이며 가장 많이 쓰이는 방식. 또한 가장 "lowest level" 한 접근 방식이기도 하다. 나머지들은 모두 이 JdbcTemplate를 wrapping한 것이나 다름 없다.

  2. NamedParameterJdbcTemplate : 전통적인 JDBC의 "?" placeholder들에다가 이름을 붙일 수 있게 한 것.

  3. SimpleJdbcInsert, SimpleJdbcCall : 데이터베이스의 metadata들을 사용해서 필요한 설정들이 최소로 되도록 최적화한 것들이다. 테이블이나 프로시져의 이름과 column에 알맞는 데이터를 map으로 넣는 것 만으로 사용할 수 있어 간편하다. 다만 적절한 metadata가 있고 또 해당 데이터베이스를 지원하는 경우에만 그렇게 사용할 수 있다는게 흠이다. 그렇지 않다면 자기가 직접 설정을 입력해 넣어야만 한다.

  4. RDBMS Objects : MappingSqlQuery, SqlUpdate, StoredProcedure 등이 있다. 재사용 가능하고 thread-safe한 객체들을 생성하여 사용한다. query string을 넣고, 패러미터들을 정의하고, 컴파일하면 사용준비가 완료되며, 이렇게 한번 만들고 나면 패러미터를 바꿔가며 몇번이고 재사용할 수 있게 된다.

JdbcTemplate

JdbcTemplate를 사용하기 위해서는 우선 적절한 DataSource를 만드는 것이 우선이다. 일반적인 데이터베이스들은 자신들의 DataSource를 이미 지원하고 있으므로 적절히 설정하여 bean으로 등록해두는 것이 좋다. 보통은 BasicDataSource로 충분하다.

JdbcTemplate는 이미 thread-safe하기 때문에 멀티쓰레딩 환경에서도 문제 없이 동작한다. 그러므로 여러 객체를 만들어 쓸 일이 좀처럼 없다. 다만, 만약에 여러 데이터베이스들에 동시에 접근한다면 그 땐 각 DataSource마다 JdbcTemplate객체를 새로 생성해야할 것이다.

사용

@Repository
public class MyRepository {
  private final JdbcTemplate jdbcTemplate;
  private final MyObjectMapper myObjectMapper;

  @Autowired
  public MyRepository(DataSource myDataSource) {
    this.jdbcTemplate = new JdbcTemplate(myDataSource);
    this.myObjectMapper = new MyObjectMapper();
  }

  public MyObject read(int id) {
    return jdbcTemplate.queryForObject(
      "select * from my_table where id = ?",
      new Object[]{id},
      myObjectMapper
    );
  }

  public List<MyObject> readAll() {
    return jdbcTemplate.query(
      "select * from my_table",
      myObjectMapper
    );
  }

  private static class MyObjectMapper implements RowMapper<MyObject> {
    @Override
    public MyObject mapRow(ResultSet rs, int rowNum) throws SQLException {
      return new MyObject(rs.getString("param1"), rs.getString("param2"));
    }
  }
}

select는 query() insert, update, delete는 update() 그 외에 임의의 SQL문이나 DDL문들은 execute() 메소드를 사용하면 된다.

PreviousSpring Test Dynamic @ScheduledNextSpring Validation

Last updated 7 years ago