스프링 입문 - 스프링 DB 접근 기술

hyuk·2023년 10월 7일
0
post-thumbnail

H2 데이터베이스를 활용하여 스프링 DB 접근 기술에 대해 알바보자

H2 데이터베이스는 개발/테스트 용도로 가볍고 편리하며, 로컬 DB로 사용하기 유용

📌 JdbcTemplate

MyBatis와 같은 라이브러리인 JdbcTemplate 라이브러리를 알아보자. JDBC API로 직접 코딩을 하지 않고, JDBC를 보다 더 쉽게 다룰 수 있도록 해주는 라이브러리로, 반복적인 코드를 대부분 제거해주는 특징을 가지고 있다. 하지만 JDBC와 동일하게 SQL Query는 직접 작성해야 한다.

JDBC(Java Database Connectivity) : 자바 프로그램과 DB와 연결해주는 응용 프로그램 인터페이스


📌 JPA

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

Spring Data JPA를 사용하게 되면 구현 클래스 없이 인터페이스만으로도 구현을 할 수 있다는 것이다. 기본적인 CRUD와 조회 기능이 제공된다는 특징도 가지고 있다.

main/.../repository/SpringDataJpaMemberRepository


public interface SpringDataJpa.. extends JpaRepository<Member,Long>, MemberRepository {
 		Optional<Member> findByName(String name);
	}

스프링이 Proxy 기술을 통해 구현체를 생성하여 , 스프링 빈으로 등록한다.
JPASpring Data JPA를 주로 사용하고, 동적 쿼리는 Querydsl 라이브러리를 사용한다.

위와 같이 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, JdbcTemplate를 사용하면 된다.

Spring Data JPAJPA를 편리하게 사용하게 해주는 기술로, JPA 학습이 먼저 ! ! !


📌 AOP

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 접근 기술 통해 학습한 내용을 요약 및 정리한 것입니다.

profile
차곡차곡쌓아가는학습노트

0개의 댓글