일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- @Query
- JPA
- 구글알고리즘
- 데이터베이스
- useEffect
- linkedhastset
- addflashattribute()
- 워드프레스
- 리액트오류
- 구글
- Polylang
- Thymeleaf
- firebase
- @Entity
- SEO
- 인텔리제이
- router
- 플러그인
- addallattributes()
- post
- GET
- @Repository
- mergeattributes()
- Login
- 구글애널리틱스
- HttpSession
- GA4
- set
- configureviewresolvers()
- ChatGPT
- Today
- Total
개발천재
[Spring Boot] Hibernate와 JPA: @Entity부터 @Table까지 한 번에 이해하기 본문
[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
}
'개발 준비 > Spring Boot' 카테고리의 다른 글
[Spring Boot] JPA와 Hibernate (2) | 2025.02.17 |
---|---|
[Spring Boot] 인텔리제이에서 DB 정보 환경 변수 설정하기 (2) | 2025.02.17 |
[Spring Boot] 꼭 알아야 할 필수 프로퍼티 설정 총정리 (2) | 2025.02.17 |
[Spring Boot] MVC 패턴 이해하기 (3) | 2025.02.14 |
[Spring Boot] Bean 개념과 이해, @Autowired (3) | 2025.02.14 |