Java

[어드민 페이지 만들기] Repository 생성 & JUnit 테스트코드 작성

15호의 개발자 2022. 3. 3. 12:00
반응형

[어드민 페이지 만들기] Repository 생성 & JUnit 테스트코드 작성

 

 


 

Repository 생성하기

지난 번에 ERD 설계 & Table 생성 & Entity 생성을 마쳤다. 이제 이를 바탕으로 Repository를 생성할 차례이다.

 

 

1. category 리파지토리 생성

@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {

}

위와 같이 JpaRepository를 상속받는 CategoryRepository 인터페이스를 만든다.

 

 

2. user 리파지토리 생성

지난 글대로 따라왔다면 UserRepository는 아래와 같이 이미 존재할 것이다.

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

}

 

 

3. partner 리파지토리 생성

@Repository
public interface PartnerRepository extends JpaRepository<Partner, Long> {

}

 

 

4. item 리파지토리 생성

지난 글대로 따라왔다면 ItemRepository는 아래와 같이 이미 존재할 것이다.

@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {

}

 

 

5. order_detail 리파지토리 생성

지난 글대로 따라왔다면 OrderDetailRepository는 아래와 같이 이미 존재할 것이다.

@Repository
public interface OrderDetailRepository extends JpaRepository<OrderDetail, Long> {

}

 

 

6. order_group 리파지토리 생성

@Repository
public interface OrderGroupRepository extends JpaRepository<OrderGroup, Long> {

}

 

 

7. admin_user 리파지토리 생성

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

}

 


 

RepositoryTest 작성하기

이번에는 JUnit 테스트코드를 작성해보자. 이는 테스트 코드를 통해서 엔티티와 데이터베이스에 있는 테이블이 잘 일치하는지 확인하는 과정이다. 간단하게 CRUD 중 Create와 Read에 대해서만 테스트해보자.

 

 

1. CategoryRepositoryTest

Create 메서드

public class CategoryRepositoryTest extends StudyApplicationTests {

    @Autowired
    private CategoryRepository categoryRepository;

    @Test
    public void create() {
        String type = "COMPUTER";
        String title = "컴퓨터";
        LocalDateTime createdAt = LocalDateTime.now();
        String createdBy = "AdminServer";

        Category category = new Category();
        category.setType(type);
        category.setTitle(title);
        category.setCreatedAt(createdAt);
        category.setCreatedBy(createdBy);

        Category newCategory = categoryRepository.save(category); // 새로 DB에 들어간 category를 반환함

        Assertions.assertNotNull(newCategory);
        Assertions.assertEquals(newCategory.getType(), type);
        Assertions.assertEquals(newCategory.getTitle(), title);

    }

}

save 메서드를 통해 데이터베이스에 insert를 친 후, 정상적으로 insert가 잘 되었는지 확인하기 위해 assertNotNul, assertEquals 메서드를 통해 확인한다.

 

Read 메서드

@Test
public void read() {

    Optional<Category> optionalCategory = categoryRepository.findById(1L);
    optionalCategory.ifPresent(c -> {
        Assertions.assertEquals(c.getType(), type);
        System.out.println(c.getId());
        System.out.println(c.getType());
        System.out.println(c.getTitle());
    });

}

하지만 실제 검색을 할 때는 위의 findById(1L)와 같이 Id로 검색을 하기 보다는 Type으로 검색을 더 많이 할 것이다. 따라서 코드를 좀 수정하기 위해 CategoryRepository에 아래의 findByType을 추가한다.

 

@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {

    Optional<Category> findByType(String type);
    
}

findByType을 사용하기 위해 위와 같이 추가한 후, read 메소드도 수정한다.

 

@Test
public void read() {

    String type = "COMPUTER";

    Optional<Category> optionalCategory = categoryRepository.findByType(type);
   // select * from category where type = 'COMPUTER'
    optionalCategory.ifPresent(c -> {
        System.out.println(c.getId());
        System.out.println(c.getType());
        System.out.println(c.getTitle());
    });

}

검색할 때 findById(1L)처럼 id만 달랑 검색하는 게 아니라 아래 쿼리문처럼 검색하는 경우가 더 많을 것이므로, 이러한 경우를 쿼리메소드로 생성해보았다.

select * from category where type = 'COMPUTER'

 

 

 

2. UserRepositoryTest

Create 메서드

public class UserRepositoryTest extends StudyApplicationTests {

    // Dependency Injection (DI)
    @Autowired
    private UserRepository userRepository;

    @Test
    public void create() {
    
        String account = "Test01";
        String password = "Test01";
        String status = "REGISTERED";
        String email = "TEST01@gmail.com";
        String phoneNumber = "010-1111-2222";
        LocalDateTime registeredAt = LocalDateTime.now();
        LocalDateTime createdAt = LocalDateTime.now();
        String createBy = "AdminServer";

        // User 객체를 만들어준다.
        User user = new User();
        user.setAccount(account);
        user.setPassword(password);
        user.setStatus(status);
        user.setEmail(email);
        user.setPhoneNumber(phoneNumber);
        user.setRegisteredAt(registeredAt);
        user.setCreatedAt(createdAt);
        user.setCreatedBy(createdBy);

        User newUser = userRepository.save(user); // save를 통해 user의 내용을 newUser에 넣음
        Assertions.assertNotNull(newUser);
        
    }
    
}

간단한 Create 메서드이다. account, password, status 등 컬럼 값들을 지정한 후, User 객체를 만들어서 set 메서드로 해당 값들을 집어넣어준다. save 메서드를 통해 user 객체에 저장한 내용을 데이터베이스가 insert를 한 후 assertNotNull을 통해 정상적으로 데이터가 들어갔는지 확인한다. True가 뜨면 성공된 것이다.

 

Read 메서드

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    // FirstBy로 하면 가장 최근의 건을 반환함
    User findFirstByPhoneNumberOrderByIdDesc(String phoneNumber);
    
}

UserRepository도 위에서 했던 CategoryRepository와 같이 Id로 검색하는 것이 아니라 다른 컬럼으로 검색하는 기능을 추가해보자. 이번에는 phoneNumber로 검색하는 코드를 추가해보겠다. Read 메서드 사용 시, 달랑 Id 하나 가지고 검색하기 보다는 다른 데이터를 가지고 검색하는 경우가 더 많기 때문이다. 이때 findBy가 아닌 findFirstBy로 하면 조회한 건에 대해서 가장 최근 건을 반환한다.

 

@Test
@Transactional
public void read() {

    User user = userRepository.findFirstByPhoneNumberOrderByIdDesc("010-1111-2222");
    Assert.assertNotNull(user);

}

위에서 Create 메서드를 실행했을 때 Test01 계정을 가진 user의 phoneNumber가 010-1111-2222였으므로, 이번 테스트 코드를 실행했을 때 정상적으로 통과할 것이다. 만약 다른 번호를 입력하면 에러가 발생하고 테스트 코드를 통과하지 못한다.

 

 

 

3. PartnerRepositoryTest

Create 메서드

public class PartnerRepositoryTest extends StudyApplicationTests {

    @Autowired
    private PartnerRepository partnerRepository;

    @Test
    public void create() {
        String name = "Partner01";
        String status = "REGISTERED";
        String address = "서울시 강남구";
        String callCenter = "070-1111-2222";
        String partnerNumber = "010-1111-2222";
        String businessNumber = "1234567890123";
        String ceoName = "홍길동";
        LocalDateTime registeredAt = LocalDateTime.now();
        LocalDateTime createdAt = LocalDateTime.now();
        String createdBy = "AdminServer";
        Long categoryId = 1L;

        Partner partner = new Partner();
        partner.setName(name);
        partner.setStatus(status);
        partner.setAddress(address);
        partner.setCallCenter(callCenter);
        partner.setPartnerNumber(partnerNumber);
        partner.setBusinessNumber(businessNumber);
        partner.setCeoName(ceoName);
        partner.setRegisteredAt(registeredAt);
        partner.setCreatedAt(createdAt);
        partner.setCreatedBy(createdBy);
        partner.setCategoryId(categoryId);

        Partner newPartner = partnerRepository.save(partner);
        Assertions.assertNotNull(newPartner);
        Assertions.assertEquals(newPartner.getName(), name);

    }

}

Partner에 대한 name, status, address 등을 지정한 후, Partner 객체를 만들어서 set 메서드로 해당 값들을 집어넣어준다. save 메서드를 통해 partnerRepository에 저장한다. save 메서드가 실행되면 해당 데이터가 데이터베이스가 insert된다. 그러고 나서 assertNotNull을 통해 정상적으로 데이터가 들어갔는지 확인한다. True가 뜨면 성공된 것이다.

 

Read 메서드

read() 메서드는 위의 Category와 User에서 했던 방식과 동일하게 진행하면 되므로 이제부터는 생략하겠다.

 

 

 

4. ItemRepositoryTest

ItemRepositoryTest는 이전 글에서 잠깐 다룬 적이 있었다. 관련 내용은 아래 링크를 통해 확인할 수 있으며, 이번 글에서는 이전 테스트 코드를 조금 보완해보겠다.

ItemRepositoryTest 링크

 

[JPA] entity와 repository 생성 (+ JUnit Test 실행 방법)

[JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) 이 게시글은 아래 글과 이어지는 글이다. JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany) JPA 연관관계 설정 (@OneToOne/@O..

unit-15.tistory.com

 

Create 메서드

public class ItemRepositoryTest extends StudyApplicationTests {

    @Autowired
    private ItemRepository itemRepository;

    @Test
    public void create() {

        Item item = new Item();
        item.setStatus("UNREGISTERED");
        item.setName("삼성 노트북");
        item.setTitle("삼성 노트북 A100");
        item.setContent("2019년형 노트북입니다");
        item.setPrice(BigDecimal.valueOf(900000));
        item.setBrandName("삼성");
        item.setRegisteredAt(LocalDateTime.now());
        item.setCreatedAt(LocalDateTime.now());
        item.setCreatedBy("Partner01");
        item.setPartnerId(1L);

        Item newItem = itemRepository.save(item); // item을 save시키면 새로운 아이템 newItem이 반환되며
        Assertions.assertNotNull(newItem); // 그 newItem은 null값이 아니어야 함

    }
    
}

외래키로 사용하는 partnerId도 set메서드를 통해 설정해두어야 한다.

 

Read 메서드

read() 메서드는 위의 Category와 User에서 했던 방식과 동일하게 진행하면 되므로 생략한다.

 

 

 

5. OrderDetailRepositoryTest

OrderDetailRepositoryTest도 이전 글에서 잠깐 다룬 적이 있다. 관련 내용은 아래 링크를 통해 확인할 수 있으며, 이번 글에서는 이전 테스트 코드를 조금 보완해보겠다.

OrderDetailRepositoryTest 링크

 

[JPA] entity와 repository 생성 (+ JUnit Test 실행 방법)

[JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) 이 게시글은 아래 글과 이어지는 글이다. JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany) JPA 연관관계 설정 (@OneToOne/@O..

unit-15.tistory.com

 

Create 메서드

public class OrderDetailRepositoryTest extends StudyApplicationTests {

    @Autowired
    private OrderDetailRepository orderDetailRepository;

    @Test
    public void create() {

        OrderDetail orderDetail = new OrderDetail();

        orderDetail.setStatus("WAITING");
        orderDetail.setArrivalDate(LocalDateTime.now().plusDays(2));
        orderDetail.setQuantity(1);
        orderDetail.setTotalPrice(BigDecimal.valueOf(900000));
        orderDetail.setOrderGroupId(1L);  // 어떤 장바구니에
        orderDetail.setItemId(1L);  // 어떤 상품?
        orderDetail.setCreatedAt(LocalDateTime.now());
        orderDetail.setCreatedBy("AdminServer");

        OrderDetail newOrderDetail = orderDetailRepository.save(orderDetail);
        Assertions.assertNotNull(newOrderDetail);
    }
       
}

 

Read 메서드

read() 메서드는 위의 Category와 User에서 했던 방식과 동일하게 진행하면 되므로 생략한다.

 

 

 

6. OrderGroupRepositoryTest

Create 메서드

public class OrderGroupRepositoryTest extends StudyApplicationTests {

    @Autowired
    private OrderGroupRepository orderGroupRepository;

    @Test
    public void create() {

        OrderGroup orderGroup = new OrderGroup();
        orderGroup.setStatus("COMPLETE");
        orderGroup.setOrderType("ALL");
        orderGroup.setRevAddress("서울시 강남구");
        orderGroup.setRevName("홍길동");
        orderGroup.setPaymentType("CARD");
        orderGroup.setTotalPrice(BigDecimal.valueOf(900000));
        orderGroup.setTotalQuantity(1);
        orderGroup.setOrderAt(LocalDateTime.now().minusDays(2));
        orderGroup.setArrivalDate(LocalDateTime.now());
        orderGroup.setCreatedAt(LocalDateTime.now());
        orderGroup.setCreatedBy("AdminServer");
        orderGroup.setUserId(1L);

        OrderGroup newOrderGroup = orderGroupRepository.save(orderGroup);
        Assertions.assertNotNull(newOrderGroup);
        
    }
    
}

OrderGroupRepositoryTest의 create() 메서드는 이처럼 간단하게 만들 수 있다.

 

Read 메서드

read() 메서드는 위의 Category와 User에서 했던 방식과 동일하게 진행하면 되므로 생략한다.

 

 

 

7. AdminUserRepositoryTest

Create 메서드

public class AdminUserRepositoryTest extends StudyApplicationTests {

    @Autowired
    private AdminUserRepository adminUserRepository;

    @Test
    public void create() {
        AdminUser adminUser = new AdminUser();
        adminUser.setAccount("AdminUser01");
        adminUser.setPassword("AdminUser01");
        adminUser.setStatus("REGISTERED");
        adminUser.setRole("PARTNER");
        adminUser.setCreatedAt(LocalDateTime.now());
        adminUser.setCreatedBy("AdminServer");

        AdminUser newAdminUser = adminUserRepository.save(adminUser);
        Assertions.assertNotNull(newAdminUser);
        
    }
}

AdminUserRepositoryTest의 create() 메서드도 간단하게 만들어 보았다.

 

Read 메서드

read() 메서드는 위의 Category와 User에서 했던 방식과 동일하게 진행하면 되므로 생략한다.

 

 

 

 

(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)

 

 

반응형