본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/Spring data JPA

SPRING DATA JPA 공부 2- JPA 메서드 살펴보기

반응형

JPA의 기본적인 메서드들을 살펴보자

 

먼저 테스트하기 위해 entity객체를 하나 만들었다 

 

User

 

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
//위에 까지는 롬복의 어노테이션이다
//@Entity 는 해당 객체가 JPA에서 관리할 엔티티 타입임을 알려준다.
@Entity
public class User {

    @Id @GeneratedValue
    private Long id;
    @NonNull
    private String name;
    @NonNull
    private String email;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

}

@Id 는 해당 값이 primary key 임을 정의하는 어노테이션이다. Entity 객체는 Id 값을 꼭 갖고 있어야 함으로

 

@Id가 안 붙어 있으면 오류가 난다 . 

 

@GeneratedValue는 특정 값을 자동으로 올려준다 

여러가지 전략을 지정할 수 있는데 기본은 @GeneratedValue(strategy = GenerationType.SEQUENCE) 이고

시퀀스를 만들어 값을 하나씩 올려준다.

 

JPA는 어플리케이션과 DB 사이에서 작동한다 그렇기 때문에 JPA를 사용하기위해선 

실질적으로 DB에 접근하여 값을 가져오는 Repositry객체가 JpaRepository<User,Long> 인터페이스를 상속받아야한다 .

<>안에는 첫번째 값으로 엔티티에 타입 , 두번째로는 엔티티에서 지정한 @id가 붙은 primary key의 타입을 넘겨줘야한다. 

 

(나는 User 엔티티 클래스를 사용할 것이기 때문에 User를 넣어놨다.)

 

UserRepository

 

package com.ugo.jpatest.repository;

import com.ugo.jpatest.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User,Long>{
}

 

테스트를 통해 JpaRepository에 어떤 메소드들이 있는지 알아보자

 

@SpringBootTest
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @BeforeEach
    public void insertUser(){
        for(int i = 1 ; i <=5 ; i++){
            User user = new User((long) i,"ugo"+i,"ugo"+i+".com", LocalDateTime.now(),LocalDateTime.now());
            userRepository.save(user);
        }
    }

    @Test
    @Transactional
    void crud(){

        //findAllById에 List 타입으로 아이디를 넣어주면 해당 아이디 값을 갖는 값을 가져온다
//       List<Long> longs = Arrays.asList(1L, 2L, 3L);
//       List<User> users = userRepository.findAllById(longs);
//
//        User user1 = new User("ugo","ugo.com");
//        User user2 = new User("ugogo","ugogo.com");
//
//
//        //여러개를 save 할때 사용
//        userRepository.saveAll(Arrays.asList(user1,user2));


//        List<User> users = userRepository.findAll();
//        users.forEach(System.out::println);


        //getOne 과 findById 차이
        //getOne 은 기본적으로 razy fetch(proxy)로 구현되어 있다 .
        //User user = userRepository.getOne(1L);


        //findById는 리턴값이 Optional로 랩핑되어 있다
        //findById는 eagar 패치가 기본이기 때문에 값을 바로가져온다
        Optional<User> byId = userRepository.findById(10L);
        
        //Optioanl으로 값이 없을 경우에 대해 처리할 수 있다
        //찾는 값이 없을 경우 null을 리턴 시킨다
        User user = byId.orElse(null);
        System.out.println(user);
    }
}

 

한 테스트에서 여러개 메서드를 사용하려다 보니 주석 처리한 것이 많다 . 

 

일단 @BeforeEach로 샘플 데이터를 넣어놨다 

 

반응형