DB/JPA

[JPA] Entity Class 만들기

보보트레인 2024. 1. 10. 16:51

학습목표

1. JPA어노테이션 이해

2. JPA로 Entity 생성

3. 간단한 crud 조작 실습


<전제조건>

Mysql workbench에서 다음과 같은 user 테이블을 생성한 상태를 가정.


1. User Class 만들기

package com.group.libraryapp.domain.user;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //AutoIncrement 붙혔기 때문에.
    private Long id = null; // id를 mysql에서 bigint로 만들었기때문에 이와 대응되는 Long으로 만들어야 한다.
    private String name;
    private Integer age;
	
    //기본생성자가 꼭 필요하다.
    protected User() {}

    
    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public User(String name, Integer age) {

        if (name == null || name.isBlank()) { // String.format은 예외의 메시지처리 의미.
            throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다", name));
        }

        this.name = name;
        this.age = age;


    }
}

 

<설명>

1. @Entity : 스프링이 User객체와 user테이블을 같은 것으로 바라본다.

그래서 Entity가 뭔데? : 저장되고 관리되어야 하는 데이터

 

2. @Id : 이 필드를 PK(Primary Key)로 간주한다.

 

3.  id는 테이블 생성 ddb문 ( 상단의 이미지 )를 보면 BIGINT로 생성했다. 이는 JAVA의 Long과 대응되기에 변수타입을 Long으로 설정해준다. 

 

4. id는 pk로써 AutoIncrement라는 부가조건을 붙혔기 때문에, 다음과 같은 어노테이션을 추가해준다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

 

@GeneratedValue : Primary Key는 자동생성되는 값이라는 것을 보여주는 identity다.

 

5. 기본생성자가 꼭 필요하다! 

//기본생성자가 꼭 필요하다.
protected User() {}

 

6. @Column : 객체의 필드와 TABLE의 필드를 매핑한다!

→ null이 들어갈 수 있는지 여부, 길이 제한, DB에서의 column 이름 등등 을 작성한다.

 

※ 다만 TABLE의 필드와 완전히 일치한다면 @Column 어노테이션을 과감히 생략해도 된다.

추가하거나 반드시 언급해야할 내용이 있을때만 사용하도록 하자.

 

잘 보면 age같은 경우에는 추가 조건도 없고 table과 일치하기 때문에 @Column어노테이션을 생략한 것을 확인할 수 있다.

@Column(nullable = false, length = 20) //name varchar(20)
private String name;

private Integer age;

2. application.yml 혹은 application.properties에 JPA에 필요한 내용을 담는다.

 

<application.yml>

spring:
    jpa:
      hibernate:
        ddl-auto: none
      properties:
        hibernate:
          show_sql: true
          format_sql: true
          dialect: org.hibernate.dialect.MySQL8Dialect

 

<설명>

1. ddl-auto : 처음에 스프링을 실행할 때, 기존 테이블들과 ddl문이 다르면 어떻게 할까에 대한 설정장치 - none으로 설정하여 아무 조치도 취하지 않도록 설정.  

 

ddl-auto의 조작사항 명세는 다음과 같다.

 

2. show_sql : jpa를 통해 SQL 을 날릴때, 콘솔창에 SQL 을 보여줄 것인가? 

3. format_sql : jpa를 통해 SQL을 보여줄 때, 보기좋게 포메팅 해줄 것인가?

4. dialect : 이 옵션으로 DB를 특정하면 DB별로 조금씩 다른 SQL을 수정해준다. 

반응형