[SpringStudy] 2. @Entity Annotation?

진주·2022년 3월 23일

SpringStudy

목록 보기
2/3

😆 내가 이해하고 정리한 부분 !

STUDENT 클래스와 MAJOR 클래스가 존재한다고 하자.

1. Major 클래스

Major 클래스는 Long타입의 Id(필드명), String타입의 majorName(필드명) 속성 2개를 가지고 있다.

1) @Id 애노테이션을 통해 Major 테이블의 PRIMARY KEY가 Id 라고 설정했다.

2) @Column(name="MAJOR_ID")@Column(name="MAJOR_FIELD") 애노테이션을 통해 DB 테이블 내의 컬럼명을 지정해 준 것이다.

: Major 테이블을 보면, 필드명이 MAJOR_ID, MAJOR_FIELD 로 저장됐다!!


3) @GeneratedValue(strategy = GenerationType.IDENTITY) 애노테이션을 통해, Id값을 직접 지정해주지 않아도, AUTO_INCREMENT로 인식되어 알아서 ID값을 지정해준다.

위의 결과에서 MAJOR_ID의 Extra에 auto_increment로 설정되어있음을 볼 수 있다.

즉, Major major = new Major("컴퓨터 공학"); 을 실행하면

MAJOR_ID가 자동적으로 1번으로 지정된다.


2. STUDENT 클래스

Major 클래스와 마찬가지로 , @Id, @Column, @GeneratedValue 애노테이션을 사용해서 STUDENT 테이블의 속성을 설정해 주었다.


연관 관계 매핑

위의 코드에서 @ManyToOne은 어떤 애노테이션일까?

테이블 간의 연관 관계가 있을 때, JPA는 객체지향 스럽게 사용하는 제공한다.

기존의 DB에서는 외래키(Foreign Key)를 사용하지만, JPA에서는 객체를 참조하는 방식으로 연관 관계를 매핑할 수 있다.

  • 방향 : 단방향 ,양방향
  • 다중성 : 다대일 , 일대다, 일대일, 다대다
  • 연관 관계의 주인 : 객체 양방향 연관 관계는 관리하는 주인이 필요하다.

@ ManyToOne : 다대일(N:1)

여러개의 테이블이 하나의 테이블과 연관 관계를 맺을 때 사용한다.

연관 관계의 주인 : N (Student)

Student : Major = N : 1 이다.
Major는 여러 명의 학생을 가질 수 있지만, Student는 1개의 전공밖에 갖지 못하기 때문에 설정해준 것이다.

@JoinColumn(name = "MAJOR_ID") 는 연관 관계를 이어주도록 외래키를 설정해주는 애노테이션이다.

Student 테이블에 MAJOR_ID 필드가 존재하고, MUL = 외래키 라는 의미이다.


@Entity

JPA에서 엔티티란, DB 테이블에 대응하는 하나의 클래스라고 생각할 수 있다.

@Entity가 붙은 클래스는 JPA가 관리해주며,
JPA를 사용해서 DB 테이블과 매핑할 클래스는 꼭 @Entity를 붙여야만 매핑이 가능하다.

[ Entity 사용시 주의사항 ]

  1. 기본 생성자필수, 접근 제어자는 public 또는 protected여야 한다.

  2. final 클래스, interface, inner 클래스에스 사용이 불가능 하다.

  3. 저장할 필드에는 final을 붙이면 안된다. (final을 붙이면 테이블에 매핑되지 않는다)


@Entity Annotation을 사용한 이유?

@Entity Annotation을 통해, STUDENTMAJOR를 Entity 클래스로 만들어 줬다.

Entity 클래스는 실제 DataBase 테이블과 1:1 매핑되는 객체로,
DB의 테이블 내에 존재하는 컬럼만을 속성(필드)로 가져야한다.

즉, CREATE TABLE 테이블명 (필드명 타입, 필드명 타입 .... PRIMARY KEY(필드명)) 과 같이 QUERY문을 직접 적을 필요가 없어진 것이다.

JPA의 @Entity를 통해 클래스를 Entity 클래스로 만들어줌으로서,
객체 지향적으로 TABLE을 생성할 수 있는 것이다.

원래는 이런 식으로 TABLE을 DB에 생성했어야 했다.


참고 : https://velog.io/@devsh/JPA-%EC%97%B0%EA%B4%80-%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-OneToMany-ManyToOne-OneToOne-ManyToMany

profile
진주의 코딩일기

0개의 댓글