crud test

전주은·2022년 12월 13일
0

entity

package com.koreait.day4.model.entity;

//lombok 출신
import com.koreait.day4.model.enumclass.UserStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

// DB 새로고침하면 볼 수 있음
// JPA를 사용할때 클래스(camel표기법)와 DB이름(snake표기법)을 맞춰주지 않으면 안됨
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data       //getter,setter
@Builder    //method.method...가능하게 만들어주는
public class AdminUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String userid;
    private String userpw;
    private String name;
    @Enumerated(EnumType.STRING)
    private UserStatus status;
    private LocalDateTime lastLoginAt;
    private LocalDateTime regDate;
}

repository

package com.koreait.day4.repository;

import com.koreait.day4.model.entity.AdminUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AdminUserRepository extends JpaRepository<AdminUser, Long>{

}

단위 테스트

package com.koreait.day4.repository;

import com.koreait.day4.Day4ApplicationTests;
import com.koreait.day4.model.entity.AdminUser;
import com.koreait.day4.model.enumclass.UserStatus;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class AdminUserRepositoryTest extends Day4ApplicationTests {
    @Autowired
    private AdminUserRepository adminUserRepository;

    // 모든 데이터 출력
    @Test
    public void crud1(){
        adminUserRepository.findAll().forEach(System.out::println);
        // System.out:: 객체가 toString되어 나옴
        /* 아래 코드와 같은 내용이라고 보면 됨
        방법1 향상된 for문
        for(AdminUser adminUser : adminUserRepository.findAll()){
            System.out.println(adminUser);
        }
        방법2 리스트에 담아 forEach
        List<AdminUser> adminUsers = adminUserRepository.findAll();//리스트에 담을 수 있다
        adminUsers.forEach(System.out::println);
         */
        // Tip control누른상태로 클릭하면 상위 정의한 부분으로 갈수 있음
        // Tip control+shift 누른 상태로 클릭하면 최상위 정의한 부분으로 갈 수 있는듯..
    }

    // 데이터 정렬하기
    @Test
    public void crud2(){
        List<AdminUser> adminUsers = adminUserRepository
                .findAll(Sort.by(Sort.Direction.DESC, "id"));
        adminUsers.forEach(System.out::println);
    }

    // 데이터 검색하기
    @Test
    public void crud3() {
        // 여러명을 검색할때는 List를 이용한다.
        /*
        List<Long> ids = new ArrayList<>();
        ids.add(2L);
        ids.add(4L);
        List<AdminUser> adminUsers = adminUserRepository.findAllById(ids);
        adminUsers.forEach(System.out::println);

         */
        List<AdminUser> adminUsers= adminUserRepository.findAllById(Lists.newArrayList(2L,4L));
    }

    //여러 데이터 저장
    @Test
    public void crud4() {
        AdminUser adminUser1 = AdminUser.builder().userid("watermelon")
                .userpw("7777").name("수박").build();
        AdminUser adminUser2 = AdminUser.builder().userid("orange")
                .userpw("8888").name("오렌지").build();
        adminUserRepository.saveAll(Lists.newArrayList(adminUser1,adminUser2));
        List<AdminUser> adminusers = adminUserRepository.findAll();
        adminusers.forEach(System.out::println);
    }


    // 단일 데이터 불러오기
    @Test
    @Transactional
    public void crud5() {
        AdminUser adminUser = adminUserRepository.getOne(2L);
        System.out.println(adminUser);
        //error: no session 세션이 없다. getOne은 불러와서 출력하는 과정이 있다. ~~
        // -> 결론: Lazy 방식 일 때는 트랜젝션안에 넣어줘야함 @Transactional
    }

    // 단일 데이터 불러오기2
    @Test
    public void crud6(){
        //Optional<AdminUser> adminUser = adminUserRepository.findById(2L);
        //optional 없이 하는방법!
        AdminUser adminUser = adminUserRepository.findById(2L).orElseThrow();
        //findById는 null이 아니라는것을 가정하기 때문에 orElse()보단 orElseThrow() 추천
        System.out.println(adminUser);
    }

    // 데이터 개수 불러오기
    @Test
    public void crud7(){
        long count = adminUserRepository.count();
        System.out.println(count);
    }


    @Test
    public void crud8(){
        boolean exists = adminUserRepository.existsById(2L);
        System.out.println(exists);
    /* existsById는 내부적으로 개수를 세기 때문에 딱히 추천하지 않음!
    select
        count(*) as col_0_0_
    from
        admin_user adminuser0_
    where
        adminuser0_.id=?
     */
    }

    //데이터 삭제
    @Test
    public void crud9(){
        //데이터 삭제시 select가 일어남
        //adminUserRepository.deleteById(5L);
        //deleteById는 내부적으로 한번 select하고 아이디 찾고나서 delete한다.
        //adminUserRepository.delete(adminUserRepository.findById(5L).orElseThrow(RuntimeException::new));
        //delete-findById는 findById로 한번 select하고 delete로 select하고 아이디 찾고나서 delete한다.(비효율적)
        //orElseThrow(RuntimeException::new) exception이름 안에 넣으면 됨!!

        adminUserRepository.findAll().forEach(System.out::println);
    }

    //여러 데이터 삭제
    @Test
    public void crud10(){
        //deleteAll 데이터 삭제시 select가 각각 일어남
        //adminUserRepository.deleteAll(adminUserRepository.findAllById(Lists.newArrayList(3L,4L)));
        //여긴 select가 findAllById, 6, 7
        
        //deleteInBatch 데이터 삭제시 각각 select가 일어나지 않음! findAllById이거 하나만
        adminUserRepository.deleteInBatch(adminUserRepository.findAllById(Lists.newArrayList(2L,6L)));
        adminUserRepository.findAll().forEach(System.out::println);
    }



    //페이지 생성
    @Test
    public void crud11(){
        // import org.springframework.data.domain.Page; ✔ 꼭 확인 page인터페이스라서 PageRequest클래스로 구현!
        Page<AdminUser> adminUsers = adminUserRepository.findAll(PageRequest.of(2, 3));
        System.out.println("🐇 page"+ adminUsers);
        System.out.println("🐇 totalElements: "+ adminUsers.getTotalElements());//전체 데이터수
        System.out.println("🐇 totalPages: "+adminUsers.getTotalPages());//총 페이지수
        System.out.println("🐇 numberOfElements: "+ adminUsers.getNumberOfElements());//그 페이지 element 개수
        System.out.println("🐇 size: "+ adminUsers.getSize());//내가 몇개씩 쪼갯다.
        System.out.println("🐇 sort: "+adminUsers.getSort());
        adminUsers.getContent().forEach(System.out::println);
    }
    //Enum 적용해서 등록하기
    @Test
    public void create(){
        AdminUser adminUser = AdminUser.builder().userid("grape").userpw("1011")
                .name("표도").status(UserStatus.REGISTERED).build();
        adminUserRepository.save(adminUser);
    }
}

0개의 댓글