프로젝트[종료]

9. JPA를 사용하여 SpringBoot와 MariaDB연동하기

알렉스 페레이라 2023. 4. 20. 20:11

myBatis를 주로 사용했지만, JPA(Java Persistent API)를구현한 ORM(Object Relcational Mapping)을 사용하여 객체와 DB테이블을 매핑하려고 한다.

 

ORM의 종류는 크게 세가지가 있는데,

  • Hibernate
  • EclipseLink
  • DataNucleus

가장 많이쓰이고 정보도 많은게 Hibernate이기때문에,, 해당 기술을 사용해보려고 한다.

 

1.build.gradle에 dependencies를 추가한다.

2.application.properties에 jpa및 jdbc관련 설정을 추가해준다.

3.서버를 재부팅한다.

서버가 잘 올라왔다.

 

이렇게되면 JPA와 JDBC를 통한 MariaDB연동이 끝났다. 지금부터는 Entity클래스를 만들어 새로운 테이블을 만들어보자

 

1.Entity클래스 생성

package com.project.domain.user;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId; //사용자 아이디

    @Column(nullable = false)
    private String loginId; //로그인아이디

    @Column(nullable = false)
    private String password; //비밀번호

    @Column(nullable = false)
    private String email;

    private String phone;

    @Column(nullable = false)
    private String address;

    @Column(nullable = false)
    private String sex;
}

설명

  • @Entity
    • DB 테이블과 연결될 클래스임을 나타낸다.
    • 카멜케이스로 테이블 이름을 매핑한다. ex)TotalDataBasic -> totalDataBasic
    • @NoArgsConstructor(access = AccessLevel.PROTECTED)를 설정함으로 아무런 값도 갖니않는 의미없는 객체의 생성을 막는다.
    • @AllArgsConstructor는 사용하지 않는다. 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성하는데, 인스턴스 멤버의 선언순서에 영향을 받기 때문에 변수의 순서를 바꾸면 생성자의 입력 값 순서도 바뀌게 되어 검출되지않는 치명적인 오류를 발생시킬 수 있다. -> 생성자에 @Builder를 사용함으로 방지한다.
  • @GeneratedValue
    • PK 생성규칙을 나타낸다.
    • 기본키 생성을 데이터베이스에 위임하는 방식으로, id값을 따로 할당하지 않아도 DB가 auto_increment해준다.
  • @Id
    • 해당 테이블의 PK임을 나타낸다.
  • @Column
    • 테이블의 컬럼임을 나타낸다.
    • 굳이 선언하지 않아도 기본값이지만 column정보를 변경하기 위해 사용한다 ex)length, nullable
    • name = 필드와 매핑할 테이블의 컬럼 이름 지정
    • insertable = true / 엔티티 저장시 필드값 저장, false / 필드값이 저장되지 않음
    • updatable = true / 엔티티 수정시 필드값 수정, false / 필드값이 수정되지 않음
    • table = 하나의 엔티티를 두개 이상의 테이블에 매필할 때 사용
    • nullable = false / not null
    • unique = 컬럼에 unique제약조건 부여
    • columneDefinition = 컬럼정보를 직접 부여 ex ) columnDefinition = "VARCHAR(15) NOT NULL"
    • length = 필드 길이
  • @Enumerated
    • 자바 Enum타입을 매핑할때 사용
    • value = EnumType.ORDINAL : enum순서를 DB에 저장
    • value = EnumType.STRING : enum텍스를 DB에 저장
  • @Temporal
    • value = TemporalType.DATE 날짜, DB date타입과 매핑 ex) 2023-04-20
    • value = TemporalType.TIME 시간, DB time타입과 매핑 ex) 19:41:35
    • value = TemporalType.TIMESTAMP 시간, DB timestamp타입과 매핑 ex) 2023-04-20 19:41:35
  • @Lob
    • CLOB, BLOB데이터를 매핑하기위해 사용한다
  • @Transient
    • DB에 저장하지도 조회하지도 않는 컬럼. 객체에 임시로 값을 보관하고 싶을 때 사용한다.

 

2.서버를 재기동하여 user테이블이 만들어졌는지 확인한다.

 

성공!

 

기본적인 Entity 및 테이블 생성은 끝났다. 간단한 CRUD 테스트를 위해 내일은 JpaRepository<T, Id>인터페이스를 상속받은 UserRepository를 만들어 봐야겠다..