일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java set 출력
- java기본자료형
- java map 출력
- 비전공자sqld
- java참조자료형
- sqld자격증합격
- 항해99후기
- 작은수제거하기
- java list 저장
- java map 저장
- java map
- 프로그래머스
- 프로그래머스제일작은수
- 노베이스부트캠프
- 인터프린터언어
- javaJVM
- java 자료구조 활용
- javaJRE
- java알고리즘문제풀이
- java list 출력
- 항해15기
- 격파르타후기
- java최솟값구하기
- 컴파일
- 코딩부트캠프후기
- 격파르타비전공자
- 격파르타합격후기
- 격파르타장점
- java알고리즘
- java set 저장
- Today
- Total
코딩과 결혼합니다
230710 - Spring : JPA 와ORM 본문
JPA( Java Persistence API)
JPA
JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세이다. 즉, 인터페이스의 모음이다. 이러한 JPA 인터페이스를 구현한 대표적인 프레임워크가 하이버네이트(Hibernate)이다.JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓸 필요가 없다.
🌱 Spring Data JPA
Spring framework에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈)이다. Spring Data JPA의 목적은 JPA를 사용할 때 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.
Spring Data JPA는 JPA Provider이 아니다. 단지 데이터 계층에 접근하기 위해 필요한 뻔한 코드들의 사용을 줄여주도록 하는 인터페이스이다. 여기서 반드시 기억해야할 점은 Spring Data JPA는 항상 하이버네이트와 같은 JPA provider가 필요하다는 것이다.
* Spring Data JPA) Repository 생성
public interface ProductRepository extends JpaRepository<Product, Long> {
}
* Spring Data JPA) Repository 기본 제공 기능
// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);
// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();
// 3. 상품 전체 개수 조회
long count = productRepository.count();
// 4. 상품 삭제
productRepository.delete(product);
* Spring Data JPA) 추가기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신한다.
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) 회원 ID 로 등록된 상품들 조회
List<Product> findAllByUserId(Long userId);
// (2) 상품명이 title 인 관심상품 1개 조회
Product findByTitle(String title);
// (3) 상품명에 word 가 포함된 모든 상품들 조회
List<Product> findAllByTitleContaining(String word);
// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
ORM (Object Relational Mapping)
ORM : 객체가 테이블이 되도록 매핑 시켜주는 것.
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 객체 모델과 관계형 모델 간에 불일치가 존재한다. ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
🌱 패러다임 불일치
객체 지향 프로그래밍과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제를 패러다임 불일치라고 한다. 패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.
객체 지향
-필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
-객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
관계형 데이터베이스
-데이터를 잘 정규화해서 보관하는 것이 목표
장점
- ORM을 이용하면 SQL Query가 아닌 직관적인 코드로서 데이터를 조작할 수 있다.
- query를 직접 작성하지 않고 메서드 호출만으로 query수행
- ex) SELECT * FROM user; ➡️ user.findAll()
- 재사용 및 유지보수의 편리성이 증가한다.
- ORM은 독립적으로 작성되어 있고, 해당 객체들을 재활용 할 수 있다.
- 모델에서 가공된 데이터를 컨트롤러에 의해 뷰와 합쳐지는 형태로 디자인 패턴을 견고하게 다지는데 유리하다.
- DBMS에 대한 종속성이 줄어든다.
- 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDMBS의 데이터 구조와 Java 객체지향 모델 사이의 간격을 좁힐 수 있다.
- 대부분 ORM 솔루션은 DB에 종속적이지 않다.
단점
- 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.
- 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
- 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
- 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.
- 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.
JPA가 SQL을 직접 작성하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다. 그래서 JPA에서 수행하는 쿼리가 내 의도대로 실행이 된건지 모니터링을 할 줄 알아야 한다.
'2세 > Spring' 카테고리의 다른 글
230718 - Spring 기능 구현 하며 에러 해결 (0) | 2023.07.18 |
---|---|
230711 - Spring : passwordEncoder 오토와이어링 오류 (0) | 2023.07.11 |
230709 - Spring @EntityListeners(AuditingEntityListener.class) (0) | 2023.07.10 |
230707 - Spring @Controller와 @RestController 차이 (0) | 2023.07.07 |
230706 - 테이블, entity 간의 연관 관계 (0) | 2023.07.06 |