티스토리 뷰

JVM/Spring

[Spring] JPA

글을 쓰는 개발자 2021. 10. 9. 16:34
반응형

JPA

Java Persistence API 로서 영속성 프로그래밍을 위한 라이브러리

영속성: 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 의미

 

스프링에서는 JPA를 구현한 프레임워크는 대표적으로 Hibernate가 있고 그 이외에도 EclipseLink, DataNucleus 등이 존재한다. 

 

hibernate

자바 언어를 위한 객체 관계 매칭 프레임워크, 객체 지향 도메인 모델을 관계형 데이터베이스로 매핑을 위한 프레임워크

 

 

 

ORM

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미

  • 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용
  • 사용하는 언어가 들ㄴ 것에 대한 불일치를 해결
  • Persistence API라고도 불린다.

장점

  • 비즈니스 로직에 좀 더 집중할 수 있게 해준다.
  • SQL Query보다 좀 더 개발자가 객체 모델에 집중할 수 있게 해준다.
  • 코드의 양이 급격하게 줄어든다.
  • 객체 지향적인 접근이 좀 더 용이해진다.
  • 재사용 및 유지보수의 편리성 증가
  • DBMS에 대한 종속성이 줄어든다. => 이건 ORM 뿐만 아니라 기본적인 MyBatis에서도 해당되는 특징중 하나

 

단점

  • 제대로 작성하지 않는 경우 속도 저하 및 성능에 대하여 큰 문제점이 생길 수 있다.
  • 쿼리가 커질 경우 튜닝이 필요한 경우가 있다.
  • DBMS 만의 편리한 고유 기능을 사용하지 못한다.
  • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다. (프로시저란 SQL Server에서 제공하는 프로그래밍 기능)

ORM을 써본 느낀 점은 SQL에 대해서 제대로 알지 못해도 비즈니스 로직에 맞게 구현한다는 것이 가장 크게 느꼈던 장점이었다.

단점으로는 Query문으로 작성할 때에는 비교적 쉽게 구현할 수 있지만 ORM으로 구현하고자 할 때 복잡해진다.(정확히는 해당 프레임워크에 대한 정확한 지식이 없어서).

 

 

lazy loading: 필요한 시점에 쿼리를 날리는 전략

Account user1 = accountRepository.findById(1);    //SELECT * FROM ACCOUNT WHERE ID = 1 
Account user2 = accountRepository.findById(2);    //SELECT * FROM ACCOUNT WHERE ID = 2
...
...

 

즉시 로딩: JOIN SQL로 한 번에 연관된 객체까지 미리 조회하는 전략

장고로는 prefetch_related와 유사한 것 같다..

Rountine routine = routineRepository.find(routineId); // SELECT A.*,B.* FROM ROUTINE A JOIN ACCOUNT B

 

Entity 설정

  • 데이터베이스 스키마 설정에서 주의할 점 
    • 운영 장비에는 절대 CREATE, CREATE-DROP, UPDATE를 사용하면 안된다.
      • 테스트서버에서도 UPDATE OR VALIDATE를 권장
      • 그 이유는 데이터가 많은 상태에서 alter를 했을 때 시스템이 다운이 될 수 있기 때문이다.
    • Enumerated
      • EnumType.STRING만 사용하는 것을 권장 

save 함수

@Transactional
    public <S extends T> S save(S entity) {
        if (this.entityInformation.isNew(entity)) {
            this.em.persist(entity);
            return entity;
        } else {
            return this.em.merge(entity);
        }
    }

위와  같이 구현되어 있는데 해당 엔티티가 새로운 것이냐 아니냐에 따라 persist, merge가 적용된다.

persist는 우리가 아는 create와 비슷한 상황이고 merge는 update와 비슷한 역할을 한다고 보면 된다.

참고:

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함