[Spring] 엔티티 매핑

easyone·2024년 9월 21일
0

Spring

목록 보기
8/11

엔티티 매핑

엔티티 매핑 종류

1. 객체 테이블 매핑: @Entity, @Table
2. 필드와 컬럼 매핑: @Coumn
3. 기본키 매핑: @Id
4. 연관관계 매핑: @ManyToOne, @JoinColum

객체와 테이블 매핑

@Entity

@Entity가 붙은 클래스는 JPA가 관리하며 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스의 경우 필수 어노테이션이다.
public 또는 protected 기본 생성자는 필수로 있어야 한다. final 클래스, interface,enum,inner 클래스를 사용할 수 없으며, 저장할 필드에 final을 사용할 수 없다.

Entity 속성 : name

  • 사용 예시 @Entity(name="Member")
  • jpa에서 사용할 엔티티 이름을 지정한다.
  • 기본값은 클래스 이름을 그대로 사용한다.
  • 같은 클래스 이름이 없을 경우 가급적 기본값을 사용하는 것이 좋다.

데이터베이스 스키마 자동 생성

  • 애플리케이션 실행 시점에 ddl 자동 생성하는 기능을 지원해주지만, 개발 시에만 사용하는 것이 좋다.
  • 기존에는 테이블을 먼저 생성하고 개발을 진행해야 했지만 JPA 사용 시 객체 매핑을 미리 다 하면 실행할때 테이블을 생성해준다.
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성이 가능하다. ex ) database-platform: org.hibernate.dialect.MySQL8Dialect
  • DDL은 개발 장비에서만 사용하는 것이 좋다. DDL이 불안정할 수 있으므로, 운영 서버에서 사용할 시 다듬고 사용하는 것이 좋다.

hibernate.hbm2ddl.auto 속성

  • create : 애플리케이션을 실행할 때, 기존에 있던 테이블들을 drop하고 새로 생성한다. (drop + create)
  • create-drop: 애플리케이션 시작할때 테이블 생성, 종료시점에 테이블을 drop → 테스트케이스 실행 시 주로 사용
  • update: 변경부분만 반영하여 alter문만 실행한다. 이미 생성된 테이블을 지우는 것은 불가능하고 추가한 부분만 반영된다.
  • validate: 엔티티와 테이블이 매핑이 잘 되었는지 확인하며 매핑 안되어있으면 에러가 발생한다.
  • none : 자동 생성을 사용하지 않는다.

*주의 : 운영장비에는 절대 create,create-drop,update 속성을 사용하지 않는 것이 좋다.

  • 개발 초기: create, update
  • 테스트 서버: update, validate
  • 스테이징과 운영 서버: validate, none

update의 경우 alter문 실행 시 데이터베이스 락이 걸릴 수 있다.

DDL 생성 기능

  • 제약 조건 추가할 수 있다. ex) @Column(unique=true, length = 10)
  • jpa 실행 시 런타임에 영향을 주지 않고 , ddl 자동 생성에만 영향을 준다.

필드와 컬럼 매핑

  • 매핑 어노테이션
  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑, Date또는 LocalDateTime 타입에 주로 사용된다.
  • @Lob : 문자 타입
  • @Enumerated: enum 타입 매핑으로 데이터베이스에는 varchar 타입으로 저장된다.
  • @Transient: 특정 필드를 데이터베이스에 저장하지 않고 메모리에서만 사용하고 싶을 때 사용한다.

@Column 사용법

  1. name: 필드와 매핑할 테이블의 컬럼 이름을 지정할 수 있으며, 기본값은 객체의 필드 이름이다.
  2. insertable, updatable : 컬럼의 등록, 변경 가능 여부를 설정할 수 있다.
  3. nullable: null 제약조건을 설정할 수 있으며 false로 설정하면 not null 제약조건이 붙게 된다.
  4. unique : true로 설정 시 이름이 랜덤 문자열로 생성되므로 운영에 사용하기 좋지는 않다. @Table의 uniqueContraints는 한번에 여러개의 컬럼에 유니크 제약조건을 걸 수 있고 unique는 한 컬럼에만 제약조건을 걸고 싶을 때 사용한다.
  5. columnDefinition : 컬럼 정보, 옵션을 직접 줄 수 있으며 기본값도 설정이 가능하다.
columnDefinition = "varchar(100) default: 'EMPTY'"
  1. BigDecimal: 아주 큰 숫자나 소숫점이 필요할 때 사용한다.
  2. @Enumerated
       1. ORDINAL 사용하지 않는 것이 좋다. 사용 시 enum 순서를 저장할 때 0,1 이런식으로 숫자로 저장하게 되는데, enum에 새로 요소를 추가하면 순서가 바뀌기 때문에 에러가 날 수 있으므로 사용하지 않는 것이 좋다.
        2. STRING: enum 이름을 데이터베이스에 저장한다. 
  3. @Temporal
    날짜 타입 (Date, Calendar) 매핑 시 사용한다.
    하이버네이트 최신버전은 LocalDate, LocalDateTime를 사용할 때 생략이 가능하다.
  • TemporalType.DATE: 날짜, date 타입과 매핑한다.
  • TemporalType.TIME: 시간, time 타입과 매핑한다.
  • TemporalType.TIMESTAMP: 날짜와 시간, timestamp 타입과 매핑한다.
  1. @Lob
  • 지정할 수 있는 속성이 없으며, 문자면 CLOB, 나머지는 BLOB으로 매핑한다.
  1. @Transient: 매핑하고 싶지 않을 경우 사용한다.

기본키 매핑

  1. 직접 할당 시에는 @Id만 사용하고 string으로 설정한다.
  2. 자동 생성 (@GeneratedValue)
  • IDENTITY: 데이터베이스에 위임할 경우 사용하며 AUTO로 설정 시 데이터베이스 방언에 맞춰서 생성된다. mysql에서는 auto increment로 실행된다.
@GeneratedValue(strategy= GeneratedType.AUTO)
  • SEQUENCE: oracle에서 사용한다.
            @SequenceGenerator(name = "member_seq_generator", 
            sequenceName = "member_seq") // 매핑할 데이터베이스 시퀀스 이름

-Table 전략 : 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략이다. 모든 데이터베이스에 적용 가능하다는 장점이 있지만 최적화가 안되어있어서 성능이 떨어진다.

	@TableGenerator(
           name = "Member_SEQ_generator",
           table = "my_sequences",
           pkColumnName = "member_seq", 
           allocationSize = 1)

권장하는 식별자 전략

  • 기본키 제약 조건: null이 아니고 유일해야 하며 변하면 안된다.
  • Long형, 키 생성전략, 대체키 사용을 권장한다.
  • 즉 변할수도있는 속성을 기본키로 쓰지 않는 것이 좋으며(ex 주민등록번호) uuid도 추천되는 전략이다.
  • identity 전략

    em.persist를 실행하는 시점에 쿼리를 날리고, 그러고 나서야 pk값이 생성된다.즉 jpa에서 내부적으로 pk값을 가져오고, 그 시점에 생성된 값을 알 수 있다.이때 select 쿼리 실행 없이, insert문을 실행하는 시점에 바로 pk값을 가져올 수 있다. 즉 pk값을 모아서 가져오는것이 불가능하다는 단점이 존재한다.

  • sequence 전략
    allocation size를 50으로 설정하면 성능 최적화가 가능하다.
    db에 50개씩 저장하고, 50개가 넘어가면 그때 또 next call을 호출하여 50개씩 저장하는 방식이므로 db에서 가져오는게 아니라 50개가 넘메모리에서 호출하게 된다. 즉 next call이 50번에 한번씩 호출이 되므로 성능 최적화가 가능하며, 동시성 문제를 해결할 수 있다.
profile
백엔드 개발자 지망 대학생

0개의 댓글