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
'Spring' 카테고리의 다른 글
Spring Scheduler 정리 (Spring Scheduler, Quartz) (0) | 2023.02.13 |
---|---|
Spring batch + 스케쥴러 사용 예제 (0) | 2022.12.06 |
스프링 부트 - MyBatis 연동 (0) | 2022.12.04 |
스프링 부트 - Validator 검증 (0) | 2022.10.26 |
스프링 부트 - 의존 주입 (0) | 2022.10.25 |