JPA Entity 설정하기

✒️ 2025-08-05 13:54 내용 수정



1. Entity 지정

import jakarta.persistence.*;  
  
@Entity  // Entity임을 명시
public class User {
	@Id
	private Long Id;
	@Column
	private String name;
	
	public User() {}
	public User(Long id, String name) {
		this.id = id;
		this.name = name;
	}

	public void setId(Long id) {this.id = id;}
	public Long getId() {return this.id;}
	public void setName(String name) {this.name = name;}
	public String getName() {return this.name;}
}
import jakarta.persistence.*;
import lombok.Data;  
import lombok.NoArgsConstructor;  
  
@Entity  // Entity임을 명시
@Data  
@NoArgsConstructor  
public class User {
	@Id
	private Long Id;
	@Column
	private String name;
	
	public User(Long id, String name) {
		this.id = id;
		this.name = name;
	}
}

2. Id 설정

package com.mini.quiz.entity;  
  
import jakarta.persistence.*;  
import lombok.Data;  
import lombok.NoArgsConstructor;  
  
@Entity  
@Data  
@NoArgsConstructor  
public class User {  
  
    @Id  // 식별자 설정
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // Primary key 생성 전략
    private Long id;  
}

@GeneratedValue의 생성 전략

  1. AUTO : 기본 설정값이며, JPA의 기본 생성 전략이다.
    • 데이터베이스의 설정에 따라 primary key가 자동으로 생성된다.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
  1. IDENTITY : 사용하는 DB의 자동 생성 전략에 따르며, 자동 증가 열(auto-increment columns) 설정을 따른다.
    • MySQL, PostgreSQL 등과 같이 자동 증가 열 설정을 지원하는 DB에서 사용된다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
  1. SEQUENCE : DB Sequence를 사용하여 생성하는 전략으로, DB의 Sequence 객체를 필요로 한다.
    • Oracle, PostgreSQL과 같이 Sequence를 지원하는 DB에서 사용된다.
    • Sequence 이름을 지정할 때 @SequenceGenerator Annotation을 사용한다.
    • 이 설정을 사용 시 DB에도 Sequence가 필요하다.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq_gen")
@SequenceGenerator(name = "user_seq_gen", sequenceName = "user_id_seq", allocationSize = 1)
private Long id;
  1. TABLE : Primary key 생성에 사용되는 별개의 테이블을 사용하는 전략이다.
    • 다른 생성 전략보다는 효율이 낮을 수 있으며, 잘 사용되지 않는다.
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_gen")
@TableGenerator(name = "user_table_gen", table = "user_id_table",
			   pkColumnName = "id_key", pkColumnValue = "id_value", allocationSize = 1)
private Long id;
  1. UUID : UUID(Universally Unique Indentifier)를 사용하여 primary key를 생성하는 전략이다.
    • 데이터베이스 전반에 걸친 유일성이 필요한 경우에 사용할 수 있다.
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private Long id;

3. Table 설정

@Entity  
@Data  
@NoArgsConstructor  
@Table(name="UserInfo", schema="Home") // DB의 Home 스키마의 UserInfo라는 테이블과 User Entity를 매칭
public class User {  
  
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;  
}

4. Column 설정

속성 설명
name Table의 특정 Column과 Entity의 field를 매칭
length column의 데이터 길이를 설정
unique 해당 column의 unique 여부를 설정
제약조건 참고.
nullable 해당 column의 null 여부를 설정
@ColumnDefault 테이블 생성 시 DDL에 작성될 column의 기본값을 설정
@ColumnDefault("defaultValue") 테이블 생성 시 DDL에 작성될 column의 기본값을 설정
package com.mini.quiz.entity;  
  
import jakarta.persistence.*;  
import lombok.Data;  
import lombok.NoArgsConstructor;  
  
@Entity  
@Data  
@NoArgsConstructor  
public class User {  
  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    private Long id;  
  
    @Column(length = 50, // 해당 column의 길이를 50으로 설정
	    nullable = false, // null을 허용하지 않도록 설정
	    unique = true)  // 해당 column의 unique를 설정
    private String email;  
  
    @Column(name = "username", // DB Table에서 username이라는 column과 매칭
	    length = 15, nullable = false, unique = true)  
    private String nickname;  
  
    @Column(nullable = false)
    @ColumnDefault("false") // 해당 컬럼의 기본값을 false로 설정
    private boolean blocked;  
  
    @Column(length = 100)  
    private String profile;  
  
    @Column(length = 30, nullable = false)  
    private String password;  
	
	@Column(nullable = false, 
		columnDefinition = "boolean default false")  // 해당 컬럼의 기본값을 false로 설정
	private boolean verified;
}

5. Entity 관계 설정

참고 자료 : Jonathan's Hibernate - OneToOne, OneToMany, ManyToOne and ManyToMany

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

    @OneToOne
    private UserProfile profile;
}

@Entity
public class UserProfile {
    @Id 
    @GeneratedValue
    private Long id;
    private String address;
}

1) 1:1 관계

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// UserProfile과 연결
    @OneToOne
    private UserProfile profile;
}

@Entity
public class UserProfile {
    @Id 
    @GeneratedValue
    private Long id;
    private String address;
}
@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// profile_id를 저장
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "profile_id")
    private UserProfile profile;
}

@Entity
public class UserProfile {
    @Id 
    @GeneratedValue
    private Long id;
    private String address;

	@OneToOne(
		mappedBy = "userProfile",
		CascadeType.all,
		orphanRemoval = true
	)
	private User user;
}

2) 1:N, N:1 관계

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

    @OneToMany
    private List<Order> orders = new ArrayList<>();
}

@Entity
public class Order {
    @Id 
    @GeneratedValue
    private Long id;
    private String product;

    @ManyToOne
    private User user;
}
@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// Order의 user로 매핑됨
    @OneToMany(mappedBy = "user")
    private List<Order> orders = new ArrayList<>();
}

@Entity
public class Order {
    @Id 
    @GeneratedValue
    private Long id;
    private String product;

	// user_id를 저장
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

3) N:M 관계

@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String username;

    @ManyToMany
    private Set<Role> roles = new HashSet<>();
}

@Entity
public class Role {
    @Id @GeneratedValue
    private Long id;
    private String roleName;

    @ManyToMany
    private Set<User> users = new HashSet<>();
}
@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String username;

	// User에 Role의 필드 users로 연결됨을 명시
    @ManyToMany(mappedBy = "users")
    private Set<Role> roles = new HashSet<>();
}

@Entity
public class Role {
    @Id @GeneratedValue
    private Long id;
    private String roleName;

    @ManyToMany
    private Set<User> users = new HashSet<>();
}

6. 연관 관계 로딩 전략(FetchType)

1) 지연 로딩(Lazy Loading)

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// profile_id를 저장
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "profile_id")
    private UserProfile profile;
}

2) 즉시 로딩(Eager Loading)

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// profile_id를 저장
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "profile_id")
    private UserProfile profile;
}

7. 영속성 전파 설정(Cascading)

@Entity
public class User {
    @Id 
    @GeneratedValue
    private Long id;
    private String username;

	// 부모 Entity
    @OneToMany(
	    mappedBy = "order",
	    cascade = CascadeType.ALL
    )
    private List<Order> orders = new ArrayList<>();
}

@Entity
public class Order {
    @Id 
    @GeneratedValue
    private Long id;
    private String product;

	// 자식 Entity
	// user_id를 저장
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}
타입 설명
CascadeType.ALL 모든 옵션을 적용
PERSIST, MERGE, REMOVE, REFRESH, DETACH
CascadeType.PERSIST PERSIST(save) 동작만 적용
부모 Entity를 저장하면 자식 Entity도 자동 저장
CascadeType.MERGE MERGE(update) 동작만 적용
부모 Entity를 수정/병합하면 자식 Entity에도 병합
CascadeType.REMOVE REMOVE(remove) 동작만 적용
부모 Entity를 제거하면 자식 Entity도 제거
CascadeType.REFREST REFRESH 동작만 적용
부모 Entity를 새로고침하면 자식 Entity도 최신 상태로 동기화
CascadeType.DETACH DETACH 동작만 적용
부모 Entity가 비영속 상태가 되면 자식 Entity도 비영속 상태로 적용