JPA의 개념과 기본 설정 가이드
프로젝트에서 자주 사용했던 JPA에 대해 자세하게 알아보기 위해 이번 글에는 JPA의 개념과 기본 설정에 대해 알아보겠습니다.
JPA란?
JPA란 Java Persistence API의 약자로 자바 영속성 API를 의미합니다. JDBC를 이용해서 데이터베이스를 관리하는 인터페이스이며 이를 구현한 대표적인 라이브러리로 대표적인 것이 Hibernate입니다. 또한 JPA는 자바 ORM기술의 표준 API이며 ORM은 Object Relational Mapping의 약자이며 객체와 관계형 데이터베이스를 연결해 주는 개념을 뜻합니다.
JPA의 사용 이유
- SQL 중심적인 개발에서 DDL 문을 자동으로 생성해 주기 때문에 객체 중심적인 개발이 가능합니다.
- 필드 값을 수정할때 JPA는 엔티티 기준으로 처리하기 때문에 코드 길이가 줄어들어 유지보수가 원활해집니다.
- 연관된 객체를 사용하는 시점에 SQL을 전달하고, 같은 트랜잭션 내에 동일성을 보장하여 다양한 패러다임의 불일치를 해결해줍니다.
- 한 트랜잭션에서 데이터를 캐시로 보관하기 때문에 데이터베이스에 직접 접근하는 횟수가 줄어들어 성능이 향상됩니다.
- 다양한 SQL Dialect를 지원하기 때문에 데이터베이스 설정에 유연합니다.
JPA 설정
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: update
use-new-id-generator-mappings: false
open-in-view: false
properties:
hibernate:
format_sql: true
show_sql : true
type: trace
설정은 application.yml에 다음과 같이 적용할 수 있습니다.
- database-platform: 이 설정은 JPA에서 사용할 데이터베이스의 SQL 문법과 특성을 지정합니다.
- ddl-auto: 이 설정은 테이블 스키마를 자동으로 생성 또는 업데이트할 때의 동작을 지정합니다.
- create: 기존 스키마를 삭제하고 새로 생성합니다.
- create-drop: create와 같은 동작을 하지만 테이블을 사용 후 다시 삭제합니다.
- update: 기존 스키마에서 변경된 사항들만 따로 등록합니다.
- validate: 스키마의 유효성 검사를 실시하고, 스키마를 변경하지는 않습니다.
- use-new-id-generator-mappings: 엔티티의 ID 생성 전략을 관리합니다.
- open-in-view: 트랜잭션이 끝난 객체를 준 영속 상태로 만들어줍니다.
- format_sql: 쿼리 포맷을 정렬시켜 줍니다.
- show_sql: JPA의 쿼리 로그를 출력해 줍니다.
- type: trace는 데이터베이스 타입 매핑에 대한 자세한 디버그 정보가 로그에 출력됩니다.
JPA 생성
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@Column(nullable = false)
private String nickname;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
}
엔티티에 대한 설정은 다음과 같이 진행할 수 있습니다.
- @Entity: 테이블 JPA가 관리할 수 있도록 해주며, 엔티티의 이름을 지정해 주지 않으면 해당 클래스 이름을 사용하여 생성합니다.
- @Id: 엔티티의 Primary Key를 지정하는 어노테이션으로, 테이블 내의 식별 값으로 존재하게 됩니다.
- @GeneratedValue: 기본 키 생성 전략인 GenerationType.IDENTITY를 사용했으며 기본 키 생성을 데이터베이스에 위임합니다.
- @Column: 필드를 테이블 컬럼으로 설정합니다.
JPA Repository 생성
public interface MemberRepository extends JpaRepository<Member,Long> {
Optional<Member> findByEmail(String email);
}
생성된 엔티티를 Repository를 생성하고, JpaRepository를 상속받아 해당 엔티티 명과, Primary를 정의하여 Spring Data Jpa를 사용할 수 있게 설정합니다. 이때 JpaRepository에서는 다음과 같은 메소드를 생성하거나 상속받아 사용할 수 있습니다.
- findBy: 특정 값을 대상으로 해당 엔티티를 조회하여 객체를 반환합니다.
- findAll: 해당 엔티티의 전체값을 조회하여 List 형태의 객체를 반환합니다.
- delete: 특정 값을 매개변수로 받아 삭제를 실행합니다.
- save: 특정 값을 매개변수로 받아 등록을 실행합니다.
- existsBy: 특정 값이 있는지에 대한 여부를 판단하여 존재 여부를 반환합니다.
이렇게 JPA의 개념과 기본 설정에 대한 글을 작성해 보았습니다. 처음에는 생소한 개념과 어노테이션으로 혼동될 수 있지만 차근차근 알아보고 특징에 대해 조금만 더 자세하게 안다면 개발하기 편하다고 생각합니다. JPA의 특성을 알아야 기능을 잘 다를수 있으니 다음 글에는 설정을 하고 나서 JPA가 어떤 형식으로 관리되며 사용되는지, 어떤 특성들이 있는지 알아보는 글을 작성하도록 하겠습니다. 읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
[JPA] JPA의 연관관계 예제 정리 (1) | 2024.02.05 |
---|---|
[JPA] 영속성 컨텍스트의 특징과 프록시 이해하기 (1) | 2024.02.01 |
[Spring] SpringBoot JWT 로그인 구현 가이드 (1) | 2024.01.26 |
[Spring] SpringBoot Swagger 연동 (3.x ver) (0) | 2024.01.10 |
[Spring] SpringBoot Sequrity + JWT 구현 (3.x ver) (0) | 2024.01.06 |