[JPA] Spirng Data JPA 첫걸음

김탁형·2024년 6월 25일
  1. 개념
  • JPA는 ORM을 형상화 하기 위한 인터페이스 이고 Java에서 사용하도록 JPA를 구현한 구현체가 Hiobernate 이다.
  • ORM(Object Riew Model) : 테이블을 SQL문으로 직접적으로 작성하는게 아니라 오브젝트를 매핑하여 사용할 수 있도록
    객체지향적으로 도와주는 개념.
  • 엔티티를 정의하고 필드들을 토대로 조건을 조회할 수 있도록 컬럼 매핑을 기준으로 작동한다
  • 알아두면 좋은 것 : 영속성 컨텍스트, 1차캐쉬, 2차캐쉬
  • 테이블에 옵션들을 적용해서 구축하고 어플리케이션을 기동하면 테이블이날라갈수있음
  • 테이블이랑 옵션 = 엔티티랑 옵션 을 권장한다
  • //@Colunm 필수는 아니지만 생성할때 create테이블 할 때 옵션이다!

1. 프로젝트 만들기
파일 > 새프로젝트 > 기본적인거 작성후 다음 > 의존성주입 시작 > Developer Tools > Lombok 체크 > Web > Spring Web 체크 > SQL > Spring Data JPA 체크 > 하고싶은 DB선택 나는 MYSQL Driver 체크

2. DB 연동하기
application.yml 생성해서 사용, 단, application.properties 삭제 해야함

<application.yml>

#MySQL 설정
spring:
  application:
    name: hhplus-CleanArchitucture-java
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/[DB명]
    username: root
    password: [비밀번호]
  jpa:
    properties:
      hibernate:
        format_sql: true #true : JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL 가독성 증가.

    show-sql: true
    hibernate:
      ddl-auto: create #어플리케이션 기동 시 entity 에서 정의한것이 update 혹은 create 가 된다.

application.yml의 JPA 설정 값
(1) ddl-auto (Data Definition Language Auto)
: 이 옵션은 데이터베이스 스키마의 생성 및 변경을 자동화하는 데 사용됩니다.
주요 옵션 값:

  • create: 애플리케이션 시작 시 기존 스키마를 삭제하고 새로운 스키마를 생성합니다.
  • create-drop: 애플리케이션 시작 시 기존 스키마를 삭제하고 애플리케이션 종료 시에도 스키마를 삭제합니다.
  • update: 애플리케이션 시작 시 기존 스키마를 보존하면서 엔티티 클래스 변경 사항을 반영하여 스키마를 업데이트합니다.
  • validate: 애플리케이션 시작 시 기존 스키마를 검증하여 엔티티 클래스와 일치하지 않는 경우 경고 또는 예외를 발생시킵니다.
  • none: 자동 생성 및 변경을 비활성화하고, 기존 스키마를 유지합니다.

(2) show-sql
: 이 옵션은 JPA가 생성한 SQL 쿼리를 콘솔에 출력할 지 여부를 설정합니다.
true로 설정하면 JPA가 실행하는 SQL 쿼리가 콘솔에 출력되며, false로 설정하면 출력되지 않습니다.

(3) format_sql
이 옵션은 JPA가 생성한 SQL 쿼리를 가독성 있게 포맷할 지 여부를 설정합니다.
true로 설정하면 JPA가 SQL 쿼리를 보기 좋게 정렬 및 들여쓰기합니다.
false로 설정하면 SQL 쿼리가 원래의 형식을 유지합니다.

  1. UserEntity 만들기
    entity 패키지에 생성
//UserEntity.java
@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  @Column(unique = true, nullable = false)
  private String userName;
  @Column(nullable = false)
  private String password;

  public User() {
  }

  public User(String userName, String password) {
     this.userName = userName;
     this.password = password;
  }

  public Long getId() {
     return id;
  }

  public String getUserName() {
     return userName;
  }

  public String getPassword() {
     return password;
  }
}

기본키를 Long 타입으로 사용하는 이유

  • null을 사용할 수 있다.
    원시 타입(long)은 기본값이 0으로, 실제 값과 초기값이 없을 때와 판별하기 어렵다. Wrapper 클래스는 값이 없을 경우 null로 초기화되기 때문에 실제 값이 없는지 알 수 있다.
  • int 보다 범위가 크다.
  1. JPA 주요 어노테이션
  • @Entity : JPA 엔티티 클래스를 표시하는 데 사용됩니다.
    데이터베이스의 테이블과 매핑되는 객체를 정의할 때 사용됩니다.

  • @Table
    엔티티 클래스가 매핑될 데이터베이스 테이블의 이름을 지정하는 데 사용됩니다.
    기본적으로 엔티티 클래스의 이름과 동일한 테이블 이름을 가지지만, 다른 테이블 이름으로 매핑하고자 할 때 사용할 수 있습니다.

  • @Id
    엔티티 클래스의 기본 키를 나타내는 필드를 표시하는 데 사용됩니다.
    데이터베이스의 기본 키와 매핑되며, 유일한 식별자 역할을 수행합니다.

  • @GeneratedValue
    엔티티 클래스의 기본 키 값을 자동으로 생성하는 데 사용됩니다.
    GenerationType.IDENTITY: 기본 키 값은 데이터베이스의 식별자 열을 사용하여 생성됩니다.
    GenerationType.AUTO: 영속성 제공자가 데이터베이스와 구성에 기반하여 적절한 생성 전략을 선택합니다.
    GenerationType.SEQUENCE: 기본 키 값은 데이터베이스 시퀀스를 사용하여 생성됩니다.
    GenerationType.TABLE: 기본 키 값은 별도의 테이블을 사용하여 다음 사용 가능한 ID를 추적합니다.

  • @Column
    엔티티 클래스의 속성이 데이터베이스 테이블의 열과 매핑되는 방법을 정의하는 데 사용됩니다.
    name: 데이터베이스 컬럼의 이름을 지정합니다. 기본적으로 필드 이름에서 컬럼 이름이 유도됩니다.
    nullable: 컬럼이 null 값을 허용하는지 여부를 지정합니다. -> @NotNull을 지원안함

    @Column(name = "email", nullable = false)
    private String email;

length: 문자열 기반 필드의 컬럼 길이를 지정합니다.
precision과 scale: 숫자 필드의 정밀도와 스케일을 지정합니다.
unique: 컬럼 값이 고유해야 하는지 여부를 지정합니다.
columnDefinition: 컬럼 정의에 대한 사용자 정의 SQL 조각을 지정할 수 있습니다.

  • @OneToMany / @ManyToOne
    @OneToMany와 @ManyToOne 어노테이션은 엔티티 클래스 간의 일대다 관계를 표시하는 데 사용됩니다.
    @OneToMany 어노테이션은 한 엔티티가 여러 개의 다른 엔티티와 관계를 가지는 경우 사용되며, @ManyToOne 어노테이션은 다른 엔티티에 대한 매핑을 정의할 때 사용됩니다.
  1. Lombok 적용하기
    User entity에서 get 메소드, 생성자들을 삭제하고, Lombok 어노테이션을 적용합니다.
    @Builder 어노테이션을 사용하기 위해서는 전체 필드를 포함하는 생성자가 필요하므로, @AllArgsConstructor도 추가해줍니다.
@Entity
@NoArgsConstructor
@Getter
@Builder
@AllArgsConstructor
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  @Column(unique = true, nullable = false)
  private String userName;
  @Column(nullable = false)
  private String password;

}

Lombok 주요 어노테이션

  • @Getter:
    클래스의 필드에 대한 Getter 메서드를 자동으로 생성해줍니다.
    해당 필드에 대한 public Getter 메서드를 자동으로 생성하여 필드 값을 조회할 수 있게 합니다.
    @Getter 어노테이션은 클래스 레벨이나 필드 레벨에 적용할 수 있습니다.

  • @NoArgsConstructor:
    매개변수가 없는 기본 생성자를 자동으로 생성해줍니다.
    기본 생성자를 자동으로 생성하므로 객체를 인스턴스화할 때 매개변수 없이 생성자를 호출할 수 있습니다.
    @NoArgsConstructor 어노테이션은 클래스 레벨에 적용할 수 있습니다.

  • @AllArgsConstructor:
    모든 필드를 매개변수로 받는 생성자를 자동으로 생성해줍니다.
    클래스의 모든 필드를 포함한 생성자를 자동으로 생성하므로, 인스턴스를 생성하고 모든 필드 값을 한 번에 설정할 수 있습니다.
    @AllArgsConstructor 어노테이션은 클래스 레벨에 적용할 수 있습니다.

  • @ToString:
    toString() 메서드를 자동으로 생성해줍니다.
    toString() 메서드는 객체의 문자열 표현을 반환하는데 사용되며, 해당 어노테이션을 사용하면 필드 값들을 포함한 문자열 표현을 간단하게 생성할 수 있습니다.
    @ToString 어노테이션은 클래스 레벨에 적용할 수 있습니다.

Builder pattern, @Builder
Builder 패턴은 객체 생성을 유연하게 하기 위한 디자인 패턴 중 하나입니다. 일반적으로 많은 매개변수를 가진 객체를 생성할 때, 가독성을 높이고 코드 작성을 간편하게 하기 위해 사용됩니다.

Builder 패턴은 다음과 같은 특징을 가지고 있습니다:

  • 매개변수를 가진 생성자 대신 메서드 체이닝 형태로 객체를 생성합니다.
  • 각 매개변수는 Setter 메서드 체인을 통해 설정됩니다.
  • 객체 생성 시점에 필요한 필드만 설정할 수 있으며, 선택적인 필드를 포함할 수 있습니다.
  • 가독성을 높이고 매개변수의 순서를 기억할 필요가 없으므로 실수를 줄일 수 있습니다.
  • 불변성(Immutability)을 유지할 수 있습니다.

@Builder 어노테이션은 Lombok에서 제공하는 어노테이션 중 하나로, Builder 패턴을 자동으로 생성해주는 기능을 제공합니다. @Builder 어노테이션을 클래스에 적용하면 해당 클래스에 대한 Builder 클래스가 자동으로 생성되고, 필드 값의 설정을 간편하게 할 수 있습니다.

profile
김탁형/성남/31

0개의 댓글