개발천재

[Spring Boot] Hibernate와 JPA: @Entity부터 @Table까지 한 번에 이해하기 본문

개발 준비/Spring Boot

[Spring Boot] Hibernate와 JPA: @Entity부터 @Table까지 한 번에 이해하기

세리블리 2025. 2. 17. 22:28
반응형

@Table 이해하기

@Entity는 “이 클래스는 데이터베이스의 테이블”이라고 알려주는 역할을 하고, Hibernate나 JPA가 이 이름표를 보고 데이터베이스에 테이블을 자동으로 만들어 준다.

 

@Table은 “이 클래스가 어떤 테이블과 연결될지 이름표를 붙여주는 역할”을 한다. 자바 클래스 이름과 데이터베이스 테이블 이름이 다를 때 어떤 테이블과 연결될지 Hibernate에게 알려줘야 하기 때문에 @Table 클래스를 사용한다.

만약 클래스 이름이 User인데, 데이터베이스 테이블 이름이 member라면 @Table(name = "member")라고 적어서 “이 클래스는 member 테이블과 연결될 거야!”라고 알려주는 것이다. 자바 코드에서 User 객체를 생성하거나 수정하면, 실제로는 member 테이블에 데이터가 저장되고 변경된다.

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "member")  // 이 클래스는 'member' 테이블과 연결됩니다!
public class User {
    @Id
    private Long id;
    private String username;
    private String password;
}

 

@Table이 없으면 기본적으로 클래스 이름(User)이 테이블 이름(user)으로 사용된다. 만약 다른 이름의 테이블과 연결하고 싶으면 꼭 @Table을 사용해야 한다.

 


 


데이터베이스와 자바 객체를 연결하는 주요 어노테이션

Hibernate와 JPA에서 @Entity와 @Table처럼 데이터베이스와 자바 객체를 연결하는 여러 클래스(어노테이션)들이 있다. 아래의 어노테이션(클래스)들이 모여서 Hibernate나 JPA에서 자바 코드로 데이터베이스를 쉽게 관리할 수 있도록 도와준다.

 

  • @Entity: “이 클래스는 테이블이다!”
  • @Table: “이 클래스가 어떤 테이블과 연결될지 알려줘!”
  • @Id: “이 컬럼은 기본키야!”
  • @Column: “이 변수는 테이블의 컬럼이다!”
  • @GeneratedValue: “기본키 값을 자동으로 생성할게!”
  • @OneToMany, @ManyToOne 등: “테이블 간 관계를 설정할게!”
  • @Transient: “이 변수는 DB에 저장하지 마!”

 

package com.my.basicCRUD.entity;

import jakarta.persistence.*;
import lombok.Data;

@Entity
@Table(name = "member")
@Data
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;

    @Column(name = "member_name", length = 100, nullable = false)
    private String name;

    private int age;
    private String address;
}



@Entity

데이터베이스의 테이블과 연결되는 자바 클래스라고 표시하는 어노테이션이다. “이 클래스는 데이터베이스 테이블이야!”라고 이름표를 붙이는 역할을 한다.  Hibernate나 JPA가 이 이름표를 보고 데이터베이스에 테이블을 자동으로 만들어 준다.

 

 

@Table

어떤 데이터베이스 테이블과 연결될지 지정하는 어노테이션이다. “이 클래스는 member 테이블과 연결된다!”라고 이름표를 정확하게 붙여주는 역할을 한다. name 옵션을 이용해 연결할 테이블 이름을 설정할 수 있다.

@Table(name = "member")

 

 

@Id

기본 키(Primary Key)를 설정해준다. “이 열(Column)은 주민등록번호처럼 데이터를 유일하게 식별할 거야!”라고 지정할 수 있다. 없으면 Hibernate가 어떤 컬럼이 고유값인지 모르기 때문에 에러가 난다.

@Id
private Long memberId;

 

 

@GeneratedValue

기본 키의 값을 자동으로 생성하게 해준다. 예를 들어 회원가입할 때 자동으로 회원번호를 1번부터 차례로 만들어줄 수 있다. strategy 옵션을 넣으면 데이터베이스에서 자동으로 증거를 시켜준다.( MySQL = AUTO_INCREMENT )

@GeneratedValue(strategy = GenerationType.IDENTITY)

 

 

@Column

데이터베이스의 컬럼을 설정한다. “이 변수는 테이블의 이 열(Column)이야!”라고 설정하는 것이다.
name으로 연결할 컬럼 이름을 지정할 수 있고, nullable: false로 하면 NOT NULL 제약 조건을 추가할 수 있다. length는 문자열 길이 지정할 수 있다(=VARCHAR(255))

@Column(name = "member_name", length = 100, nullable = false)
private String name;

 

 

@OneToOne, @OneToMany, @ManyToOne, @ManyToMany

테이블 간의 관계를 설정한다.

@OneToOne: “1대1로 연결돼!” (예: 사용자와 주소)

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    
    @OneToOne
    private UserProfile userProfile;  // User는 하나의 UserProfile을 가짐
}

@Entity
public class UserProfile {
    @Id
    private Long id;
    private String bio;
    
    @OneToOne(mappedBy = "userProfile")
    private User user;  // UserProfile은 하나의 User를 가짐
}


@OneToMany: “1대다 관계야!” (예: 회원 1명과 여러 주문)

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    
    @OneToMany(mappedBy = "user")
    private List<Order> orders;  // 하나의 User는 여러 개의 Order를 가짐
}

@Entity
public class Order {
    @Id
    private Long id;
    private String product;
    
    @ManyToOne
    private User user;  // 여러 개의 Order는 하나의 User에 속함
}


@ManyToOne: “다대1 관계야!” (예: 여러 주문이 한 회원에게 연결)

@Entity
public class Order {
    @Id
    private Long id;
    private String product;
    
    @ManyToOne
    private User user;  // 여러 개의 Order는 하나의 User에 속함
}

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    
    @OneToMany(mappedBy = "user")
    private List<Order> orders;  // 하나의 User는 여러 개의 Order를 가짐
}


@ManyToMany: “다대다 관계야!” (예: 학생 여러 명이 여러 과목을 듣는 경우)

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    
    @ManyToMany
    private List<Course> courses;  // 하나의 학생은 여러 개의 Course를 수강
}

@Entity
public class Course {
    @Id
    private Long id;
    private String name;
    
    @ManyToMany(mappedBy = "courses")
    private List<Student> students;  // 하나의 Course는 여러 명의 학생이 수강
}

 

 

 

@Transient

데이터베이스에 저장하지 않을 변수를 표시한다. “이 변수는 DB에 저장 안 할 거야! 그냥 프로그램에서만 사용할 거야!”라고 설정하는 것이다.

@Transient
private String code;

 

 

@Embeddable / @Embedded

하나의 클래스를 다른 엔티티 클래스 안에 포함시켜서 사용할 때 사용한다. “주소를 Address라는 재사용 가능한 클래스로 만들고, 이걸 회원 엔티티에 붙여서 쓰자!”라고 설정하는 것이다.

// 값 객체: Address
@Embeddable  // 값 타입을 정의
public class Address {
    private String city;
    private String street;
    private String zipcode;

    // 기본 생성자, getter, setter
}

@Entity  // 엔티티
public class User {
    @Id
    private Long id;
    private String username;

    @Embedded  // 값 객체 포함
    private Address address;

    // 기본 생성자, getter, setter
}



반응형