일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- javascript
- 코딩테스트
- 코테
- 자료구조
- python
- 공개키 암호화
- BFS
- 자바의정석
- 생성자
- dfs
- 문자열
- 암호학
- 크루스칼
- sql
- spring
- 알고리즘
- 가상컴퓨팅
- Queue
- dbms
- JPA
- Algorithm
- Java
- 개발자취업
- generic class
- 항해99
- jsp
- data structure
- js
- 코딩테스트준비
- DB
- Today
- Total
PLOD
[Spring] JPA(Java Persistence API) 본문
JPA
- JPA는 자바 진영에서 ORM기술 표준으로 사용되는 인터페이스의 모음이다.
- 기존의 JDBC는 SQL 의존적이라 변경에 취약하였다. 그리고 쿼리를 통해 직접 접근하는 방식이라 SQL 직접 변경해주어야 해서 수고스러웠다.
- 이러한 점을 ORM 기반의 JPA가 해소할 수 있을 것이다. JPA를 통해 백엔드 개발자들은 쿼리 작성과 수정에 들이는 노력을 비즈니스 로직 개발에 힘쓸수 있게 되었다.
ORM(Object-Relational Mapping)
애플리케이션 Class와 RDB(Relational DataBase : 관계형 데이터베이스)의 테이블을 매핑한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면 된다.
ORM의 장점
- SQL 문이 아닌 메서드를 통해 데이터베이스를 조작 할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.
- 쿼리 사용이 줄어들어 , 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높인다.
- DBMS 사용에 자유로워 유지보수 및 리팩토링에 유리하다는 장점이 있다.
JPA(Java Persistence API)
- Java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음이다.
- JPA는 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스 이기 때문에 Hibernate와 OpenJPA를 구현 할 수 있다.
- JPA는 반복적인 CRUD SQL을 처리해줄수 있다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될 지 생각만 하면 되고, 예측도 쉽게 할 수 있다.
- JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.
- JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다.
JPA 사용 시 장점
- 특정 데이터베이스에 종속 되지 않음
- 객체지향적 프로그래밍
- 생산성 향상
JPA 사용 시 단점
- 복잡한 쿼리 처리
- 성능 저하 위험
Entity
- Entity는 JPA에서 관리되는 클래스 즉, 객체를 의미한다.
- Entity 클래스는 데이터베이스의 테이블과 매핑되어 JPA에 의해 관리된다.
- 기존의 Spring에서 VO 클래스와 같은 역할
@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
@Id
private Long id;
// nullable: null 허용 여부
// unique: 중복 허용 여부 (false 일때 중복 허용)
@Column(name = "username", nullable = false, unique = true)
private String username;
// length: 컬럼 길이 지정
@Column(name = "contents", nullable = false, length = 500)
private String contents;
}
@Entity
JPA가 관리할 수 있는 Entity 클래스로 지정할 수 있다. @Entity(name = "Memo")이런 식으로 name 뒤에 Memo로 Entity 클래스의 이름을 지정할 수도 있다. JPA가 Entity 클래스를 인스턴스화 할 때 기본 생성자를 사용하기 때문에 반드시 Entity 클래스에서 기본 생성자가 생성되고 있는지 확인해야 한다.
@Table
매핑할 테이블을 지정해준다. 엔티티와 마찬가지로 @Table(name = "memo") 이런 식으로 테이블의 이름을 지정 해 줄수 있다. 생략하면 Entity(클래스) 명으로 지정된다.
@Column
column은 테이블의 각 컬럼을 매핑 해주는 역할을 한다.
@Column(name = "NAME", nullable = false, unique = true, length = 10)
- name을 통해 필드와 매핑할 테이블 컬럼을 지정해 줄 수 있다
- nullable을 false로 해서 null 값을 받지 않게 할 수 있다.
- Unique를 통해 중복값을 허용하지 않게 할 수 있다
- length를 통해 문자의 길이에 대한 제약조건을 추가할 수 있다.
@Id
테이블의 기본키를 설정해준다. 이 기본키는 영속성 컨텍스트에서 Entity를 구분하고 관리할 때 사용되는 식별자 역할을 수행한다. 따라서 기본 키 즉, 식별자 값을 넣어주지 않고 저장하면 오류가 발생하므로, @Id 옵션만 설정하면 기본 키 값을 개발자가 직접 확인하고 넣어줘야 하는 불편함이 발생한다.
@GeneratedValue
이 옵션을 추가하면 기본키 생성을 DB에 위임 할 수 있다. @GeneratedValue(strategy = GenerationType.IDENTITY)를 테스트 해보면 테이블에 id bigint not bull auto_increament 조건이 추가된 것을 확인할 수 있다. 이를 통해 해당 옵션을 추가해주면 개발자가 직접 id 값을 넣어주지 않아도 자동으로 순서에 맞제 기본키가 추가된다.
Query Methods
- Spring Data JPA에서는 메서드, 이름으로 SQL을 생성할 수 있는 Query Methods 기능을 제공한다.
- JpaRepository 인터페이스를 상속함으로써 해당 인터페이스와 매핑되어 있는 테이블에 요청하고자 하는 SQL을 메서드 이름을 사용하여 선언할 수 있다.
- JpaRepository<> 에서 괄호에는 첫번째에는 Jpa로 사용할 entity(class), 두번째는 해당 class의 pk타입이다.
package com.sparta.memo.repository;
import com.sparta.memo.entity.Memo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MemoRepository extends JpaRepository<Memo, Long> { // <class,PK>
List<Memo> findAllByOrderByModifiedAtDesc();
}
SimpleJpaRepository 클래스가 생성될 때 위처럼 직접 선언한 JpaRepository 인터페이스의 모든 메서드를 자동으로 구현해준다.
- JpaRepository 인터페이스의 메서드 즉, Query Methods는 개발자가 이미 정의 되어있는 규칙에 맞게 메서드를 선언하면 해당 메서드 이름을 분석하여 SimpleJpaRepository에서 구현이 된다.
- 우리는 인터페이스에 필요한 SQL에 해당하는 메서드 이름 패턴으로 메서드를 선언 하기만 하면 따로 JDBC를 구현하지 않아도 사용할 수 있다.
- findAllByOrderByModifiedAtDesc 해당 메서드 이름은 Memo 테이블에서 ModifiedAt 즉, 수정 시간을 기준으로 전체 데이터를 내림차순으로 가져오는 SQL을 실행하는 메서드를 생성할 수 있다.
List<Memo> findAllByUsername(String username);
- Query Method를 선언했을 경우 ByUsername 에 값을 전달해줘야하기 때문에 파라미터에 해당 값의 타입과 변수명을 선언해줍니다.
- 즉, Query Methods 는 메서드의 파라미터를 통해 SQL에 필요한 값을 동적으로 받아 처리할 수 있습니다.
https://velog.io/@seongwon97/Spring-Boot-Query-Method
'개발 공부 > Spring' 카테고리의 다른 글
[Spring] 3 Layer Architecture (0) | 2024.07.29 |
---|---|
[Spring] Spring Security (0) | 2024.07.25 |
[spring] spring 과 MyBatis 연동 (0) | 2023.08.19 |
[spring] Spring dependency 설정(gradle, maven) (0) | 2023.07.08 |
[spring] spring MVC - (3.View) (0) | 2023.04.17 |