[SB] 9. 스프링부트 상점 v1 TEST

최재원's avatar
Mar 24, 2025
[SB] 9. 스프링부트 상점 v1 TEST

1. test파일 설정

1-1. test폴더 안에 똑같은 폴더 이름을 생성하고 같은 이름에 ‘Test’를 붙여서 만든다

notion image

1-2. repository 쿼리 코드를 테스트

package com.metacoding.storev1.log; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; @Import(LogRepository.class) // LogRepository를 IoC에 등록 @DataJpaTest // em을 IoC 등록 public class LogRepositoryTest { @Autowired // IoC에 있는 것을 DI 한것임 private LogRepository logRepository; @Test // 실행할 수 있는 세모버튼 생성 public void findAllJoinStore_test() { // 매개변수에 아무것도 적을 수 없다. logRepository.findAllJoinStore(); } }
약속
  1. 클래스명은 테스트할 클래스명 뒤에 Test를 붙인다
  1. 메서드명은 테스트할 메서드명 뒤에 _test를 붙인다
준비사항
  • EntityManager → 쿼리를 위한 객체
  • LogRepository → 실제 본체
  1. @DataJpaTest → 이 어노테이션을 넣으면 EntityManager 를 IoC 컨테이너에 등록
  1. @Import(LogRepository.class)LogRepository 를 IoC 컨테이너에 등록
  1. LogRepository 이 본체의 메서드를 실행하고 결과 값을 확인

2. 본래의 LogRepository로 쿼리 메서드 작성

package com.metacoding.storev1.log; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; @Repository public class LogRepository { private EntityManager em; public LogRepository(EntityManager em) { this.em = em; } public void findAllJoinStore() { String q = "SELECT lt.id, st.name, lt.qty, lt.total_price, lt.buyer FROM LOG_TB lt INNER JOIN STORE_TB st ON lt.store_id = st.id"; Query query = em.createNativeQuery(q); List<Object[]> obsList = (List<Object[]>) query.getResultList(); // Object[] = Row for (Object[] obs : obsList) { System.out.println(obs[0] + ","); System.out.println(obs[1] + ","); System.out.println(obs[2] + ","); System.out.println(obs[3] + ","); System.out.println(obs[4]); System.out.println("================================="); } } }

3. 쿼리 테스트 코드 실행

notion image
notion image

4. DTO로 맵핑 테스트 진행

4-1. 쿼리의 컬럼값에 맞는 타입의 오브젝트를 생성

package com.metacoding.storev1.log; import lombok.Data; // DTO : Data Transfer Object -> 화면에 필요한 데이터만 있는 오브젝트 public class LogResponse { @Data // getter, setter, toString public static class ListPage { private int id; private String name; private int qty; private int totalPrice; private String buyer; public ListPage(int id, String name, int qty, int totalPrice, String buyer) { this.id = id; this.name = name; this.qty = qty; this.totalPrice = totalPrice; this.buyer = buyer; } } }

4-2. 생성한 오브젝트에 쿼리 데이터를 맵핑

package com.metacoding.storev1.log; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; @Repository public class LogRepository { private EntityManager em; public LogRepository(EntityManager em) { this.em = em; } public List<LogResponse.ListPage> findAllJoinStore() { List<LogResponse.ListPage> logList = new ArrayList<>(); String q = "SELECT lt.id, st.name, lt.qty, lt.total_price, lt.buyer FROM log_tb lt INNER JOIN store_tb st ON lt.store_id = st.id ORDER BY lt.id DESC"; Query query = em.createNativeQuery(q); List<Object[]> obsList = (List<Object[]>) query.getResultList(); // Object[] -> ROW // ObjectMapping for (Object[] obs : obsList) { LogResponse.ListPage log = new LogResponse.ListPage( (int) obs[0], (String) obs[1], (int) obs[2], (int) obs[3], (String) obs[4]); logList.add(log); } return logList; } }
ArrayList() 를 하나 만들고 타입을 아까 만든 클래스 타입으로 함
쿼리의 결과를 만들어둔 클래스 타입에 맵핑함

4-3. 맵핑 코드 테스트

package com.metacoding.storev1.log; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import com.metacoding.storev1.log.LogResponse.ListPage; @Import(LogRepository.class) // LogRepository를 IoC에 등록 @DataJpaTest // em을 IoC 등록 public class LogRepositoryTest { @Autowired // IoC에 있는 것을 DI 한것임 private LogRepository logRepository; @Test // 실행할 수 있는 세모버튼 생성 public void findAllJoinStore_test() { // 매개변수에 아무것도 적을 수 없다. List<LogResponse.ListPage> logList = logRepository.findAllJoinStore(); for (ListPage listPage : logList) { System.out.println(listPage); } } }
notion image
 
Share article

jjack1