Spring Boot JPA/실습

JPA 실습 : 효율적인 데이터 관리

qoeka 2025. 1. 3. 16:37

 

 

위 5개를  추가 해준다

 

JDBC를 안쓰고 대신 JPA를 쓴다 

 

 

 

디비버 접속해도 되지만 자바에서 클래스로 만들어도되는게jpa 이다

 

데이블에 컬럼추가하면 테이블에 컬럼 생김

 

디비버 들어가지 않고 자바의 클래스로 만드는 작업을 하겠다.

 

우리가 할거는 자바 클래스로 DB에 메모테이블을 만들것이다.

application-dev.yml 와 application-prod.yml 에써준다

 

application-dev.yml

Spring:
  datasource:
    url: jdbc:mysql://localhost:3307/food_db
    username : admin
    password: rlaghdus98
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        jdbc:
          time_zone: UTC

 

 

이제 이걸 넣는 작업을 하겠다.

 

Memo

-id

-content

-created_at

 

(참고 : created_at 세계 시간해야하니깐 Instant 써서 만들어야함)

 

 

 

entity클래스를 만들다 이는 데이터베이스 와 관련된 클래스다

그러니깐 엔터티 패키지에 클래스를 Momo 라 쓴다 그래야 유지 보수가 편하다

 

이건 테이블이니깐 어노테이션을 써야한다

 

자바스프링부트에게 말해주려고 @Entity를 쓰는거다 이 두개는 필수이다

 

@lombok.Data

 

이것도 써주는게 좋다 롬복의 데이타를 가져오기 편하기 위해서 

 

이제 멤버변수를 써주면된다

 

이때 어노테이션해줄때 자카르타 라고쓴걸로 해야한다

@PrePersist
public void prePersist() {
    createdAt = Instant.now();
}
==>디폴트  now() 와 같은거다

 

 

DAO 대신 다른걸 만든다 패키지 이름을  repository 를 써서 만든다 그래서 jpa는 dao가 없다

JDBC : SQL로

JAP : 자바 Class와 메서드로

 

 

그래서 repository는 상속을 받아 쓴다.

 

 

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 기본 제공되는 메서드들
    
    // 저장 & 수정
    Memo save(Memo memo);                        // 엔티티 저장 또는 수정
    List<User> saveAll(List<User> users);        // 여러 엔티티 저장
    
    // 조회
    Optional<memo> findById(Long id);            // ID로 조회
    List<Memo> findAll();                        // 전체 조회
    List<Memo> findAllById(List<Long> ids);      // 여러 ID로 조회
    
    // 삭제
    void delete(Memo memo);                      // 엔티티 삭제
    void deleteById(Long id);                    // ID로 삭제
    void deleteAll();                            // 전체 삭제
    
    // 기타
    long count();                                // 전체 개수 조회
    boolean existsById(Long id);                 // ID 존재 여부 확인
}

 

안보이지만 이렇게 된다

아래 보면 저렇게 다 되있는걸확인할 수 있다.

우리는 이 함수들을 이용해서 이제 sql 문을 대체해서 쓸것이다

 

 

 

이렇게 메소드로 다 만들어져있고 이걸 상속 받기 위한 클래스이다.

 

아래 와 같이 이렇게도 할 수 있는데 이건 나중에 하고 오늘은 간단한 것만 하겠다

@Table

 @Table
@Entity
@Table(
    name = "users",                          // 테이블 이름
    uniqueConstraints = {                    // 유니크 제약조건
        @UniqueConstraint(
            name = "uk_user_email",          // 제약조건 이름
            columnNames = {"email"}          // 제약조건 컬럼
        )
    },
    indexes = {                              // 인덱스
        @Index(
            name = "idx_user_nickname",      // 인덱스 이름
            columnList = "nickname"          // 인덱스 컬럼
        )
    }
)
public class User {
    // ...
}

 

서비스에서
DTO 를  Entity 로 변환 하는 작업을 해줘야한다

 

 

 

이것도 정확히 적어야한다 아니면 에러나니깐(500에러뜸.. 500뜨면 이거 확인해봐야한다) 조심 조심 그러면 이러게 나온다

 

 

 

 

인설트성공(오타는 수정했다)

 

 

와같은 방법이로 이번에는 Data를 만들었다 그리고 나서 이번에는 인설트 이외의 것을 해보겠다

 

 

 

findselet 와 같은거 

bywhere 과 같은 것이다

 

entity 변환꼭해줘야한다 중요하니깐 한번더 강조하고 넘어가겠다

public DataResponse getaDataById(Long id){
   Optional<Data> data = dataRepository.findById(id);
   DataResponse dataResponse = new DataResponse();
   if(data.isPresent()){
       dataResponse.item = data.get();
   }else{
       dataResponse.item = null;
   }return dataResponse;
}

 

 

 

 

이렇게 잘 작동한다

 

 

이제 모든 데이타를 가져오는 걸 하겠다.

 

 

모든걸 다 가져오니깐 파리미터 필요없다