프로젝트 시작 전 (2) - JPA란?

UmmChicken·2022년 10월 17일
1

프로젝트

목록 보기
2/9

✅ 한 줄 정리

우리는 SpringBoot와 MySQL을 MyBatis로 연결했지만,
SpringBoot와 MySQL을 JPA로 연결하는 방식을 많이 쓴다.
→ 구글에 ‘JPA CRUD’라고 치면 예제 많이 나옴

✅ Entity Table Annotaion

출처

* @Entity
 해당 클래스를 테이블과 매핑한다고 JPA에게 알려줌.
 @Entity가 사용된 클래스를 엔티티 클래스라고함.

* @Table
 엔티티 클래스와 매핑할 테이블 정보를 알려줌.
 name 속성을 사용하여 물리적인 테이블과 연결 시킬수 있음.
 ex) @Table(name="MEMBER")

* @Id
 엔티티 클래스의 필드를 테이블 기본키에 매핑. @Id가 사용된 필드를 식별자 필드라고함.

* @Column
 필드를 컬럼에 매핑. name 속성을 사용해 테이블 컬럼명에 매핑할 수 있음.
 엔티티 클래스에서 @Column 표시를 안해준 필드는 필드명에 따른 컬럼명에 매핑됨.
 

✅ SQL Mapper와 ORM 차이

출처

SQL Mapper와ORM은 개발자가 직접 JDBC Programming을 하지 않도록 
기능들을 제공해주는 Persistence Framework 종류

● SQL Mapper : SQL구문을 매핑시켜서 데이터베이스에 질의

출처

Object와 SQL의 필드을 매핑하여 데이터를 객체화하는 기술.
객체와 테이블간의 관계를 매핑하는 것이 아니라, 
SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 매핑하여 줄 지 바인딩하는 방법. 
즉 SQL 의존적인 방법이다.
ex) Mybatis, JdbcTemplate

○ MyBatis
SQL을 xml파일로 분리하여 관리하고, SQL결과와 객체 인스턴스의 매핑을 도와주는 역할을 수행.
동적쿼리를 지원하여 다이나믹하게 변경되는 쿼리 작성가능.

--> SQL을 개발자가 직접 작성하는 문제.
--> DBMS에 종속적인 문제.
--> 비슷한 쿼리를 반복적으로 작성해야하는 문제
--> 객체와 관계형 테이블 구조간패러다임 불일치 발생.

● ORM (Object Relation Mapping) : 직접 SQL 구문을 사용하지 않고, 메서드를 통해 구현이 가능

출처

Object와 DB테이블을 매핑하여 데이터를 객체화하는 기술.
CRUD 관련 메소드를 사용하면 자동으로 SQL이 만들어져 개발자가 반복적인 SQL을 직접 작성하지 않아도 되고, 
DBMS에 종속적이지 않다. 
또한 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper를 혼용하여 사용할 수 있다.
Java ORM 기술에 대한 인터페이스 표준을 JPA라고 하고, 
이를 구현한 가장 대표적인 기술이 Hibernate이다.
ex) Hibernate, EclipseLink, DataNucleus

--> DBMS에 의존하지 않음으로써 도메인과 비즈니스 로직 설계에 더 집중할 수 있는 장점
--> 요구사항 변화에 빠른 대처 가능한 장점
--> 복잡한 통계성 쿼리보다는 실시간 처리용 쿼리에 적합

Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 
단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다.

결론 : 우리는 자바 클래스(VO)와 DB 테이블을 Mapper(xml 파일)로 매칭 시켰지만,
JPA는 자바 클래스와(VO) DB 테이블을 Hibernate로 매칭한다?

  • JPA 예시
    [vo/Member.java]
package vo;

// JPA annotation을 사용하기 위한 라이브러리
import javax.persistence.*;

// @Entity: DB Table과 매핑될 클래스임
// @Table: 매핑할 Table 정보
// @Id: 테이블의 기본키와 매핑할 필드
// @Column: 필드와 컬럼을 매핑

@Entity
@Table (name="MEMBER")
public class Member {

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String username;

    // table의 컬럼명과 동일할 때는 매핑정보 생략가능
    private Integer age;

	// 생성자와 Getter, Setter 부분은 생략한다
    // ...
}

✅ MyBatis vs JPA → MyBatis 대신 JPA를 쓴다.

<MyBatis와 JPA에 대한 이것저것>

→ SI 에선 mybatis
→ 팀단위 플젝에선 JPA

<JPA 적용 사례>

  • 쿠팡, 카카오, 배달의 민족, 네이버 등 국내 유명한 IT 기업에서 사용 중
  • 최신 스프링 예제에서도 JPA 이용
  • 자바 개발자에게 JPA를 기본 기술이라고 볼 수 있다.

  • MyBatis 사용 시
public class User {
    private Long id;
    private String account;
    private String password;
    private String name;
}
  • JPA 사용 시
@Entity
@Data
public class User {
    private Long id;
    private String account;
    private String password;
    private String name;
}
profile
Hello My World!

0개의 댓글