ABOUT ME

-

Today
-
Yesterday
-
Total
-

Post Calendar

«   2024/11   »
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
  • Java Study[2022-09-02] - 스프링부트 프로젝트(JPA, Entity 생성, Repository 선언)
    백엔드 2022. 9. 3. 19:26

    📌 Java Study

    🔸 2022-09-02 금요일

    [스프링 부트 프로젝트]

    1. Entity 생성

    • Entity
    • Camel Case : 단어를 표기할 때, 첫 문자는 소문자로 시작하며 띄어쓰기 대신 대문자로 단어를 구분
      • Java의 변수를 선언할 때, Camel Case로 선언
      • ex) phoneNumber, createdAt, updatedAt
    • Snake Case : 단어를 표기할 대, 모두 소문자로 표기하며 띄어쓰기 대신 (_)로 표기
      • DB 컬럼에 사용
      • ex) phone_number, created_at, updated_at
    • API를 정의하기에 따라 다르지만, 주로 API 통신 규격에는 구간에서는 Snake Case를 많이 사용

     

    • Entity : JPA에서는 테이블을 자동으로 생성해주는 기능 존재
    • DB Table == JPA Entity
    Annotation 용도
    Entity 해당 Class가 Entity임을 명시
    Table 실제 DB 테이블의 이름을 명시
    Id Index Primary Key를 명시
    Column 실제 DB Column의 이름을 명시
    GeneratedValue Primary Key 식별키의 전략 설정

     

    • DB => 스네이크 케이스
    • Java => 카멜 케이스

     

    • main - model 하위에 entity 폴더를 생성 후 User 클래스 생성
    • User 클래스는 DB의 테이블 이름과 동일
     package com.example.study.model.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "user")
    public class User {
    
    }
    • @Table(name = "user")는 클래스의 이름과 DB Table의 이름이 동일하다면, @Table을 선언하지 않아도 자동 맵핑

     

    • User 테이블
    • id(BIGINT(20)) - PK 키, NOT NULL, AI
    • account(VARCHAR(45)) - NN
    • email(VARCHAR(45)) => 이메일을 입력하지 않을 수 있으니 NULL 허용
    • phone_number(VARCHAR(45)) => 전화번호를 입력하지 않을 수 있으니 NULL 허용
    • created_at(DATETIME) - NN => DB에 데이터가 쌓이면, 생성일자, 수정일자를 남기는 것이 현업에서 필수
    • created_by(VARCHAR(45)) - NN
    • updated_at(DATETIME)
    • updated_by(VARCHAR(45))

     

    
    @Entity
    public class User {
        private Long id;
    
        private String account;
    
        private String email;
    
        private String phoneNumber;
    
        private LocalDateTime createdAt;
    
        private String createdBy;
    
        private LocalDateTime updatedAt;
    
        private String updatedBy;
    }
    • id는 BIGINT이기 때문에 Long 타입
    • account, email String 타입
    • phoneNumber자바에서는 카멜 케이스로 사용하지만, 실제 데이터베이스에서는 스네이크 케이스
    • 이런 점을 JPA에서 자동으로 매칭해주기 때문에 따로 변수를 선언하지 않아도 됨 (phone_Number 처럼)
    • createdAt, updatedAt은 DateTime이므로 LocalDateTime 타입
    • createdBy, updatedBy는 String 타입

     

    • @column(name = "account")이라는 annotation은 account라는 이름이 DB 컬럼을 의미하는데, 만약 변수명과 동일하다면 기입하지 않아도 됨
    • 식별자에 대해서 @Id 붙이기
    • @generatedValue로 어떤 식으로 관리할 것인지 전략 설정
    • @GeneratedValue(strategy) 전략으로 총 4가지 정도 있는데, MySQL을 사용하기 때문에 GenerationType.IDENTITY 사용
    • @Data 선언하여 기본 생성자와 변수에 대하여 get / set 메서드 생성
    • @AllArgsConstructor 선언하여 모든 매개변수를 갖는 생성자 생성
    • 이 과정까지 기본적으로 Entity 설정하고, Table 연결 완료
    package com.example.study.model.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    import javax.persistence.*;
    import java.time.LocalDateTime;
    
    @Data
    @AllArgsConstructor
    
    @Entity
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        private String account;
    
        private String email;
    
        private String phoneNumber;
    
        private LocalDateTime createdAt;
    
        private String createdBy;
    
        private LocalDateTime updatedAt;
    
        private String updatedBy;
    }
    • DB Table에 맞춰서 클래스를 선언하고, Entity 이름 설정, DB 컬럼에 맞춰 각 변수Camel Case 방식으로 선언
    • 그렇게 되면, JPA Entity는 자동으로 Camel Case를 DB의 Snake Case로 매칭

     

    2. Repository

    • 따로 쿼리문을 작성하지 않아도 기본적인 인터페이스를 통해 CRUD를 사용
      • CREATE : 생성
      • READ : 읽기(SELECT)
      • UPDATE : 업데이트(갱신)
      • DELETE : 삭제

     

    • @Repository를 추가하고, 이미 개발되어 있는 JpaRepository를 상속 받아주면 됨
    • 인터페이스 네이밍할 때, 보통 클래스 Entity명 + Repository = UserRepository
    • public interface UserRepository extends JpaRepository<T, ID>
    • JpaRepository의 T => 어떠한 타입의 object가 들어갈 것인지, ID => PK 기본키에 대해 어떤 타입이 들어갈 것인지
    • public interface UserRepository extends JpaRepository<User, Long>
    • Long은 User라는 Entity에 id 값으로 Long을 했기 때문에 UserRepository에 User 엔티티와 기본키 Id 인덱스 값으로 Long이라고 선언하는 것
    • DB Table의 Entity 생성과 Repository 선언을 통해 기본적인 CRUD를 실행할 수 있음

    댓글

Designed by Tistory.