02-07 11:18
Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
관리 메뉴

기록을 합시다.

[Spring] Hibernate를 사용하여 사용자 모델 및 레포지토리 만들기 본문

공부/Java

[Spring] Hibernate를 사용하여 사용자 모델 및 레포지토리 만들기

울집고양이세마리 2023. 5. 16. 16:19

JPA(Java Persistence API)

 

JPA - Introduction

JPA Introduction - Any enterprise application performs database operations by storing and retrieving vast amounts of data. Despite all the available technologies for storage management, application developers normally struggle to perform database operation

www.tutorialspoint.com

  • Java Persistence API는 방대한 양의 데이터를 데이터베이스에 지속적으로 저장하기 위한 클래스와 메서드의 모음이다.
  • JPA를 사용하면 개발자가 작성할 코드들이 적어지며, 데이터베이스와 상호 작용하는 부담이 줄어든다. 즉, JPA는 객체 모델(Java 프로그램)과 관계형 모델(데이터베이스 프로그램) 사이를 이어주는 역할을 해준다. 

Hibernate 특징

 

What is Object/Relational Mapping? - Hibernate ORM

Idiomatic persistence for Java and relational databases.

hibernate.org

  • 객체/관계 매핑(Object/Relational Mapping) 
    Hibernate ORM은 객체 관계 매핑(ORM) 프레임워크로써,  애플리케이션 프로세스보다 오래 데이터를 유지하도록 도와준다. Hibernate ORM은 관계형 데이터베이스(RDBMS)에 대한 데이터 지속성을 고려하여 만들어졌으며, JDBC를 통해 작동한다.
  • JPA 제공자(JPA Provider)
    Hibernate는 Java Persistence API(JPA) 구현체이기 때문에 JPA를 지원하는 Java SE 애플리케이션, Java EE 애플리케이션 서버, Enterprise OSGi 컨테이너 등 모든 환경에서 쉽게 사용할 수 있다.
  • 넓은 수용 범위의 지속성
    Hibernate는 Java 컬렉션 프레임워크를 포함한 자연스러운 객체지향 언어로 지속적인 클래스를 개발할 수 있도록 지원해준다. Hibernate는 지속적인 클래스에 대한 인터페이스나 기본 클래스가 필요하지 않으며, 모든 클래스나 데이터 구조를 지속적으로 사용 가능하다.
  • 높은 성능
    Hibernate는 느린 초기화(lazy initialization), 다양한 가져오기(fetching) 전략 및 자동 버전 관리와 타임 스탬프 기능을 지원한다. Hibernate은 특별한 데이터베이스 테이블이나 필드를 필요로 하지 않으며, 대부분의 SQL을 런타임이 아닌 시스템 초기화 시간에 생성한다. Hibernate는 개발자 생산성 및 런타임 성능 측면에서 일반적인 JDBC 코드보다 우수한 성능을 제공해준다. (얘네 사이트에 적힌 말이라서 이런 말을 하는 듯..)

위의 내용을 두 줄 요약하자면..

  1. JPA는 관계형 모델과 프로그램의 객체 모델을 연결해주는 클래스와 메서드들의 모음이다.
  2. 그 JPA를 구현한 게 Hibernate다.

유저 모델 만들기

package com.example.expense.user;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@Entity(name="user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String username;

    @Column
    private String picture;

    @Enumerated(EnumType.STRING)
    @Column(nullable = true)
    private Role role;

    @Builder
    public User(String email, String username, String picture, Role role){
        this.email = email;
        this.username = username;
        this.picture = picture;
        this.role = role;
    }

    public User update(String username, String picture){
        this.username = username;
        this.picture = picture;

        return this;
    }

    public String getEmail(){
        return this.email;
    }

    public Long getId(){
        return this.id;
    }

    public String getRoleKey(){
        return this.role.getKey();
    }
}

@Entity 

  • 객체와 데이터베이스의 테이블을 매핑하는 역할
  • 어노테이션이 사용된 클래스는 데이터베이스의 테이블과 매핑되는 객체(Entity)임을 나타내게 된다.
  • 위와 같이 user 테이블과 매핑되는 User클래스가 있다면, @Entity 어노테이션으로 선언하여, 객체와 데이터베이스 테이블을 연결할 수 있게 해준다. 

@Id

  • JPA에서 Entity 클래스의 Primary Key를 매핑할 때 사용
  • Entity 클래스의 필드 중에서 Primary Key에 해당하는 칼럼(필드)에 붙여준다. 

@GeneratedValue

  • @GeneratedValue는 JPA의 엔티티에서 Primary key 값을 자동으로 생성되도록 해준다. 그렇기 때문에  해당 필드가 반드시 Primary key여야 하며, 주로 @Id 어노테이션과 함께 사용된다.

@GeneratedValue의 타입은 아래와 같다. 

  • GenerationType.AUTO: 데이터베이스에 따라 자동으로 ID 생성 전략을 선택해준다.
    GenerationType.IDENTITY: 데이터베이스에 자동으로 ID를 할당해준다.
    GenerationType.SEQUENCE: 데이터베이스의 시퀀스를 사용하여 ID를 할당해준다.
    -GenerationType.TABLE: 키 생성 전용 테이블을 사용하여 ID를 할당해준다.

@Column

  • 필드를 컬럼으로 지정하며, `nullable` 속성을 이용해 null 값 허용 여부를 결정할 수 있다.

@Enumerated

  • ENUM 타입의 필드를 지정할 때 사용한다.
  • EnumType.STRING, ENUMTYPE.INTEGER 등으로, ENUM의 TYPE을 지정해준다.

@Builder

  • 빌더 패턴을 사용하기 위해 Lombok의 `@Builder` 어노테이션을 사용한다.

Role.java(Enum 필드 값으로 지정한 enum 클래스)

package com.example.expense.user;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum Role {
    USER("ROLE_USER", "사용자"),
    MANAGER("ROLE_MANAGER", "관리자");

    private final String key;
    private final String title;
}

 

유저 레포지토리 만들기

package com.example.expense.user;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}
  • Spring Data JPA의 `JpaRepository` 인터페이스를 확장한 `UserRepository` 인터페이스를 작성한 코드이다
  • JpaRepository는 Spring Data JPA에서 제공하는 인터페이스 중 하나로, 기본적인 CRUD(create, read, update, delete) 메소드를 제공해주는 인터페이스다. 이렇게 기본적인 CRUD 메소드를 제공해주는 것은 개발자들이 반복적인 코드 작업을 줄일 수 있고, 일관된 방식으로 데이터를 다룰 수 있도록 도와준다.

JpaRepository는 다음과 같은 메소드를 제공해준다. 

  • `findAll()`: 모든 엔티티를 조회한다.
  • `findAllById(Iterable ids)`: 지정한 ID를 가진 엔티티를 모두 조회한다.
  • `findById(ID id)`: 지정한 ID를 가진 엔티티를 조회한다.
  • `save(S entity)`: 엔티티를 저장하거나 업데이트한다.
  • `deleteById(ID id)`: 지정한 ID를 가진 엔티티를 삭제한다.

참고로 JpaRepository는 제네릭 타입을 작성해줘도 되고, 안 작성해줘도 된다. 그러나 키로 엔티티, 값으로 식별자를 명시해주면 컴파일 시에 타입 검사를 해주어 편리해진다. 

 

..컨트롤러는 다음에 

Comments