티스토리 뷰

반응형

JPA란?

 JPA는 Java Persistence API의 약자입니다. Persistence라는 단어는 Java DTO(Data Transfer Object)에게 '없어지지 않고 오랫동안 지속'되는 '영속성(persistence)'을 부여해준다는 의미입니다. 즉, 데이터를 DB상에 영구적으로 저장해주는 API라고 생각하면 됩니다.  기존 JDBC만을 이용하는 경우 반복적이며 비슷한 SQL문을 많이 만들어야하고, 데이터베이스의 테이블과 자바 객체간의 매핑하는 소모적인 작업을 지속해야 합니다.

 JPA를 사용하게 되면 SQL문을 개발자가 만들지 않기 때문에 객체 중심적인 개발로 생산성과 유지보수의 능률이 크게 오르고, 특정 DBMS 문법에 종속적이지 않은 개발이 가능합니다. 또한 JPA의 영속성 컨텍스트는 효율적인 SQL처리에 크게 기여하여 성능상의 이점도 취할 수 있습니다.


Entity

Entity란 DB에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터를 말합니다. JPA를 이용하여 자바 클래스를 Entity 클래스로 설정하는 방법을 알아 보겠습니다. 예제는 스프링부트 2.1로 진행되었고, Maven과 mariaDB를 사용하였습니다.


1) Maven -pom.xml 설정

<!--jpa 설정-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--jdbc 설정-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--DBMS - mariaDB 설정-->
<dependency>
   <groupId>org.mariadb.jdbc</groupId>
   <artifactId>mariadb-java-client</artifactId>
   <scope>runtime</scope>
</dependency>

2) application.properties 설정

DBMS에 연결하기 위한 설정과 jpa 설정입니다.

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/jpatest
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.initialization-mode=always

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

3) 자바 class에 Entity 설정하기

아래 코드는 JPA를 이용하여서 Entity설정이 된 클래스 입니다. 애노테이션에 대한 설명은 코드 아래에 기술되어 있습니다.

@Entity
@Table(name = "product")
@Getter
@Setter
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(length = 100, nullable = false)
    private String name;
    @Column(nullable = false)
    private int price;

    @ManyToOne
    @JoinColumn(name ="category_id",nullable = false)
    private Category category;

    @OneToMany(mappedBy = "product")
    private Set<Cart> carts;
}
  • @Entity - Entity클래스임을 명시합니다.
  • @Table(name = "category") - 매핑할 테이블 명을 지정합니다.
  • @Getter / @Setter - getters/setters를 만들어주는 롬복(Lombok) 애노테이션 입니다. JPA와는 별개의 애노테이션 입니다. 자세한 내용은 다른 포스팅을 참고해주시기 바랍니다. ☞ 롬복(Lombok) 애노테이션 사용하기
  • @Id - 기본키임을 나타냅니다. 모든 Entity클래스는 @Id설정이 필요합니다. 기본키가 복합키로 된 경우는 @Embeddedid를 사용합니다.
  • @GeneratedValue(strategy = GenerationType.IDENTITY) - JPA가 기본키 생성을 하도록 합니다. 
  • @Column -  Entity클래스의 모든 필드는 데이터베이스의 컬럼과 매핑되어 따로 명시하지 않아도 됩니다. 하지만 매핑될 컬럼명이 다르거나, default값이 다른경우에 사용합니다. (이름은 카멜표기법이 소문자 스네이크 표기법으로 전환되고, length는 255, nullable은 true가 default 값입니다.)
  • @ManyToOne - 다른 Entity클래스와의 외래키 다대일(N:1)관계를 명시합니다. 
  • @JoinColumn - name에 명시한 category_id라는 컬럼명으로Category에 대한 외래키 설정이 됩니다. 참조 되는 컬럼은 Catrgory Entity클래스에서 @Id가 명시된 필드입니다.
  • @OneToMany - 다른 Entity클래스와 일대다(1:N)관계를 명시합니다. mappedBy에는 제네릭스로 명시된 Cart Entity가 외래키 설정에서 사용한 참조변수 이름입니다. 반대편이 Many 설정일 경우에는 반드시 컬렉션프레임워크(List나 Set)을 사용합니다.  방향성에 대한 자세한 내용은 다음 포스팅을 참고하시기 바랍니다. JPA Entity간의 방향 설정하기

샘플 테이블 생성하기

이제 스프링부트 @SpringBootApplication설정이 된 클래스의 main메소드를 실행시키고 콘솔을 확인해보면 자동으로 테이블이 만들어 지는 과정을 확인 할 수 있습니다. resources폴더 아래에 data.sql 파일을 두고, 샘플데이터를 입력해두면 생성과 동시 샘플데이터를 입력해줍니다.

create table product (
       id bigint not null auto_increment,
        name varchar(100) not null,
        price integer not null,
        category_id bigint not null,
        primary key (id)
) engine=InnoDB

alter table product 
       add constraint FK6jybil1ys554dw63udn86o77s 
       foreign key (category_id) 
       references category (id)


반응형
댓글