Persistence without JPA

웰시고기·2021년 2월 17일
0

JPA VS JDBC

  • JPA
    - 편리함
    • 자바로 이루어진 테이블 관계
    • 코드 자동 생성
  • JDBC
    - 속도가 더 빠를 수 있다.
    - 데이터베이스로 이루어진 테이블 관계
    • SQL을 사용

=> 속도면에서 JDBC가 조금 더 빠를 수 있다. 하지만 이 차이가 사용자에게 지장을 줄 만큼 큰 차이가 아니다. 오히려 유지보수 면에서 개발자가 들이는 시간이 JDBC가 더 클 수 있다. 따라서 속도가 느린 일부분만 JDBC만 사용하는 방법도 있다.

JPA에서 성능을 측정하는 방법

  • spring.jpa.properties.hibernate.generate_statistics=true를 통해 몇개의 JDBC가 실행되었고 시간이 얼마나 걸렸는지 알 수 있다.
  • logging.level.org.hibernate.stat=DEBUG을 해야 콘솔에 출력된다.
  • hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS=25를 통해 특정 시간 이상 걸린 쿼리를 확인할 수 있다. 단 Hibernate 5.4.5 이상에서 지원한다.

SQL을 통한 초기화

  • src/main/resources에 schema.sql 혹은 data.sql을 통해 가능하다.
    - schema.sql : 스키마를 생성
    • data.sql : schema.sql의 실행이 끝난 후 실행. 테이블의 데이터를 생성
  • 아래의 설정이 되어있어야한다.
spring.datasource.initialization-mode= always
spring.jpa.hibernate.ddl-auto= none

Data Access Object(DAO)

  • DAO는 Repository pattern의 대체이다.
  • DAO는 테이블과 관련된 CRUD 등의 다양한 방식으로 데이터에 접근하는 객체이다.
  • 반면에 Repository는 Entity를 통해 데이터베이스를 조작한다.

JdbcTemplate

  • JdbcTemplate을 통해 연결하거나 쿼리를 실행, 트랜잭션과 같은 기능을 수행할 수 있다.
  • 다음과 같은 방식으로 SELECT문을 실행할 수 있다.
@Autowired
NamedParameterJdbcTemplate jdbcTemplate;

private static final String SELECT_PERSON_BY_ID = 
   "SELECT * FROM person " + 
   "WHERE id = :id";

public PersonData getPersonById(Long id){
   return jdbcTemplate.queryForObject(
           SELECT_PERSON_BY_ID,
           new MapSqlParameterSource().addValue("id", id),
           new BeanPropertyRowMapper<>(PersonData.class));
}
  • 다음과 같은 방식으로 INSERT문을 실행할 수 있다.
private static final String INSERT_PERSON = 
   "INSERT INTO person (name, age, favorite_composer) " + 
   "VALUES(:name, :age, :favoriteComposer)";

public Long addPerson(PersonData personData) {
   KeyHolder key = new GeneratedKeyHolder();
   jdbcTemplate.update(
           INSERT_PERSON,
           new BeanPropertySqlParameterSource(personData),
           key);
   return key.getKey().longValue();
}

0개의 댓글