[section 3] Spring MVC - JPA 기반 데이터 액세스 계층(2) - 매핑

수경·2022년 12월 27일
0

코드스테이츠

목록 보기
44/57

엔티티와 테이블 간의 매핑

@Entity

엔티티 클래스와 테이블 매핑(필수)

❗️attribute

  • name
    ✔️ 엔티티 이름 설정
    ✔️ 설정하지 않으면 클래스 이름 = 엔티티 이름

@Id

PK 설정(필수)

@Table

테이블 설정(Option, 추가하지 않으면 클래스 이름 = 테이블 이름)

❗️attribute

  • name
    ✔️ 테이블 이름 설정
    ✔️ 설정하지 않으면 클래스 이름 = 테이블 이름
    ✔️ 주로 테이블 이름이 클래스 이름과 달라야 하는 경우에 추가

주의 사항

❗️ @Entity @Id 애너테이션 필수

❗️ 파라미터가 없는 기본 생성자 필수 추가
➡️ Spring Data JPA의 기술 적용 시 기본 생성자가 없는 경우 에러 발생

❗️ 중복되는 엔티티 클래스가 없고, 테이블 이름 = 클래스 이름인 경우, name attribute 지정 x


기본키 매핑

@Id 애너테이션을 추가한 필드가 PK
➡️ JPA: 어떤 방식으로 PK를 생성해 줄 것인지에 대한 전략을 지원해줌

직접 할당 전략

애플리케이션 코드 상 직접 할당

➡️ @Id 애너테이션 추가, 인자로 id 값 넣어서 엔티티 생성

자동 생성 전략

  • IDENTITY : PK 생성을 DB에 위임
    AUTO_INCREMENT 자동 증가 숫자를 PK로 설정
    @GeneratedValue(strategy = GenerationType.IDENTITY)
  • SEQUENCE : DB에서 제공하는 시퀀스를 사용해서 PK 설정
    @GeneratedValue(strategy = GenerationType.SEQUENCE)

  • AUTO : JPA가 DB의 Dialect에 따라 적절한 전략을 자동으로 선택
    (Dialect : 특정 DB에 특화된 고유한 기능)
    @GeneratedValue(strategy = GenerationType.AUTO)

  • TABLE : 별도의 키 생성 테이블을 사용


필드와 컬럼 간의 매핑

@Column

❗️attribute

  • nullable : 컬럼에 null을 허용할지 여부 (default : true)

  • updatable : 컬럼 데이터를 수정할 수 있는지 여부 (default: true)

  • unique : unique 조건 설정 (default: false)

❗️int or long 과 같은 원시 타입의 경우, @Column 애너테이션이 생략되면 nullable = false
➡️ @Column 애너테이션을 추가하면 테이블에는 int price 로 설정 (default: true)
➡️ 테이블에서 int price not null 로 하려면 @Column(nullable=false) 애너테이션 추가 or @Column 애너테이션 자체를 사용 x

@Transient

테이블 컬럼과 매핑하지 않음을 명시 ➡️ 주로 임시 데이터에 사용

@Enumerated

enum 타입과 매핑

✔️ EnumType.ORDINAL : enum의 숫자
✔️ EnumType.STRING : enum의 이름

주의 사항

❗️PK 생성 전략은 IDENTITY 혹은 SEQUENCE 권장

❗️@Column 애너테이션 사용 시, 엔티티 클래스 필드 타입이 java의 원시타입인 경우 @Column(nullable=false) 로 설정 권장

❗️@Enumerated 애너테이션 사용 시 EnumType.ORDINAL 로 설정하면 추후에 enum 추가 시 숫자가 꼬여서 오류날 수 있음!
➡️ EnumType.STRING 권장


엔티티 간의 연관 관계 매핑

✔️ Spring Data JDBC에서는 단방향 매핑만 지원했지만, JPA는 단방향과 양방향을 모두 지원함

✔️ JPA는 엔티티 간에 일대다 , 다대일 , 다대다 , 일대일 연관 관계 매핑을 지원

❗️단방향 연관 관계 : 한 쪽 클래스만 다른 쪽 클래스의 참조 정보를 갖는 관계

❗️양방향 연관 관계 : 양쪽 클래스가 서로의 참조 정보를 갖는 관계

❗️테이블 간 연관 관계에서 다(N)에 해당하는 테이블이 일(1)에 해당하는 테이블의 PK를 FK로 가짐

일대다(1:N) 연관 관계

일(1)에 해당하는 클래스가 다(N)에 해당하는 객체를 참조할 수 있는 관계

단방향 매핑

일대다 단방향 매핑의 경우, 일(1)에 해당하는 테이블이 다(N)에 해당하는 테이블의 PK를 FK로 가짐
➡️ 정상적인 테이블 표현 불가!
➡️ 일대다 단방향 매핑은 거의 사용하지 않음
➡️ 다대일 단방향 매핑을 사용하자❗️
➕ 필요하면 일대다 단방향을 추가해서 양방향으로 만들자❗️

다대일(N:1) 연관 관계

다(N)에 해당하는 클래스가 일(1)에 해당하는 객체를 참조할 수 있는 관계

@ManyToOne : 다대일 연관 관계 매핑

@JoinColumn(name = FK 컬럼명) : 외래키 매핑

❗️양방향 매핑 = 다대일 + 일대다
@OneToMany(mappedBy = field) : 일대다 연관 관계 매핑
mappedBy: 관계를 소유하고 있는 필드를 지정(N에서 외래키 역할을 하는 필드)

다대다(N:N) 연관 관계

다대다 연관 관계는 테이블 설계 시, 중간 테이블을 추가해서 두 개의 일대다 관계를 만드는 것이 일반적임

일대일(1:1) 연관 관계

다대일 단방향 연관 관계 매핑과 동일하게 적용. 양방향도 동일(@JoinColumn 필요)

@OneToOne : 일대일 연관 관계 매핑

profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글