@Entity | DTO에 JPA설정 |
@id | 기본키 설정 |
@GeneratedValue | 기본키 자동 생성(자동 증가) |
사이트 참고
https://data-make.tistory.com/610
JPA 명령어
@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> {
}
참고 사이트
sql문을 직관적으로 확인하기 위해서 application.yml 파일을 수정
참고 사이트
https://lannstark.tistory.com/14
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
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);
'Spring > JPA' 카테고리의 다른 글
QueryMethod 예제 2 (0) | 2021.07.17 |
---|---|
Query Method 구현 1 (0) | 2021.07.17 |
JPA 메소드 예제 3 - update (0) | 2021.07.11 |
JPA TEST 코드 예제 2 (0) | 2021.07.11 |
JPA 개념 및 Test controller 작성, lombok을 이용한 dto 작성, h2를 이용한 데이터베이스 설정 (0) | 2021.07.03 |