Spring

스프링 부트 - JPA 연동

Clearing 2022. 12. 5. 09:25
728x90

build.gradle에 dependency 추가

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   developmentOnly 'org.springframework.boot:spring-boot-devtools'
   runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'

   implementation 'javax.servlet:jstl'
   implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
}

 

resources 폴더 하위 application.properties에 설정

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

server.port=8088

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

spring.jpa.show-sql

 -> console 창에 jpa의 sql문을 볼지 안 볼지 설정


spring.jpa.hibernate.ddl-auto

  • create: 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
  • create-drop: create와 같으나 종료 시점에 테이블 DROP
  • update: 변경분만 반영(운영 DB에서는 사용하면 안 됨)
  • validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none: 사용하지 않음(사실상 없는 값이지만 관례상 none이라고 한다.)

 

users 테이블과 매핑할 UserEntity

package com.example.jpatest.entity;

import javax.persistence.*;

@Entity(name = "users")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;
    @Column(name="pw")
    private String pw;
    @Column(name="name")
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPw() {
        return pw;
    }

    public void setPw(String pw) {
        this.pw = pw;
    }
    public String getName() {
        return name;
    }

    public void setName(String username) {
        this.name = username;
    }
}

 

UserRepository 인터페이스 

package com.example.jpatest.repository;

import com.example.jpatest.entity.UserEntity;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface UserRepository {
    UserEntity save(UserEntity user);
    void delete(Long id);
    void update(UserEntity user);
    Optional<UserEntity> findById(Long id);
    Optional<UserEntity> findByName(String name);
    List<UserEntity> findAll();
}

JpaRepository<T, Id>를 상속받아 인터페이스를 구성하여 JpaRepository의 메서드를 그대로 사용하는 것도 가능

해당 Repository에서는 필요한 기능만을 커스텀하여 사용하기 위해 JpaRepository를 상속받지 않았다.

 

해당 인터페이스를 상속받는 JpaUserRepository

package com.example.jpatest.repository;

import com.example.jpatest.entity.UserEntity;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.query.FluentQuery;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

@Component("JpaUserRepository")
public class JpaUserRepository implements UserRepository{

    private final EntityManager em;

    public JpaUserRepository(EntityManager em) {
        this.em = em;
    }

    @Override
    public UserEntity save(UserEntity user) {
        em.persist(user);
        return user;
    }

    @Override
    public void delete(Long id) {
        UserEntity user = em.find(UserEntity.class, id);
        em.remove(user);
    }

    @Override
    public void update(UserEntity user) {
        em.createQuery("update users u set u.name= :name where u.id= :id")
                .setParameter("name",user.getName())
                .setParameter("id",user.getId())
                .executeUpdate();
    }

    @Override
    public Optional<UserEntity> findById(Long id) {
        UserEntity user = em.find(UserEntity.class, id);
        return Optional.ofNullable(user);
    }

    @Override
    public Optional<UserEntity> findByName(String name) {
        List<UserEntity> result = em.createQuery("select u from users u where u.name= :name", UserEntity.class)
        .setParameter("name", name)
        .getResultList();

        return result.stream().findAny();
    }

    @Override
    public List<UserEntity> findAll() {
      List<UserEntity> result = em.createQuery("select u from users u", UserEntity.class)
                .getResultList();
        return result;
    }



}

EntitiyManager를 통해 쿼리문을 커스텀하여 사용

728x90