본문 바로가기
백엔드

JPA란?(Java Persistence API) with 영속성 컨텍스트

by 더하리 2024. 12. 1.

 

JPA란?

자바에서 객체를 데이터베이스에 저장하고 관리하기 위한 인터페이스와 기능을 제공하는 API

 

JPA를 사용하면 객체와 관계형 데이터베이스 간의 매핑을 손쉽게 처리할 수 있고 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 간편히 수행할 수 있다.

→ 간단히 말하면,  자바의 ORM기술을 쉽게 구현하도록 도와주는 API이다.

 

 ✔️ORM이란?
Object Relational Mapping 객체-관계 매핑을 의미하며 OOP(Object Oriented Programming)에서 쓰이는 객체 개념을 구현한 클래스와 RDB(Relational DataBase)에서 쓰이는 데이터인 테이블을 자동으로 매핑하는 것을 말한다.
ORM을 통해 객체 간 관계를 바탕으로 자동으로 SQL문을 생성해준다.

 

 

📋예제코드

1. 엔티티 클래스 정의

데이터베이스 테이블과 매핑될 엔티티를 정의하는 것으로 @Entity 어노테이션을 이용해서 정의한다.

@Entity //엔티티 클래스임을 선언한다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Participant extends BaseEntity {
    @Id //엔티티 클래스의 주요 식별자임을 선언한다.
    @GeneratedValue(strategy = GenerationType.IDENTITY) //식별자 값 자동 생성
    private Long id;
    
    // 필드가 데이터베이스 칼럼으로 매핑될 때, 제약 조건을 설정한다. (null허용x)
    @Column(name = "participant_match", nullable = false)
    @ColumnDefault("false")
    private boolean participantMatch;

 

 

2. Repository 인터페이스 정의 

JpaRepository 인터페이스를 상속받기 때문에 메서드 구현이나 구현체를 작성하지 않아도 된다.

@Repository //해당 인터페이스가 스프링 데이터 접근 계층(Data Access Layer)의 컴포넌트임을 선언한다.
// JpaRepository<Participant, Long> 인터페이스는 스프링 데이터 JPA에서 제공하는 CRUD메서드를 상속받아 사용할 수 있다.
public interface ParticipantRepository extends JpaRepository<Participant, Long> {
	 List<Participant> findByChatRoomId(Long chatRoomId);
}

 

+ 여기에서 주요 메서드

- save(S): 새로운 엔티티는 저장, 또는 있는 엔티티 병합
- delete(T): 엔티티 삭제
- findById(Id): 엔티티하나 조회
- findAll(..):  모든 엔티티 조회

 

더불어 쿼리 메소드 기능이 있는데...

1. 메소드 이름으로 쿼리 생성( find…By, read…By, get....By, count…By, exists…By, delete…By)

2. 메소드 이름으로 JPA NamedQuery 호출

3. @Query 사용으로 레퍼지토리 인터페이스에 쿼리 직접 정의

쿼리에 대한 부담을 대폭 줄여준다..!!(자세한 것은 더 알아보면 좋겠다!)

 

 

3. 엔티티 매니저 팩토리 설정 (application.yml)

spring :
  datasource: #연결할 디비의 이름
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: sa
    password:
    driver-class-name : org.h2.Driver #db 종류

  jpa : #jpa 종류
    hibernate:
      ddl-auto : create #app 로딩 시점에 테이블 다 드랍하고 새로시작, 끝나도 그대로 남아있음  
    properties:
      hibernate :
        format_sql : true

 

4. 서비스 클래스 정의

엔티티를 사용하며 비지니스 로직을 구현하는 서비스 클래스를 정의한다.

@Service
public class ParticipantService {
    private final ParticipantRepository participantRepository;
    
     // 모든 참가자가 매칭되었는지 확인
     // param으로 chatRoomId-> 방번호 아이디를 전한다. 
    private boolean allParticipantsMatched(Long chatRoomId) {
        List<Long> participantIds = participantRepository.findParticipantIdByChatRoomId(chatRoomId);
        return participantRepository.existsByIdAndParticipantMatchTrue(participantIds);
    }
}

 

5. 컨트롤러 클래스 정의

@RequiredArgsConstructor
@RestController
public class ParticipantController {

    private final ParticipantService participantService;
    
    // 매칭 현황 조회
    // param으로 id, chatRoomId를 넘긴다.
    @GetMapping("/participant/{chatRoomId}/matchStatus")
    public ApiResponse<GetMatchStatusResponse> getMatchStatus(
        @Parameter(hidden = true) @RequestHeader("Authorization") Long id,
        @PathVariable("chatRoomId") Long chatRoomId) {
    GetMatchStatusResponse response = participantService.getMatchResult(id, chatRoomId);
    return ApiResponse.success(response);
    }
}

 

 

 

영속성 컨텍스트란? (+ 플러시 이해하기)

엔티티를 영구적으로 저장하는 환경

JPA에서 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트를 통해 애플리케이션 내에서 오래 지속되도록 보관한다.

 

(to be continued)

 

 

 


(JPA는 다양한 쿼리 방법을 지원함!

JPQL, JPQ Criteria, QuertDSL, 네이티브 SQL 등)

JPQL

Java Persistence Query Language 객체지향 쿼리로 JPA가 지원하는 다양한 쿼리 방법 중 하나

 

여기에서 개인적을 헷갈렸던 'sql과의 차이'!

SQL은 테이블 대상으로 쿼리를 작성하는 것이고 JPQL은 엔티티 객체를 대상으로 쿼리를 작성하는 것이다.

 

SELECT id, name FROM users → 테이블과 테이블 칼럼을 대상으로 작업

SELECT u.id, u.name FROM User u → 엔티티와 엔티티 속성을 대상을 작업

 

 

 

*참고자료*

 

[Spring JPA] JPA 란?

이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이

dbjh.tistory.com

 

 

ORM(Object Relational Mapping)이 뭘까? 🤔

ORM이란? ORM은 Object Relational Mapping 즉, 객체-관계 매핑의 줄임말이다. 객체-관계 매핑을 풀어서 설명하자면 우리가 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relatio

geonlee.tistory.com

 

 

[JAVA] - JPA란? 간단하고 쉽게 이해하기(예제코드 완벽정리)

🧑🏻‍🏫 간단 정리 JPA는 자바의 ORM기술을 쉽게 구현하도록 도와주는 API이다. JpaRepository를 상속하는 인터페이스에 메서드 이름만 적어놓으면 알아서 다 처리(구현체 생성, 쿼리문 구현 등)해

ccomccomhan.tistory.com

 

 

[Spring Data Jpa] JPA..그래 알겠어.. 그래서 스프링 데이터 JPA는 어떻게 쓰는데..

김영한님의 실전 Spring Data Jpa를 수강하고 정리한 문서 입니다. 강추! 최고최고. 인프런 김영한님 실전 스프링 데이터 JPA 링크딴거는 다 모르겠고, 기록할 부분만 기록해야겠다.\-h2 데이터베이스

velog.io

 

 

 

[JPA] 영속성 컨텍스트와 플러시 이해하기

영속성 컨텍스트JPA를 공부할 때 가장 중요한게객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.

ict-nroo.tistory.com