본문 바로가기
Develop/Back-End

[Spring Boot] 단위 테스트 코드를 작성해보자 (2)

by 초코칩프라푸치노 2022. 1. 3.

2021.08.06 - [Develop/Back-End] - [Spring Boot] 단위 테스트 코드를 작성해보자 (1)

 

[Spring Boot] 단위 테스트 코드를 작성해보자 (1)

⊙ TDD? 단위 테스트 코드? TDD란? Test-driven development의 약자로 테스트가 주도하는 소프트웨어 개발 프로세스를 의미한다. 기존에 디자인 - 코드 작성 - 테스트의 순서에서 벗어나 디자인 단계를 미

chocochip101.tistory.com

 

⊙테스트 코드를 통한 CRUD 연습

 

JPA Repository를 활용하여 테이블에 SQL 없이 CRUD를 테스트해보겠습니다.

  • insert 작업: save(엔티티 객체)
  • select 작업: findById(키 타입)
  • update 작업: save(엔티티 객체)
  • delete 작업: deleteById(키 타입), delete(엔티티 객체)

JPA는 위와 같은 메서드를 활용하는데, 특이하게도 insert와 update 작업에 같은 메서드가 사용됩니다. 이는 JPA의 구현체가 메모리상에서 객체를 비교하여 존재하지 않다면 insert, 존재한다면 update를 진행합니다.

 

⊙ 등록 작업

    @Test
    public void testInsertDummies(){
        IntStream.rangeClosed(1, 100).forEach(
                i -> {
                    Memo memo = Memo.builder().memoText("Sample..." + i).build();
                    memoRepository.save(memo);
                }
        );
    }

자바 8 이후에 추가된 Stream과 lambda 식을 이용하여 save 메서드를 활용하여 등록 작업을 진행합니다. 

DDL
결과

다음과 같이 DDL이 생성되고 DB에 추가된것을 알 수 있습니다.

 

⊙ 조회 작업

    @Test
    public void testSelect(){
        Long mno = 100L;

        Optional<Memo> result = memoRepository.findById(mno);

        System.out.println("===============================");

        if(result.isPresent()){
            Memo memo = result.get();
            System.out.println(memo);
        }
    }

findById 메서드를 통해 조회 작업을 진행합니다. findById 메서드는 반환 타입이 Optional이기 때문에 한번 더 결과가 존재하는지 체크하는 형태로 작성됩니다.

DDL

무난하게 select문이 실행된것을 볼 수 있습니다.

 

⊙ 수정 작업

    @Test
    public void testUpdate(){
        Memo memo = Memo.builder().mno(101L).memoText("Update Text").build();
        System.out.println(memoRepository.save(memo));
    }

DDL
수정된 데이터

testUpdate()에서 101번의 Memo 객체를 만들고, save()를 호출합니다. 내부적으로 select 쿼리로 해당 번호의 Memo 객체를 확인하고, 이를 update 합니다.

즉, JPA는 엔티티 객체들은 메모리상에 보관하려고 하기 때문에 특정한 엔티티 객체가 존재하는지 확인하는 select가 먼저 실행되고 해당 @Id를 가진 엔티티 객체가 있다면 update, 그렇지 않으면 insert를 실행하게 됩니다.

 

⊙ 삭제 작업

    @Test
    public void testDelete(){
        Long mno = 101L;
        memoRepository.deleteById(mno);
    }

DDL
101번 삭제

삭제하려는 번호(mno)의 엔티티 객체가 있는지 확인하고, 데이터가 존재하지 않으면 org.springframework.dao.EmptyResultDataAccessException 예외를 발생합니다.

반응형

댓글