목적 : 자바 객체를 데이터베이스 테이블에 매핑하여 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;
}