티스토리 뷰

Backend/Spring

#23 Entity Class

RadderNepa 2023. 9. 10. 11:56

- JPA를 이용해 User class와 User table을 매핑 즉, Java 객체와 MySQL Table을 매핑해보자

- 현재 User 객체와 User 테이블의 속성은 아래와 같다.

인프런 - 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!(최태현)


● 매핑하기

(1). User class에 @Entity Annotation을 붙여준다.

@Entity
1. Spring이 User 객체와 User 테이블을 같은 것으로 바라보게(생각하게) 해준다.
2. Entity = 저장되고 관리되어야 하는 데이터

 

(2). 현재 User class에 빠져있는 id를 추가해줘야한다.(객체와 테이블을 일치시켜야하니까)

- 단순히 class에 id 필드만 추가해서는 안 되고 아래와 같이 Annotation을 몇 개 붙여줘야한다.

인프런 - 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!(최태현)

@Id : 해당 필드를 PK로 간주한다.
@GeneratedValue : PK는 자동 생성되는 값이다.  →  AUTO_INCREMENT를 붙여줬으므로 필요

cf1) MySQL의 bigint는 Java의 Long과 대응된다.

cf2) (javax.persistence.Id)를 import 해줘야한다.

cf3)

인프런 - 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!(최태현)

- (strategy = GenerationType.IDENTITY) 부분은 DB의 종류마다 자동 생성 전략이 다르다.

- 이 글에서는 MySQL의 AUTO_INCREMENT를 사용했고 이것이 IDENTITY 전략과 매칭되기에 사용한 것이다.

AUTO_INCREMENT = IDENTITY

JPA의 자동 생성 전략 옵션들

 

(3). JPA를 사용하기 위해서는 파라미터가 하나도 없는 기본 생성자가 꼭 필요하다

- 즉, JPA 객체(Entity 객체)에는 기본 생성자가 있어야 한다는 말이다.

- 기본 생성자의 접근 제어자는 protected / public 상관없다.

 

(4). id 컬럼을 제외한 기본 column들을 매핑하는 Annotation도 필요하다.

@Column : 객체의 필드와 Table의 필드를 매핑한다.
- null 허용 여부, 길이 제한, DB에서의 column 이름 등을 속성으로 지정할 수 있다.


- @Column Annotation은 생략할 수도 있다.

인프런 - 자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지!(최태현)

- User class의 age와 User table의 age는 완전히 동일하다.

- name 필드의 경우 null 허용 불가나 크기 등을 설정해 줄 필요가 있는데 age는 그러한 설정이 필요없으므로 @Column Annotation이 별도로 필요하지 않다.(크기 제한도 없고 null도 허용되고 Integer와 int는 동일하다.)


● JPA 사용을 위한 추가적인 설정(한 번만 해주면 되는 설정)

- 위의 1~4단계를 통해 객체와 테이블 매핑은 끝났다.

- 이제 application.yml에서 JPA 사용을 내용을 추가해보자

[application.yml]
spring:
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "*****"
    password: "*****"
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    # hibernate 관련 설정
    hibernate:
      ddl-auto: none
    # jpa 속성 설정
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

cf) hibernate는 jpa의 구현체이다.

- 위의 설정들이 어떤 의미인지 하나씩 뜯어서 알아보자

ddl-auto: none
- Spring이 시작할 때 DB에 있는 테이블을 어떻게 처리할지에 대한 부분
- 객체와 테이블을 매핑할 때 이 둘이 서로 다르게 생겼을 경우 무시할 수도 있고, 테이블을 변경할 수도 있고, 잘못되었다고 알려줄 수도 있다.
- 이러한 다양한 선택지를 설정할 수 있는 부분이다.

(ddl-auto 속성 값)
- create : 기존 테이블이 있다면 삭제 후 다시 생성(이러면 table에 있는 데이터도 다 날라간다.)
- create-drop : 스프링이 종료될 때 매핑되었던 테이블을 모두 제거(이러면 table에 있는 데이터도 다 날라간다.)
- update : 객체와 테이블이 다른 부분만 변경
- validate : 객체와 테이블이 동일한지 확인만 하고 확인해서 실패한 경우 서버를 종료시킨다.
- none : 별다른 조치를 하지 않는다.
show_sql: true
- JPA를 사용해 DB에 SQL을 날릴 때 해당 SQL을 보여줄지를 설정

format_sql: true
- SQL을 보여줄 때 읽기 쉽게 포맷팅 할 것인가

dialect: org.hibernate.dialect.MySQL8Dialect
- dialect = 방언, 사투리
- 해당 옵션으로 DB를 특정하면 다양한 종류의 DB마다 조금씩 다른 SQL 문법을 지정한 DB에 맞게 수정해준다.
- JPA가 MySQL에 맞게 수정해주는 것이다.

 

cf)

https://wikidocs.net/232

 

07-02 접근 제어자

접근 제어자(access modifier)를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다. 다음과 같은 접근 제어자를 사용하여 사용 권한을 설정할 수 있다. * pri…

wikidocs.net

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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 29 30
31
글 보관함