JPA[Java Persistence API]

그나·2024년 8월 28일

목적 : 자바 객체를 데이터베이스 테이블에 매핑하여 SQL 쿼리 없이 데이터베이스 작업을 수행하도록 한다

ORM : 객체 - 관계 매핑을 통해 자바 객체와 데이터베이스 간의 매핑을 자동으로 처리한

  • Entity[엔티티] 란?

    Spring Boot 와 같은 Java 기반 프레임워크에서 “엔티티[Entity]” 는 주로 데이터 베이스의 테이블을 나타내는 클래스를 의미한다, 이 클래스는 JPA[Java Persistence API] 를 사용하여 데이터 베이스에 저장되고 관리한다.

    즉 → Entity 클래스는 실제 데이터베이스의 테이블과 1:1 매핑되는 클래스이다.

    → Entity 클래스는 테이블의 컬럼에 해당하는 속성(필드)을 가져야 한다

    필요한 경우 테이블에 매핑되지 않는 필드도 가질 수 있다, 이때 매핑되지 않는 필드는

    @Transient어노테이션으로 표시한다.

    주의점 :

    → 엔티티 클래스는 인터페이스를 구현하거나 추상 클래스를 상속받아서는 안되지만 , 다른 엔티티 클래스를 상속받을 수 있다 .

    → 엔티티 클래스는 반드시 기본 생성자를 가져야한다 , 이 생성자는 Public 또는 Protected라는 접근 제어자를 가져야한다.

    Entity[엔티티] 클래스 특징

    @Entity 어노테이션 : JPA 가 해당 클래스를 엔티티로 인식하기 위해 클래스 선언 위에 @Entity 어노테이션을 붙여줘야한다.

    → 기본 생성자 : JPA 스펙에 따라 엔티티 클래스는 반드시 기본 생성자를 가져야 합니다

    → 식별자 필드 : 각 엔티티 인스턴스를 유일하게 식별할 수 있는 식별자 필드가 필요하다, 이 필드는 @ ID 어노테이션으로 마크되며 일반적으로 숫자 ID 또는 UUID등을 사용한다.

    @Entity // 이 어노테이션이 JPA 엔티티임을 나타낸다
    public class user {
    
    	@Id // 이 필드가 기본 키 (Primary Key)임을 나타낸다
    	@GeneratedValue(strategy = GenerationType.IDENTITY)  // 기본 키를 자동으로 생성하도록 지정합니다.
    	private Long id;
    	
    	private String name;
    	private String email;
    	
    	//기본 생성자 (JAP 에서는 필수)
    	public User(){}
    	
    	//매개변수가 있는 생성자
    	public User(String name , String email){
    		this.name = name;
    		this.email = email;
    	}
    	
      // Getters and Setters (JPA는 필드에 접근할 때 이 메서드를 사용합니다)
      public Long getId() {
          return id;
      }
    
      public void setId(Long id) {
          this.id = id;
      }
    
      public String getName() {
          return name;
      }
    
      public void setName(String name) {
          this.name = name;
      }
    
      public String getEmail() {
          return email;
      }
    
      public void setEmail(String email) {
          this.email = email;
      }
    }
  • JPQL - 객체지향 쿼리 언어 [Java Persistence Query Language]

    → JPA 는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공

    → JPQL 은 SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다.

    →JPQL 에서도 SELECT , FROM , WHERE , GROUP BY , HAVING , JOIN 을 지원한다.

    String jpql = "SELECT M FROM MEMBER M WHERE M.NAME LIKE '%HELLO%'";
    List<Member> result = em.createQuery(jpql , Member.class).getREsultList();
    
    for(Member member : result){
    		System.out.println("member = " + member);
    }

    →JPQL은 객체를 대상으로 쿼리 작성.

    → 위 코드에서는 Member 객체를 대상으로 이름에 “hello” 가 포함된 모든 회원을 검색한다

    문제점:

    • JPQL은 문자열로 작성되어 컴파일 타임에 에러 발생하지 않음. 런타임 시 문제 발생 가능.

    • 동적 쿼리 작성에 비효율적. 특정 조건에 따라 쿼리를 동적으로 작성하는 데 제한적.

      JPQL과 SQL의 차이점:

    • JPQL: 엔티티 객체를 대상으로 쿼리 작성.

    • SQL: 데이터베이스 테이블을 대상으로 쿼리 작성.

  • JPA의 어노테이션 정리

    @Entity :

    Entity가 붙은 클래스를 엔티티라고 하며 JPA가 관리한다

    JPA 를 사용해서 테이블과 매핑 할 클래스는 엔티티가 필수이다

    @Entity 
    public class Member{
    	@ID
    	private Long id;
    	private String name;
    }

    @Table :

    엔티티와 데이터베이스 테이블의 이름을 매핑한다 , 기본적으로 클래스 이름이 테이블 이름으로 사용된다

    @Id : 엔티티의 기본키를 정의하며 엔티티의 각 인스턴스를 고유하게 식별하는 필드에 사용된다.

    @Entity
    @Table(name = "member_table")
    public class Member{
    	@Id
    	
    	private Long id; 
    	private String name;
    }
profile
비전공자의 뚝딱이의 우탕탕 공부

0개의 댓글