[springboot] DBJPA

yyy·2024년 2월 28일

playdata

목록 보기
2/4

DTO, DAO, Repository, Entity

  • springboot 서비스 구조

  • Entity(Domain)

    • DB 테이블에 존재하는 column들을 필드로 가지는 객체를 뜻함

      DB의 Employee테이블에 id, name, age라는 column들이 있다. 이에 대응하는 Entitiy클래스 Employee는 위와 같은 필드들만 가져야한다.
  • Repository

    • Entity에 의해 생성된 DB에 접근하는 메소드를 사용하기 위한 인터페이스
    • Service와 DB를 연결하는 고리의 역할 수행
    • DB에 적용하고자 하는 CRUD(create,read,update,delete)를 정의하는 영역
  • DAO(data access object)

    • DB에 접근하는 객체를 의미
    • service가 DB에 연결할 수 있게 해주는 역할
    • DB를 사용해서 데이터를 조회하거나 조작하는 기능을 전달
  • DTO(data transfer object)

    • DTO는 VO(value object)로 불리기도하며, 계층간 데이터교환을 위한 객체를 의미
    • VO의 경우 read only의 개념을 가지고 있음

ORM(object relational mapping)

  • 어플리케이션의 객체(spring boot application)와 관계형데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미
    • java의 데이터클래스와 관계형데이터베이스의 테이블을 매핑
  • 객체지향 프로그래밍과 관계형 데이터베이스의 차이로 발생하는 제약사항을 해결해주는 역할을 수행
  • 대표적으로 JPA

ORM의 장점

  • SQL 쿼리가 아닌 직관적인 코드로 데이터를 조작할 수 있음
  • 재사용 및 유지보수가 편리
    • ORM은 독립적으로 작성되어있어 재사용이 가능
    • 매핑정보를 명확하게 설계하기 때문에 따로 데이터베이스를 볼 필요가 없음
  • DBMS에 대한 종속성이 줄어듦
    • DBMS를 교체하는 작업을 비교적 적은 리스크로 수행 가능

ORM의 단점

  • 복잡성이 커질경우 ORM만으로 구현하기 어려움
    • 직접 쿼리를 구현하지 않아 복잡한 설계가 어려움
  • 잘못 구현할 경우 속도 저하 발생
  • 대형 쿼리는 별도의 튜닝이 필요할 수 있음

JPA (java persistance API)

  • JPA는 ORM과 관련된 인터페이스의 모음
  • java진영에서 표준 ORM으로 채택되어있음
  • ORM이 큰 개념이라고 하면,JPA는 더 구체화 시킨 스펙을 포함하고 있음

Hibernate

  • ORM의 framework중 하나
  • JPA의 실제 구현체 중 하나이며, 현재 JPA구현체 중 가장 많이 사용됨

Spring Data JPA

  • spring framework에서 JPA를 편리하게 사용할 수 있게 지원하는 라이브러리
    • CRUD(create, read, update, delete) 처리용 인터페이스 제공
    • repository개발시 인터페이스만 작성하면 구현 객체를 동적으로 생성해서 주입
    • 데이터 접근 계층(DAO) 개발시 인터페이스만 작성해도 됨

JPA Query Method

spring data JPA는 메소드 이름으로 쿼리 생성을 하는 쿼리 메소드 기능 제공

  • 쿼리 메서드는 메서드의 이름을 분석해서 JPQL쿼리를 실행
  • 쿼리 메서드를 활용하면 쉽게 쿼리문을 만들어 사용할 수 있다.
  • query method는 JpaRepository를 상속하는 것만으로도 jpa의 method들을 사용할 수 있다.
public interface UserRepository extends JpaRepository<User, Long> {}

-> JpaRepository<User, Long>에서 User는 jpa로 사용할 entity(class), Long은 해당 클래스의 pk(primary key, 기본키)타입이다.

select

  • 아래의 메서드들은 모드 select query의 일을 하는 메서드들이다.
  • 이름은 "find(get,ready)By변수명" 으로 만든다. 그러면 자동으로 select query method가 만들어진다.
    User findByEmail(String email);
    User getByEmail(String email);
    User readByEmail(String email);
    User queryByEmail(String email);
    User searchByEmail(String email);
    User streamByEmail(String email);
    User findUserByEmail(String email);

And, Or

   List<User> findByNameAndEmail(String name, String email);
   List<User> findByNameOrEmail(String name, String email);

Is(Not)Empty, Is(Not)Null

	List<User> findByIdIsNotNull();  // Id값에 Null값이 없는지?
    List<User> findByAddressIsNotEmpty();

In

 List<User> findByNameIn(List<String> name);

StartingWith/EndingWith/Containing/Like


List<User> findByNameStartingWith(String name);
List<User> findByNameEndingWith(String name);
List<User> findByNameContains(String name);
List<User> findByNameLike(String name);

Is, Equals

    Set<User> findUserByNameIs(String name);
    Set<User> findUserByName(String name);
    Set<User> findUserByNameEquals(String name);

Sorting

List<User> findTop1ByNameOrderByIdDesc(String name); 
// Id로 내림차순으로 정렬 후 입력 name과 같은 것의 맨 위의 있는 값을 뽑아온다.

List<User> findFirst2ByNameOrderByIdDescEmailAsc(String name);
// 여러개의 조건으로 find하는 경우는 And를 사용하였으나 정렬 조건으로 여러개의 값을 사용하는 경우는 And를 사용하지 않고 조건을 이어서 붙인다.

List<User> findFirstByName(String name, Sort sort);

0개의 댓글