객체 - 테이블 맵핑 : @Entity, @Table
필드 - 컬럼의 팹핑 : @Column
기본키의 맵핑 : @Id
조인 맵핑 : @ManyToOne, @JoinColumn
📕 @Entity
- 테이블과의 매핑
- @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림
- 제약조건
- 필드에 final, enum, interface, class 사용불가
- 생성자 중 기본 생성자가 반드시 필요함
- 속성
- Name - 엔티티 이름을 지정, 기본값으로 클래스 이름을 그대로 사용함
📕 @Table
- 엔티티와 매핑할 테이블을 지정
- 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용
- 속성
- Name - 매핑할 테이블 이름을 지정
- Catalog - DB의 Catalog를 매핑
- Schema - DB 스키마와 매핑
- UniqueConstraint - DDL 쿼리를 작성할 때 제약 조건을 생성
📕 @Coulmn
- 객체 필드와 DB 테이블 컬럼을 매핑
- 속성
- Name : 맵핑할 테이블의 컬럼 이름을 지정
- Insertable : 엔티티 저장시 선언된 필드도 같이 저장
- Updateable : 엔티티 수정시 이 필드를 함께 수정
- Table : 지정한 필드를 다른 테이블에 맵핑할 수 있게 설정
- Nullable : NULL을 허용할지, 허용하지 않을지 결정
- Unique : 제약조건을 걸 때 사용
- ColumnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용
- Length : varchar의 길이를 조정, 기본값 255
- Precsion, Scale : BigInteger, BigDecimal 타입에서 사용. 각각 소수점 포함 자리수, 소수의 자리수를 의미
📕 @Id
- JPA가 객체를 관리할 때 식별할 기본키를 지정
📕 예시 (인스타그램 클론코딩 프로젝트)
[ User ]
@Builder
@Entity // 디비에 테이블을 생성
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략을 데이터베이스를 따라간다.
private Long id;
@Column(length = 20, unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
private String website; // 웹사이트
private String bio; // 자기소개
@Column(nullable = false)
private String email;
private String phone;
private String gender;
private String profileImageUrl; // 사진
private String role; // 권한
private LocalDateTime createDate;
@PrePersist // 디비에 INSERT 되기 직전에 실행
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
[ Subscribe ]
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
// 외래키 유니크 제약조건 추가
@Table(
uniqueConstraints = {
@UniqueConstraint(
name = "subscribe_uk",
columnNames = {"fromUserId", "toUserId"}
)
}
)
public class Subscribe {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략을 데이터베이스를 따라간다.
private Long id;
@ManyToOne
@JoinColumn(name = "fromUserId")
private User fromUser;
@ManyToOne
@JoinColumn(name = "toUserId")
private User toUser;
private LocalDateTime createDate;
@PrePersist // 디비에 INSERT 되기 직전에 실행
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
참고