본문 바로가기
Spring/JPA

JPA 설정 및 테스트코드 예제 1

by step 1 2021. 7. 4.
반응형
@Entity DTO에 JPA설정
@id 기본키 설정
@GeneratedValue 기본키 자동 생성(자동 증가)

사이트 참고

https://ithub.tistory.com/24

 

Spring Data JPA 기본키 매핑하는 방법

오늘은 Spring Data JPA 기본키 매핑하는 방법에 대해서 알아보겠습니다. Spring Data JPA 에서는 엔티티의 기본키를 @Id 어노테이션을 사용하여 설정합니다. @Entity public class Team { @Id @Column(name = "te..

ithub.tistory.com

https://data-make.tistory.com/610

 

[JPA] 엔티티와 매핑. @Entity, @Table, @Id, @Column..

| 엔티티와 매핑 객체와 테이블 매핑 : @Entity, @Table 기본 키 매핑 : @Id 필드와 컬럼 매핑 : @Column 연관관계 매핑 : @ManyToOne, @JoinColumn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23..

data-make.tistory.com

 

JPA 명령어

https://velog.io/@junho918/Spring-Data-Jpa-JPA..%EA%B7%B8%EB%9E%98-%EC%95%8C%EA%B2%A0%EC%96%B4..-%EA%B7%B8%EB%9E%98%EC%84%9C-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%93%B0%EB%8A%94%EB%8D%B0

 

[Spring Data Jpa] JPA..그래 알겠어.. 그래서 스프링 데이터 JPA는 어떻게 쓰는데..

김영한님의 실전 Spring Data Jpa를 수강하고 정리한 문서 입니다. 강추! 최고최고. 인프런 김영한님 실전 스프링 데이터 JPA 링크딴거는 다 모르겠고, 기록할 부분만 기록해야겠다.\-h2 데이터베이스

velog.io

@NoArgsConstructor 매개변수를 갖지 않는 생성자를 생성
@AllArgsConstructor 모든 매개변수를 갖는 생성자를 생성
@RequiredArgsConstructor 필수값으로 설정된 매개변수를 갖는 생성자를 생성
@NonNull 어노테이션으로 구분
@Data 모든 변수의 getter, setter를 설정한다.
@Builder 빌더를 자동으로 생성해주는 어노테이션
@NonNull 필수값으로 설정할 때 사용하는 어노테이션

DTO 생성

package com.example.bookmanager.domain;

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.Date;

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
@Entity
public class User {
    @Id
    @GeneratedValue
//    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt;

    private LocalDateTime updatedAt;

    public User(String name, String email, LocalDateTime creDate, LocalDateTime upDate) {
        this.name = name;
        this.email = email;
        this.createdAt = creDate;
        this.updatedAt = upDate;
    }
}

 

ctrl + shift + t 키를 이용하여 테스트 코드 작성

package com.example.bookmanager.domain;

import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;

import static org.junit.jupiter.api.Assertions.*;

class UserTest {

    @Test
    void test() {
        User user = new User();
        user.setEmail("martin@fastcampus.com");
        user.setName("martin");
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdatedAt(LocalDateTime.now());

        // User user1 = new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now());
        User user1 = new User(null, "martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now());
        User user2 = new User("martin", "martin@fastcampus.com");

        // 빌더 사용 예제
        User user3 = User.builder()
                .name("martin")
                .email("martin@fastcampus.com")
                .build();
        System.out.println(">>> " + user.toString());
        System.out.println(">>> " + user1.toString());
        System.out.println(">>> " + user2.toString());
        System.out.println(">>> " + user3.toString());

    }
}

실행 화면

 

JPA 사용을 위한 Repository 설정

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

// JPA를 사용하기 위해서 반드시 설정해줘야하는 인터페이스(User 테이블과 연결)
// Entity, id 값
public interface UserRepository extends JpaRepository<User, Long> {

}

참고 사이트

https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%99%9C%EC%9A%A9-%ED%85%8C%EC%8A%A4%ED%8A%B8

 

[Spring Boot] 스프링부트 활용 - 테스트

「스프링부트 개념과 활용」 - 3부

velog.io

 

sql문을 직관적으로 확인하기 위해서 application.yml 파일을 수정

참고 사이트

https://lannstark.tistory.com/14

 

Spring Boot SQL 보기 옵션 총 정리

Spring Boot에서 query DSL을 사용하건 spring boot JPA를 사용하건, 쿼리를 튜닝할 때 SQL을 봐야할 때가 있다. 그럴 때 사용할 수 있는 몇 가지 옵션을 조사해 보았다. 환경 : Spring boot 2.* + hibernate 5.3...

lannstark.tistory.com

spring:
  h2:
    console:
      enabled: true
#  sql문을 확인하기 위해서 추가 설정
  jpa:
    show-sql: true
    properties:
      hibernate:
#        깔끔하게 보기 위해서 설정
        format_sql: true
        show_sql: true
#        주석 확인
        use_sql_comments: true

# 로그에 파라미터를 확인하기 위해서 설정
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

server:
  port: 8080

Test 코드 작성

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Sort;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;

// @SpringBootTest: 통합 테스트를 진행하기 위해서 설정
@SpringBootTest
class UserRepositoryTest {

    // UserRepository를 의존성 추가
    @Autowired
    private UserRepository userRepository;

    // test를 진행할 코드
    @Test
    void crud() {  // create, read, update, delete
        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));
        
        // User 테이블의 모든 데이터 리스트를 가지고 온다.
        System.out.println(">>> " + userRepository.findAll());
        

    }

}

save(): 데이터를 JPA를 이용해서 저장하는 기능

findAll(): JPA를 이용하여 저장소안에 모든 데이터를 출력

 

 

추가 사항으로 Test를 진행할때 미리 쿼리를 넣어주고 싶을경우 

test폴더 하위에 resources 폴더를 생성하고 data.sql, schema.sql을 생성하여 JPA가 동작하기 전에 해당 SQL문이 동작하도록 설정할 수 있다.

 

동작순서는 schema.sql이 동작한 후 data.sql이 동작한다.

 

참고 사이트

https://leveloper.tistory.com/38

 

[스프링] 배포용 서버에 데이터베이스 Schema 및 Data 초기 설정하기

스프링 부트로 개발을 할 때 보통 개발단계에서는 h2를 많이 사용한다. 또한 JPA를 사용하면 하이버네이트가 자동으로 테이블을 생성해주기 때문에 개발 단계에서는 DDL을 신경 쓸 필요가 없다.

leveloper.tistory.com

findAll().forEach(System.out::println);: 여러 라인의 생성자 데이터를 반복하여 한 줄씩 출력하도록 도와준다.

    @Test
    void crud() {  // create, read, update, delete

        // 기본 데이터 생성
        userRepository.save(new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("dennis", "dennis@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("sophia", "sophia@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("james", "james@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("martin2", "martin2@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));

        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));

        // User 테이블의 모든 데이터 리스트를 가지고 온다.
        // 한 줄로 출력
//        System.out.println(">>> " + userRepository.findAll());
        // >>> [User(id=1, name=null, email=null, createdAt=null, updateAt=null)]
        // 여러줄로 나뉘어서 줄력
        userRepository.findAll().forEach(System.out::println);

 

내림차순으로 List에 저장하고 출력하는 예제

package com.example.bookmanager.repository;

import com.example.bookmanager.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Sort;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;

// @SpringBootTest: 통합 테스트를 진행하기 위해서 설정
@SpringBootTest
class UserRepositoryTest {

    // UserRepository를 의존성 추가
    @Autowired
    private UserRepository userRepository;

    // test를 진행할 코드
    @Test
    void crud() {  // create, read, update, delete

        // 기본 데이터 생성 jpa를 이용하여 insert 된다.
        userRepository.save(new User("martin", "martin@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("dennis", "dennis@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("sophia", "sophia@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("james", "james@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));
        userRepository.save(new User("martin2", "martin2@fastcampus.com", LocalDateTime.now(), LocalDateTime.now()));

        // 기본 생성자를 생성하고 그것을 저장
        userRepository.save(new User("nooo", "noo@naver.com"));

        // name을 기준으로 내리차순 정렬 하여 List에 저장
        List<User> users = userRepository.findAll(Sort.by(Sort.Direction.DESC, "name"));
        // list에 저장된 내용을 출력
        users.forEach(System.out::println);

    }

}

findAll(Sort.by(Sort.Direction.DESC, "name")): name이라는 컬럼을 기준으로 내림차순 정렬

쿼리 확인

 

본인이 원하는 데이터만 뽑아와서 출력하는 예제 코드

        // 본인이 정한 ID값의 해당하는 값들만 골라서 List에 저장
        List<User> users = userRepository.findAllById(Lists.newArrayList(1L, 2L, 3L));
        // List에 저장된 데이터를 반복하여 출력
        users.forEach(System.out::println);

where 절이 추가된 것을 확인

 

원하는 생성자를 선택하여 JPA를 이용하여 저장하는 쿼리

// 테스트를 진행할 생성자 추가
        User user1 = new User("jack", "jack@naver.com");
        User user2 = new User("steve", "steve@naver.com");
        User user3 = new User("steve2", "steve22@naver.com");
        // 원하는 생성자를 선택하여 JPA를 이용하여 저장
        userRepository.saveAll(Lists.newArrayList(user1, user2));
        // List에 데이터를 저장
        List<User> users = userRepository.findAll();
        // 출력
        users.forEach(System.out::println);

본인이 선택한 생성자 데이터만이 추가된것을 확인 할 수 있다.

 

getOne(1L);: 사용자가 선택한 id값에 해당하는 데이터를 새로운 생성자에 값을 넣어주는 기능

// getOne(1L);: 사용자가 선택한 id값에 해당하는 데이터를 새로운 생성자에 값을 넣어주는 기능
        User user = userRepository.getOne(1L);
        System.out.println(user);

그냥 실행하게 되면 아래와 같은 에러가 발생한다.

따라서 테스트를 진행하는 함수 위에 @Transactional 어노테이션을 추가해 준다.

    // test를 진행할 코드
    @Test
    // 세션 유지를 하기 위한 설정
    @Transactional
    void crud() {  // create, read, update, delete

 

findById(): 세션연결이 없어도 본인이 원하는 ID값에 해당하는 데이터를 찾아서 가져올 수 있다.

테스트를 진행할 때 test부분에 @Transactional 어노테이션을 지워주고 진행한다.

// findById를 이용하여 해당 id에 해당하는 값을 가져오고, 아닐 경우 null을 반환
        User user = userRepository.findById(1L).orElse(null);
        System.out.println(user);

 

반응형