[Spring] JPA

KwangYong·2021년 10월 4일
0

Spring

목록 보기
5/16

스프링 입문

JPA

JpaMemberRepository.java
❔ Q. jpa를 사용하여 데이터를 가져올 때 findById와 다르게 Name을 가져올 때는 쿼리(JPQL)를 사용하는 이유가 잘 이해가 되지 않습니다.
❕ A. JPA에서 id는 필수값(PK)이며 영속성 컨텍스트에서도 식별을 위해 반드시 필요한값입니다. 그리하여 객체 조회 시 id로 조회가 가능하지만 name필드는 가능하지 않아 쿼리를 사용하여 확인하는 것 으로 이해하시면 될 것 같습니다.

📌 SpringCofig.java에서 db와 연결시켰던 dataSource관련 코드들은 주석 처리했고 EntityManger를 생성했다. 이 경우 스프링부트가 알아서 db와 연결을 해준다.

스프링 데이터 JPA

👨🏻‍🏫 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다.
여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터JPA가 모두 제공합니다.
스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다.
따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다

스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다.
스프링 jpa가 인터페이스(SpringDataJpaMemberRepository)에 대한 구현체를 자동으로 만들어내서 스프링빈에 등록을 해둔다.

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    @Override
    Optional<Member> findByName(String name);
}

JpaRepository 인터페이스에 공통의 메소드들이 이미 다 구현돼있다.

그 외의 메소드는 findByName 처럼 규칙을 가진 이름으로 만들면 알아서 JPQL 쿼리로 만들어준다. 👉🏻 인터페이스 이름만으로 개발이 끝난다.

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
  • 페이징 기능 자동 제공

참고: 실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는
라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적
쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를
사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.

스프링 DB 접근 기술 정리

  • 순수 JDBC
  • 스프링 JdbcTemplate -> 반복되는 코드가 줄어들지만 sql 직접 작성.
  • JPA -> 쿼리를 짤 필요가 없었지만 일부 SELECT할때 JPQL을 작성해야함.
  • 스프링 데이터 JPA -> 아예 구현 클래스를 작성할 필요 없이 인터페이스만으로 구현이 끝남.

##AOP
AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다

해결

  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 이 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다.

프록시 = '가짜'

😎 스프링 입문 완강

profile
바른 자세로 코딩합니다 👦🏻💻

0개의 댓글