DAY58(2) - JPA 세팅, 엔티티 어노테이션

은나현·2023년 4월 27일
0

📌 1. JPA

  • JPA : Java Persistence API / 자바 지속성 API
    • 현재 자바 진영의 ORM(Object Relational Mapping - 객체와 데이터베이스의 관계를 매핑해주는 도구) 기술 표준, 인터페이스의 모음
  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 직접 만들어서 실행해준다.
    • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.
    • SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.

📍 1-1. spring JPA 세팅

  • build.gradle dependencies 추가
    	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    	implementation group: 'com.oracle.database.jdbc', name: 'ojdbc6', version: '11.2.0.4'
  • application.properties 옵션 추가
    #DB Connection
    spring.datasource.url = jdbc:oracle:thin:@localhost:1521:xe // DB url
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver // DB 드라이버
    spring.datasource.username=spring // DB username
    spring.datasource.password=spring // DB password
    #jpa
    spring.jpa.show-sql=true
    spring.jpa.hibernate.ddl-auto=none

➕ spring.jpa.hibernate.ddl-auto

  • 해당 옵션은 테이블 / 컬럼 생성에 관한 설정값을 제어한다.
    • create : 기존 테이블을 삭제 후 다시 생성한다.
      종료 시에는 삭제하지 않는다.
    • create-drop : 기존 테이블을 삭제 후 다시 생성한다.
      종료 시에 테이블을 삭제한다.
    • update : 주어진 엔티티 구조에 따라 데이터베이스를 변경한다.
      컬럼의 삭제는 반영하지 않으며 추가만 반영된다.
    • validate : 엔티티와 테이블이 정상적으로 매핑되었는지만 확인한다.
    • none : 기본 설정값으로, 데이터베이스에 변화를 주지 않는다.
  • 테이블을 삭제하거나 수정하는 것은 큰 문제가 될 수 있으므로 create, create-drop, update 옵션 등은 사용하지 않고 직접 데이터베이스를 조작하는 것이 좋다.

📍 1-2. Entity 어노테이션

  • @Entity
    : JPA로 DB를 사용할 경우 DTO객체에 @Entity 어노테이션을 이용한다.
    Entity는 DB테이블과 일대일로 매칭되는 객체 단위로, Entity 객체 인스턴스 하나가 레코드 값 하나를 의미한다.

  • @Id
    : 각 Entity 인스턴스는 각자 구분하기 위한 유일한 키값을 필요로 한다. @Id어노테이션으로 테이블의 Primary Key를 지정하며, 데이터베이스는 이 키 값을 기준으로 데이터 질의 결과를 반환해 준다.

  • @Table
    : @Table 어노테이션으로 테이블 옵션을 지정할 수 있으며, 별다른 설정을 하지 않을 경우 생략이 가능하다.

    • name 속성을 명시하지 않으면 클래스에 정의한 변수 이름대로 테이블이 생성된다. 별도로 이름을 지정해 줄 때는 @Table(name = "테이블 명칭")으로 표기한다.
  • @Column : @Column 어노테이션은 데이터베이스 테이블 컬럼과 1:1로 매칭된다. @Table과 동일하게 옵션을 지정하거나 생략할 수 있다.

  • @GeneratedValue : PK 컬럼의 값을 생성 및 관리하기 위해 @GeneratedValue 어노테이션을 사용한다.

    • auto increment 방식
      • @GeneratedValue(strategy = GenerationType.IDENTITY)
        : 테이블의 숫자형 PK 컬럼 속성을 auto increment로 지정하면 레코드 생성 시에 자동으로 마지막 PK값에서 +1 값으로 PK를 정한다. 이 때 strategy 옵션을 IDENTITY로 지정한다.
    • sequence 방식
      - @GeneratedValue(strategy = GenerationType.SEQUENCE
      : 테이블의 PK 값으로 사용되는 시퀀스 객체가 존재할 경우 strategy를 SEQUENCE로 지정하고 @SequenceGenerator 어노테이션과 함께 사용한다.
      • 예시
        @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequence")
        @SequenceGenerator(name = "mySequence",sequenceName = "member_seq", allocationSize = 1)
        private int id;
  • @Enumerated : enum 형태로 미리 정의되어 있는 코드나 구분값을 데이터 타입으로 사용하고자 할 때 사용된다.

    • EnumType.ORDINAL : enum 객체에 정의된 순서가 컬럼 값으로 사용된다.
    • EnumType.STRING : enum 문자열 자체가 컬럼 값으로 사용된다.
  • @Transient : Entity 객체에 지정되어 있지만 데이터베이스에 필요없는 속성이라면 @Transient 어노테이션으로 이용하지 않겠다고 정의할 수 있다. Entity 객체에 임시값을 담는 용도로 사용 가능하다.

  • @EmbeddedId : PK를 단일 @Id가 아니라 복합키로 정의할 경우 Entity에 직접 정의하지 않고 Serializable을 상속받는 별도의 클래스로 생성한 후 @Embeddable 어노테이션을 붙여 Entity에 삽입 가능함을 명시한다. Entity에서는 @EmbeddedId 어노테이션을 이용해 해당 값을 PK로 사용한다고 지정할 수 있다.

  • 간단한 Entity 작성 예시
@Entity
public class Member {
	@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mySequence")
	@SequenceGenerator(name = "mySequence",sequenceName = "member_seq", allocationSize = 1)
	private int id;
    @Column(name="user_name")
	private String name;
	...
}

0개의 댓글