H2 데이터베이스를 활용하여 스프링 DB 접근 기술에 대해 알바보자
H2 데이터베이스는 개발/테스트 용도로 가볍고 편리하며, 로컬 DB로 사용하기 유용
MyBatis와 같은 라이브러리인 JdbcTemplate 라이브러리를 알아보자. JDBC API로 직접 코딩을 하지 않고, JDBC를 보다 더 쉽게 다룰 수 있도록 해주는 라이브러리로, 반복적인 코드를 대부분 제거해주는 특징을 가지고 있다. 하지만 JDBC와 동일하게 SQL Query는 직접 작성해야 한다.
JDBC(Java Database Connectivity)
: 자바 프로그램과 DB와 연결해주는 응용 프로그램 인터페이스
JPA(Java Persistence API)는 JdbcTemplate의 가지고 있는 반복적인 코드를 제거해주는 특징과 함께 기본적인 SQL도 JPA가 자동으로 처리해준다. 즉, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있게 되면서 개발 생산성을 크게 높일 수 있다.
또한, ORM(Object Relational Mapping)
기술 표준인 JPA를 통한 데이터 변경이 이루어질 때 트랜잭션 안에서 실행되어야 하는데 이와 관련된 애노테이션인 @Transectional
이 있다.
JPA는 인터페이스로, 이를 구현한 것이 Hibernate이다. 즉, 인터페이스를 구현한 클래스로 이해하면 보다 더 수월할 것이다.
Object를 어떻게 Mapping 하는가?
@Entity
애노테이션을 활용하게 되면, 해당 메소드를 JPA가 관리하는 Entity라 표현.- 추가로, DB에서 pk로 설정해놓은 값을
@Id
와 같은 애노테이션을 통해 Mapping 한다.
Spring Data JPA
를 사용하게 되면 구현 클래스 없이 인터페이스만으로도 구현을 할 수 있다는 것이다. 기본적인 CRUD와 조회 기능이 제공된다는 특징도 가지고 있다.
main/.../repository/SpringDataJpaMemberRepository
public interface SpringDataJpa.. extends JpaRepository<Member,Long>, MemberRepository {
Optional<Member> findByName(String name);
}
스프링이 Proxy 기술을 통해 구현체를 생성하여 , 스프링 빈으로 등록한다.
JPA
와 Spring Data JPA
를 주로 사용하고, 동적 쿼리는 Querydsl
라이브러리를 사용한다.
위와 같이 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, JdbcTemplate
를 사용하면 된다.
Spring Data JPA
는JPA
를 편리하게 사용하게 해주는 기술로,JPA
학습이 먼저 ! ! !
AOP는 Aspect Oriented Programming
의 약자로, 관점 지향 프로그래밍을 뜻한다.
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString()+ " " + timeMs + "ms");
}
}
}
위 코드와 같이 모든 메소드의 호출 시간을 측정하고 싶은 때, 모든 메소드에 시간을 측정하는 로직을 넣기에는 비효율적이다.
이러한 상황에서 필요한 것이 AOP이다. AOP를 통해 공통적으로 구현해야하는 기능을 반복 작성하지 않아도 되며, 유지보수에 효율적이다.
@Aspect
애노테이션을 사용한 클래스를 스프링 빈으로 등록하며, @Around
애노테이션을 사용하여 메소드가 실행되기 전과 실행된 후에서 동작한다.
스프링 AOP는 Proxy
기반으로, 스프링 빈으로 등록된 객체를 호출하는 것이 아닌 프록시 객체를 호출하게 된다.
Proxy
와 스프링 AOP의 관계는 어떻게 되는지 추후에 학습하고자 한다.
📌 본 포스트는 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 통해 학습한 내용을 요약 및 정리한 것입니다.