[spring boot] mariaDB, JPA 적용

1. spring web layer

  • controller ::: Business layer, 비지니스 로직
  • DTO ::: Persistence layer, 데이터 저장소 로직
  • entity ::: Database
  • repository ::: Database
  • service ::: Business Layer

2. 디렉토리

3. JPA 의존 라이브러리

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

4. properties 설정

spring.datasource.url=jdbc:mariadb://localhost:3306/shopping
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

5. DB에 DDL 사용하여 테이블 생성

create ...

6. 스프링 부트에 적용하기

(1) Entity 클래스 작성

테이블의 칼럼을 Entity로 작성해준다.

@Entity ::: 이 어노테이션을 사용하여 테이블과 맵핑된 클래스임을 알릴 수 있다.

@Table(name="") ::: 이미 생성해 둔 테이블 명을 지정한다.

@Id ::: 해당 테이블의 PK 필드를 알려준다. 엔티티 인스턴스를 유일하게 식별할 수 있도록 한다.

@Column ::: 테이블의 칼럼임을 알려준다. (사용하지 않아도, @Entity 내부의 클래스는 모두 컬럼이 된다.

 

엔티티 클래스는 반드시 기본 생성자를 가져야한다. @NoArgsConstructor : 파라미터가 아예없는 기본생성자를 자동으로 만들어준다.

엔티티 인스턴스(객체)는 테이블의 로우 한 개에 해당한다.

 

https://docs.oracle.com/javaee/7/api/javax/persistence/Entity.html?utm_source=chatgpt.com

https://docs.spring.io/spring-data/jpa/reference/jpa.html

 

this를 사용하여 update하는 쿼리문을 직접 작성...?

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(length = 15, nullable = false)

 

테이블 생성 후 맵핑? vs @Entity로 테이블 직접 생성?

더보기

테이블 생성 후 맵핑? vs @Entity로 테이블 직접 생성?


1. DB에 테이블을 미리 생성해두고 매핑하는 경우

  • 동작 방식:
    • 데이터베이스에 테이블이 이미 존재한다고 가정하고, @Entity를 통해 클래스와 테이블을 매핑한다.
    • 이 경우, JPA는 매핑된 테이블을 기반으로 데이터 조작(SQL 쿼리)을 수행한다.
    • 테이블 생성은 개발자(또는 DBA)가 직접 수행한다.
  • 설정 예시:
    • ddl-auto=none: JPA가 테이블을 생성하거나 수정하지 않음. 테이블이 존재해야만 동작.
    • spring.jpa.hibernate.ddl-auto=none
  • 사용 예:
    • JPA는 여기서 user_table이라는 기존 테이블과 연결되어 데이터 작업을 수행한다.

      @Entity @Table(name = "user_table") // 기존 테이블 이름 지정
      public class User {
           @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;

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

            private String email;
      }

2. JPA가 테이블을 생성하게 하는 경우

  • 동작 방식:
    • @Entity를 선언한 클래스와 필드 정보를 바탕으로 JPA가 데이터베이스 테이블을 자동으로 생성하거나 변경한다.
    • 개발자가 직접 테이블을 생성하지 않아도 된다.
  • 설정 예시:
    • ddl-auto 설정 값:
      • create: 애플리케이션 실행 시 기존 테이블 삭제 후 새로 생성.
      • create-drop: 실행 시 테이블 생성, 애플리케이션 종료 시 삭제.
      • update: 기존 테이블을 유지하면서 필요한 경우 필드 추가 등 업데이트 수행.
      • none: 테이블 생성/수정 안 함.
  • spring.jpa.hibernate.ddl-auto=update
  • 사용 예:
    • 이 경우, JPA가 Product 엔티티를 기반으로 product라는 테이블을 생성한다.
      @Entity
      public class Product {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;

          private String name;

          private Double price;
      }


결론

  • 미리 생성된 테이블을 사용하는 경우:
    • spring.jpa.hibernate.ddl-auto=none 설정.
    • 기존 데이터베이스 설계를 유지하며 매핑만 수행.
  • JPA가 테이블을 생성하도록 하는 경우:
    • spring.jpa.hibernate.ddl-auto=create 또는 update 설정.
    • JPA가 테이블을 생성하고, 애플리케이션의 엔티티 설계를 기반으로 데이터베이스를 관리.

권장 사항

  • 운영 환경: 일반적으로 DB 테이블은 미리 설계하고 생성한 후 매핑만 수행하는 것을 추천한다. (ddl-auto=none)
  • 개발 환경: 초기 개발 단계에서는 JPA의 자동 테이블 생성 기능을 활용할 수 있다. (ddl-auto=create 또는 update)

(2) Repository 인터페이스 작성

이 클래스는 Entity 클래스를 사용해서 DB에 접근한 뒤 작성해 둔 메서드를 실행한다.

Entity를 선언하여 데이터베이스의 구조를 만들었다면, Repository는 CRUD를 어떻게 할 것인지 정의해주는 계층이다.

보통은 DAO라고 불리는 DB 접근자인데, JPA에서는 dao가 아닌 repository라고 부르고 인터페이스로 생성하여 사용한다.

@Repository 어노테이션을 사용한다.

JpaRepository를 상속 받는다. 이 때 제너릭으로 <Entity클래스명, PK타입>을 설정한다. 상속받음으로써, 기본적으로 제공되는 메서드(save(), findAll(), get()) 등을 사용할 수 있게 된다.

이 인터페이스를 컨트롤러에서 구현하여 사용하게 된다.

(3) DTO 작성

lombok을 사용하여 @Setter @Getter 적용

(4) Controller 클래스 작성

ㄱ. repository 인터페이스를 @Autowired한다. (crud를 사용하기 위함)

ㄴ. Entity 클래스 생성 후 메소드 사용

ㄷ. repository에 entity를 인자로 넣어주고 save 한다.

 


https://nginxstore.com/blog/spring/jpa-spring-boot%EC%97%90%EC%84%9C-mariadb-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-%EC%84%A4%EC%A0%95%EB%B6%80%ED%84%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%80%EC%9E%A5%EA%B9%8C%EC%A7%80/