๐ŸŒฑ Spring Boot ์‹œ์ž‘ํ•˜๊ธฐ 17 -JPA Entity์™€ ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜

๊น€์„ธํ˜„ยท2025๋…„ 10์›” 23์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
17/19

๋‚ ์งœ:2025-10-23


ํ•™์Šต ๋ชฉํ‘œ

  • @Entity, @Table, @Id, @GeneratedValue, @Column ๋“ฑ ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ์ดํ•ด
  • ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ 1:1 ๋งคํ•‘ ์ดํ•ด
  • DDL ์ž๋™ ์ƒ์„ฑ ์˜ต์…˜ ์„ค์ • ์ดํ•ด

โœ… Entity ๊ฐœ๋…

Entity๋ž€?

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ 1:1 ๋Œ€์‘๋˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค
  • ํ…Œ์ด๋ธ”์˜ ํ–‰(row)์„ ๊ฐ์ฒด(object) ๋กœ ๋งคํ•‘
  • ORM(Object-Relational Mapping)์˜ ํ•ต์‹ฌ

โœ… ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜

1)@Entity

  • ํด๋ž˜์Šค๊ฐ€ JPA ์—”ํ‹ฐํ‹ฐ์ž„์„ ๋‚˜ํƒ€๋ƒ„
  • ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์ด๋ฆ„์ด ํ…Œ์ด๋ธ” ์ด๋ฆ„๊ณผ ๋งคํ•‘๋จ
 @Entity
     public class Member {
    // ํด๋ž˜์Šค ๋‚ด์šฉ
    }

2) @Table

  • ์—”ํ‹ฐํ‹ฐ์™€ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ •
  • ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์•ฝ์–ด ๋ฌธ์ œ ๋ฐฉ์ง€
  @Entity
    @Table(name = "members")
    public class Member {
    // ํด๋ž˜์Šค ๋‚ด์šฉ
    }

Id & @GeneratedValue**

  • Id: ๊ธฐ๋ณธ ํ‚ค(Primary Key) ๋งคํ•‘
  • GeneratedValue: ๊ธฐ๋ณธ ํ‚ค ์ž๋™ ์ƒ์„ฑ ์ „๋žต ์ง€์ •
  • ySQL์—์„œ๋Š” IDENTITY ์ „๋žต ์‚ฌ์šฉ
    @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       private Long id;


---

## **4)@Column**
- ํ•„๋“œ์™€ ์ปฌ๋Ÿผ ๋งคํ•‘ ์ •๋ณด ์ง€์ •
- @Column์˜ ์†์„ฑ
  - name: ์ปฌ๋Ÿผ๋ช… ์ง€์ •
  - length: ๋ฌธ์ž ๊ธธ์ด ์ œ์•ฝ
  - nullable: null ํ—ˆ์šฉ ์—ฌ๋ถ€
  - unique: ์œ ๋‹ˆํฌ ์ œ์•ฝ ์กฐ๊ฑด

```java
 @Column(unique = true, nullable = false, length = 50)
    private String email; 

โœ… ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ” ๋งคํ•‘

  • ์—”ํ‹ฐํ‹ฐ๋Š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ‘œํ˜„
  • DB ์ปฌ๋Ÿผ์€ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ์™€ 1:1 ๋Œ€์‘
  • ORM์„ ํ†ตํ•ด ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ€๋Šฅ
  • @Column ๊ธฐ๋ณธ๊ฐ’: length=255, nullable=true

ํ…Œ์ด๋ธ” SQL

CREATE TABLE users (
   id BIGINT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(50) NOT NULL,
   email VARCHAR(255) NOT NULL UNIQUE,
   address VARCHAR(255)
   );

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

@Getter
   @Entity
   @Table(name = "users")
   @NoArgsConstructor(access = AccessLevel.PROTECTED)
   public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;

   @Column(length = 50, nullable = false)
   private String name;

   @Column(unique = true, nullable = false)
   private String email;

   private String address;
   }

๐Ÿ’ก ํฌ์ธํŠธ

  • @Column ๋ฏธ์‚ฌ์šฉ ์‹œ length=255, nullable=true ๊ธฐ๋ณธ๊ฐ’
  • @NoArgsConstructor(access = AccessLevel.PROTECTED): JPA ๋‚ด๋ถ€ ์ƒ์„ฑ์šฉ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์ œ๊ณต

โœ… JPA DDL ์„ค์ •

application.properties ์˜ˆ์‹œ

spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=12345678
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
          spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
    spring.jpa.hibernate.ddl-auto=create
    spring.jpa.show-sql=true
    spring.jpa.properties.hibernate.format_sql=true

ddl-auto ์˜ต์…˜

์˜ต์…˜์„ค๋ช… ์‚ฌ์šฉ ์‹œ๊ธฐ
create๊ธฐ์กด ํ…Œ์ด๋ธ” ์‚ญ์ œ ํ›„ ์žฌ์ƒ์„ฑ
create-dropcreate + ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ
update๋ณ€๊ฒฝ๋ถ„๋งŒ ๋ฐ˜์˜(์ปฌ๋Ÿผ ์ถ”๊ฐ€)
validate์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ” ๋งคํ•‘ ์ •๋ณด๋งŒ ํ™•์ธ
noneDDL ์ž๋™ ์ƒ์„ฑ ์‚ฌ์šฉ ์•ˆํ•จ

SQL ์ถœ๋ ฅ ์˜ต์…˜

์˜ต์…˜์„ค๋ช…
show-sql์‹คํ–‰๋˜๋Š” SQL ๋กœ๊ทธ ์ถœ๋ ฅ
format_sql๋กœ๊ทธ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด SQL ํฌ๋งทํŒ…

์ •๋ฆฌ

  • Entity๋Š” DB ํ…Œ์ด๋ธ”์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•œ ํด๋ž˜์Šค
  • .@Entity, @Table, @Id, @GeneratedValue, @Column๋Š” JPA ๋งคํ•‘์˜ ํ•ต์‹ฌ
  • @NoArgsConstructor(PROTECTED): JPA๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ
  • DDL ์˜ต์…˜(create, update, validate)์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ํ…Œ์ด๋ธ” ์ž๋™ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • JPA๋ฅผ ํ†ตํ•ด SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐ์ž‘ ๊ฐ€๋Šฅ
profile
๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ•œ ๊ฑธ์Œ

0๊ฐœ์˜ ๋Œ“๊ธ€