객체와 테이블 매핑 : @Entity, @ Table
필드와 컬럼 매핑 : @Column
기본 키 매핑 : @Id
연관관계 매핑 : @ManyToOne , @JoinColumn
⭐ Entity 매핑
Entity 매핑은 객체와 데이터베이스 테이블 간의 매핑을 정의하는 작업을 말합니다. Java 언어로 정의된 엔티티 클래스와 데이터베이스의 릴레이션(테이블) 간에 어떤 관계를 맺을지를 지정하는 것이며, 이를 통해 객체 지향 프로그래밍과 관계형 데이터베이스 간의 변환을 가능하게 합니다.
Entity 매핑을 통해 엔티티 클래스의 필드와 데이터베이스의 컬럼을 매핑하고, 객체 간의 관계를 데이터베이스의 외래 키(Foreign Key)와 연결합니다. JPA를 사용하여 데이터베이스와 상호작용하는데 필요한 정보를 제공합니다.
@Entity 어노테이션을 클래스에 붙이면 해당 클래스가 JPA 엔티티임을 나타냅니다.JPA는 @Entity 어노테이션이 붙은 클래스를 데이터베이스의 테이블과 매핑하여 객체를 영구 저장소에 저장하고 관리합니다.
@Entity 어노테이션의 주요 특징은 다음과 같습니다:
JPA에서 관리하는 엔티티 클래스는 반드시 @Entity 어노테이션이 붙어야 합니다.@Entity 어노테이션이 붙은 클래스는 JPA의 영속성 컨텍스트에서 관리되며, 데이터베이스와 매핑되는 역할을 수행합니다. @Entity 어노테이션을 사용하는 클래스는 기본 생성자가 반드시 필요하며, 파라미터가 없는 기본 생성자를 갖고 있어야 합니다.
@Entity 어노테이션을 사용하여 JPA 엔티티 클래스를 정의하면, JPA는 해당 클래스와 연결된 데이터베이스 테이블을 자동으로 생성하고,엔티티의 상태를 추적하고, 영속성 컨텍스트를 통해 엔티티를 관리하는 등의 기능을 제공합니다.
주요한 엔티티 매핑 어노테이션은 다음과 같습니다:
- @Entity : 엔티티 클래스를 정의할 때 사용하는 어노테이션입니다. 해당 클래스가 JPA에서 관리하는 엔티티임을 지정합니다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수입니다. 작성 시 주의점으로는 기본 생성자가 필수적입니다.
- name : 엔티티의 이름을 지정합니다. 기본적으로 클래스 이름과 동일하게 사용되지만, 다른 이름을 사용하고 싶을 때에는 이 속성을 이용하여 이름을 설정할 수 있습니다
- catalog : 엔티티의 카탈로그(catalog)를 지정합니다. 데이터베이스에는 여러 개의 카탈로그가 존재할 수 있으며, 엔티티가 속한 카탈로그를 지정할 때 사용합니다.
- schema : 엔티티의 스키마(schema)를 지정합니다. 스키마는 테이블의 집합을 그룹화하는 개념으로 사용되며, 엔티티가 속한 스키마를 지정할 때 사용합니다.
- indexes : 엔티티에 대한 인덱스(index)를 정의합니다. @Index 어노테이션을 통해 여러 개의 인덱스를 정의할 수 있습니다.
- uniqueConstraints : 엔티티에 대한 유니크 제약 조건(unique constraint)을 정의합니다. @UniqueConstraint 어노테이션을 통해 여러 개의 유니크 제약 조건을 정의할 수 있습니다.
- listeners : 엔티티의 이벤트를 처리하는 리스너(listener)를 지정합니다. @EntityListeners 어노테이션을 통해 엔티티 리스너를 등록할 수 있습니다.
- name : 엔티티의 이름을 지정합니다. 기본적으로 클래스 이름과 동일하게 사용되지만, 다른 이름을 사용하고 싶을 때에는 이 속성을 이용하여 이름을 설정할 수 있습니다
- @Column : 엔티티 클래스의 필드를 데이터베이스 컬럼과 매핑할 때 사용하는 어노테이션입니다. 컬럼명, 데이터 타입, 길이 등을 설정할 수 있습니다.
- column unique 조건은 데이터베이스 테이블의 열(Column)에 대해 고유한(unique) 값만 저장하도록 제약을 설정하는 것을 말합니다. 이러한 제약조건은 데이터베이스에서 중복된 값을 허용하지 않도록 하는데 사용됩니다.
ex) @Column(nullable = false , length 10); NotNull(필수 작성) , column의 길이는 10자 초과 X - @Id : 엔티티의 주키(primary key)를 정의하는 어노테이션입니다.
- @GeneratedValue: 주키의 값을 자동으로 생성하기 위해 사용되는 어노테이션으로, 주로 자동증가(Auto Increment)를 지정합니다.
- @OneToMany, @ManyToOne, @OneToOne, @ManyToMany: 엔티티 간의 관계를 매핑할 때 사용하는 어노테이션으로, 객체의 연관관계를 데이터베이스의 외래 키로 매핑합니다.
- @Embedded: 다른 엔티티를 포함한 복합 타입(Embeddable)을 정의할 때 사용하는 어노테이션입니다.
데이터 베이스 스키마 자동 생성
DataBase Schema 자동 생성은 JPA(Java Persistence API)를 사용할 때 제공되는 기능 중 하나입니다. JPA는 객체와 데이터베이스 테이블을 매핑하기 위해 사용되는 ORM(Object-Relational Mapping) 기술로,
엔티티 클래스를 바탕으로 데이터베이스 테이블을 자동으로 생성할 수 있습니다.
스프링 프레임워크를 사용하는 경우, 스프링 부트를 통해 JPA 설정을 간단하게 구성할 수 있으며, 스키마 자동 생성을 활성화할 수 있습니다. 스키마 자동 생성은 주로 개발 환경에서 사용합니다. DDL 생성 기능은 DDL을 자동 생성할때만 사용되고 JPA의 실행 로직에는 영향을 주지 않습니다.
스프링 부트를 사용하여 데이터베이스 스키마 자동 생성을 활성화하려면, application.properties 또는 application.yml 파일에 다음과 같이 설정합니다
# application.properties -> 스키마 자동 생성
spring.jpa.hibernate.ddl-auto=create
# application.properties -> 스키마 자동 생성을 비활성화
spring.jpa.hibernate.ddl-auto=none
위의 설정은 애플리케이션을 실행할 때마다 엔티티 클래스를 기반으로 데이터베이스에 테이블을 자동으로 생성합니다. 그러나 스키마 자동 생성을 사용할 때는 주의해야 합니다.
이미 데이터베이스에 데이터가 존재하는 경우, 스키마 자동 생성 시 기존 데이터가 삭제될 수 있으므로, 테스트 환경 등 개발 시에만 사용하는 것이 좋습니다.
배포나 운영 환경에서는 spring.jpa.hibernate.ddl-auto 값을 none으로 설정하거나 주석 처리하여 스키마 자동 생성을 비활성화하고, 데이터베이스 스키마를 수동으로 관리하는 것을 권장합니다.
데이터베이스 스키마를 수동으로 관리하는 경우에는 변경된 엔티티 클래스를 기반으로 데이터베이스 테이블을 직접 변경해야 합니다. 이러한 방식은 운영 환경에서 더 안전하고 안정적입니다.
스키마 자동 생성과 관련된 주요 속성
- create: 애플리케이션 시작 시 스키마를 생성합니다. 이미 존재하는 경우는 삭제하고 다시 생성합니다. (개발 초기 단계에는 create , update)
- update : 변경된 부분만 반영해주고, 운영 DB에는 절대 사용하면 안됩니다.
- drop: 애플리케이션 종료 시 스키마를 삭제합니다.
- none: 스키마 생성 액션을 수행하지 않습니다. 개발자가 수동으로 스키마를 생성해야 합니다.
- validate : Entity와 테이블이 정상 매핑되었는지 확인할 때 사용합니다.
📋 필드와 컬럼 매핑
요구사항 선정
- 회원은 일반 회원과 관리자로 구분해야 한다.
- 회원 가입일과 수정일이 있어야 한다.
- 회원을 설명할 수 있는 필드가 있어야 하고, 필드의 길이는 제한이 없다.
필드와 컬럼 매핑
필드(Field)와 컬럼(Column) 매핑은 JPA(Entity) 클래스의 필드와 데이터베이스의 컬럼을 연결해주는 작업을 말합니다. 이를 통해 JPA 클래스의 필드 값을 데이터베이스에 저장하고 조회할 수 있습니다.
JPA에서 필드와 컬럼을 매핑하는 방법은 다음과 같습니다:
- 필드 매핑: JPA 클래스의 필드를 데이터베이스 컬럼과 연결합니다. 필드의 타입과 이름, 접근 제어자 등을 이용하여 데이터베이스 컬럼과 매핑합니다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "username")
private String name;
}
@Column(name = "username") 어노테이션은 name 필드를 데이터베이스의 username 컬럼과 매핑하는 역할을 합니다. 이렇게 필드와 컬럼을 매핑하면, name 필드의 값을 데이터베이스의 username 컬럼에 저장하고 조회할 수 있습니다.
2. 테이블 매핑: JPA 클래스를 데이터베이스의 테이블과 연결합니다. JPA 클래스에 @Entity 어노테이션을 사용하여 테이블과 매핑합니다.
@Entity
@Table(name = "members")
public class Member {
// 필드 매핑 생략
}
위의 예시에서 @Table(name = "members") 어노테이션은 Member 클래스를 데이터베이스의 members 테이블과 매핑하는 역할을 합니다.
이렇게 테이블과 클래스를 매핑하면, Member 클래스의 인스턴스를 데이터베이스의 members 테이블과 연결하여 데이터를 주고 받을 수 있습니다.
필드와 컬럼 매핑을 통해 JPA 클래스의 필드와 데이터베이스의 컬럼을 연결하여 데이터를 영속화하고 조회할 수 있으며, JPA의 기능과 편의성을 최대한 활용하여 데이터베이스와 자바 객체 간의 변환 작업을 간편하게 수행할 수 있습니다.
✍️ @Column의 대표적인 속성들
- name : 필드를 데이터베이스 컬럼과 매핑할 때 사용할 컬럼의 이름을 지정합니다. 기본값은 필드의 이름과 동일합니다.
- unique : 해당 컬럼의 값이 고유(unique)해야 하는지를 지정합니다. 기본값은 false입니다.
- nullable : 해당 컬럼의 값이 null을 허용하는지를 지정합니다. 기본값은 true입니다.
- length : 해당 컬럼의 최대 길이를 지정합니다. 문자열 필드에만 적용되며, 기본값은 255입니다.
- precision, scale : 숫자 타입 필드에서 사용되며, precision은 전체 자리수를, scale은 소수점 이하 자리수를 지정합니다.
- columnDefinition : 컬럼의 데이터 타입과 제약 조건을 직접 지정할 때 사용합니다. 데이터베이스에 따라 특정 데이터 타입을 사용해야 하는 경우에 유용합니다.
- insertable, updatable : 해당 컬럼의 값이 삽입(insertable) 또는 변경(updatable) 가능한지를 지정합니다. 기본값은 true입니다.
1. name
@Column(name = "username")
private String name;
2. unique
@Column(unique = true)
private String email;
3.nullable
@Column(nullable = false)
private String name;
4. length
@Column(length = 100)
private String description;
5.precision, scale
@Column(precision = 10, scale = 2)
private BigDecimal price;
6.columnDefinition
@Column(columnDefinition = "varchar(100) default 'N/A'")
private String category;
7.insertable, updatable
@Column(insertable = false, updatable = false)
private LocalDateTime createdAt;
'[ BACKEND] > Spring' 카테고리의 다른 글
[SPRING] 양방향 연관관계 (0) | 2023.08.09 |
---|---|
[SPRING] 연관 관계 매핑 (단방향) (0) | 2023.08.08 |
[SPRING] Entity와 영속성 (0) | 2023.08.06 |
[SPRING] ORM 그리고 JPA (0) | 2023.08.05 |
[SPRING] Servlet / JSP / MVC (0) | 2023.08.04 |