@Entity
: DB 테이블에 대응하는 하나의 클래스 ⇒ @Entity가 붙은 클래스는 JPA가 관리해준다.
@Entity(name=”Member”)
→ 같은 이름이 없으면 가급적 기본값을 사용하는게 좋다.@Entity만 사용한 경우
⇒ DB에 연결하면 테이블명은 클래스명과 동일하게 설정된다.
@Entity와 @Table(name=”테이블명”)으로 설정한 경우
⇒ 호출은 엔티티의 클래스이름으로 하지만 실제 DB에는 테이블명의 테이블로 붙게 된다.
@NoArgsConstructor1
: 기본 생성자를 만들어준다.
@NoArgsConstructor(force=true)
를 사용하면 null, 0 등 기본 값으로 초기화 된다.@RequiredArgsConstructor
: final 변수 , Notnull 표시가 된 변수처럼 필수적인 정보를 세팅하는 생성자를 만들어준다.
@AllArgsConstructor
: 전체 변수를 생성하는 생성자를 만들어준다.
@Id
: JPA 엔티티 객체의 식별자로 사용될 필드에 적용함, 유니크한 DB의 컬럼과 매핑한다.
@GeneratedValue
: 기본 키를 자동 생성해주는 어노테이션이다.
@GeneratedValue(strategy = GenerationType.**IDENTITY**)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column
: 객체 필드를 테이블의 컬럼에 매핑시켜주는 어노테이션이다.
@Column(name = "MEMBER_NAME")
@ManyToOne
, @OneToMany
, @JoinColumn
객체의 단방향, 양방향 매핑
: 양방향 매핑은 두 객체가 서로 참조해야 하는 상황에서 정의하는 연관관계 방식이다,
실제로는 각각의 단방향 매핑이 존재하는 것이며 이를 합쳐서 양방향을 의미한다.
@ManyToOne
: 다대일의 관계(현재의 테이블이 N, 참조하려는 테이블이 1이다)
Ex) TABLE_ACCOUNT 테이블이 N의 관계
@ManyToOne
@JoinColumn(name = "user_id") // DB의 user_id 컬럼을 가져옴
private User user;
Q. Account 엔티티는 User 엔티티와 연관관계를 맺고 있다는 것을 어떻게 알 수 있는걸까?
A. referencedColumnName 속성은 생략하면 자동으로 대상 테이블의 PK 값으로 지정되기 때문에 생략해도 알아서 PK 값하고 잘 매핑이 되는 것이다.
@OneToMany
: 일대다의 관계(현재의 테이블이 1, 참조하려는 테이블이 N)
Ex) TABLE_USER 테이블이 1의 관계
@OneToMany(mappedBy = "user") // 조회하려는 정보는 Account Entity의 user 정보를 참고할 것이기 때문에 mappedBy를 통해 연관관계를 매핑한다.(생략하면 실행시 중간 테이블 생성됨)
private List<Account> accounts = new ArrayList<>();
@OneToOne
: 외래키가 있는 테이블이 연관 관계의 주인이다.
@JoinColumn
💡 User 객체에 MappedBy가 적용되어 있다. 이 경우에는User 객체는 테이블을 관리할 수 없고 Account 객체만이 권한을 받고 주인이 아닌 쪽은 읽기(조회) 만 가능하다. 즉, mappeyBy가 정의되지 않은 객체가 주인이 되는 것이다. ⇒ 연관관계의 주인은 외래키가 있는 쪽이다.
@Enumerated
: Enum 타입으로 설정하기 위한 어노테이션이다. EnumType.ORDINAL
EnumType.STRING
⇒ ORDINAL은 Enum에 정의된 순서대로 JPA가 이용하는데, 만약 순서가 변경된다면 꼬이게 되므로, 무조건적으로 STRING 타입을 이용하자!
@Prepersist
@PreUpdate