Java

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

15호의 개발자 2022. 2. 25. 18:23
반응형

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

 

 

이전 글

 

JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany)

JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany) 이 게시글은 아래 글과 이어지는 글이다. JpaRepository를 활용한 CRUD 구현 방법 (자세한 설명) JpaRepository를 활용한 CRUD 구현 방법 ..

unit-15.tistory.com

 


 

테이블을 설계했으면 우선 그에 맞는 entity를 만들어줘야 한다. entity와 repository를 만드는 방법에 대해 알아보자.

 

 

1. entity & repository 생성

 

Item 엔티티

import lombok.*;
import javax.persistence.*;

@Data
@AllArgsConstructor // 모든 생성자
@NoArgsConstructor  // 기본 생성자
@Entity // 엔티티임을 명시
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // mySQL이므로 identity로 설정
    private Long id;

    private String name;

    private String content;

    private BigDecimal price;
    
}

이전 글에서 말했듯이, @Entity 어노테이션을 붙이면 entity명(=클래스명)과 매칭되는 테이블명을 자동으로 찾아서 매핑해준다. 

 

Item 레파지토리

import com.example.study.model.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

}

Item 레파지토리를 만든다. JpaRepository를 상속하며, 제네릭으로 Item 타입을 넘겨주고 Item 엔티티의 @Id에 해당하는 타입인 Long을 그 뒤에 적어준다.

 

OrderDetail 엔티티

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

@Data
@AllArgsConstructor // 모든 생성자
@NoArgsConstructor  // 기본 생성자
@Entity // 엔티티임을 명시
public class OrderDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // mySQL이므로 identity로 설정
    private Long id;

    private LocalDateTime orderAt;

    private Long userId;

    private Long itemId;
    
}

 

OrderDetail 레파지토리

import com.example.study.model.entity.OrderDetail;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

}

OrderDetail 레파지토리를 만든다. JpaRepository를 상속하며, 제네릭으로 OrderDetail 타입을 넘겨주고 OrderDetail 엔티티의 @Id에 해당하는 타입인 Long을 그 뒤에 적어준다.

 


 

2. JUnit Test 실행

 

[ItemRepository] Create 메서드

간단한 create() Test 코드를 만들어 보자.

import com.example.study.StudyApplicationTests;
import com.example.study.model.entity.Item;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

public class ItemRepositoryTest extends StudyApplicationTests {

    @Autowired
    private ItemRepository itemRepository;

    @Test
    public void create() {

        Item item = new Item();
        item.setName("삼성 노트북");
        item.setPrice(900000);
        item.setContent("2019년형 노트북입니다");

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

    }
    
}

ItemRepository에 대한 테스트 코드이므로 ItemRepositoryTest라고 이름 붙였다.

 

set 메소드를 이용해 item에 값들을 저장하고, save 메소드를 이용해 반환되는 새로운 Item 객체를 newItem에 저장한다. 그러면 newItem은 null 값이 아닐 것이므로 assertNotNull에서 True를 반환할 것이다.

 

데이터베이스와 연결이 되어있다면 테스트 코드를 실행했을 때 실제로 DB에 해당하는 데이터가 들어가 있을 것이다.

 

 

[ItemRepository] Read 메서드

아래는 간단한 read() Test 코드이다.

import com.example.study.StudyApplicationTests;
import com.example.study.model.entity.Item;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

public class ItemRepositoryTest extends StudyApplicationTests {

    @Autowired
    private ItemRepository itemRepository;

    @Test
    public void read() {
 
        Long id = 1L;
    
        Optional<Item> item = itemRepository.findById(id);
        Assertions.assertTrue(item.isPresent());

    }
    
}

id=1인 item을 선택하고, findById 메소드로 해당 id 값을 가진 item을 찾는다. 이때, findById 메서드는 Optional을 반환하는 메서드이므로 앞에 Optional을 적어준다. findBy로 찾은 값이 존재할 수도 있고 존재하지 않을 수도 있기 때문이다. 만약 값이 존재한다면 assetTrue에서 item.isPresent()를 했을 때 True 값이 반환될 것이다.

 

 

[OrderDetailRepository] Create 메서드

이번에는 OrderDetailRepository에 대한 테스트 코드를 만들어보자. 아래는 간단한 create() Test 코드이다.

import com.example.study.StudyApplicationTests;
import com.example.study.model.entity.OrderDetail;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.time.LocalDateTime;

public class OrderDetailRepositoryTest extends StudyApplicationTests {

    @Autowired
    private OrderDetailRepository orderDetailRepository;

    @Test
    public void create() {

        OrderDetail orderDetail = new OrderDetail();

        orderDetail.setOrderAt(LocalDateTime.now());
        orderDetail.setUserId(1L); // 어떤 사람인지
        orderDetail.setItemId(1L); // 어떤 상품인지
        
        OrderDetail newOrderDetail = orderDetailRepository.save(orderDetail);
        Assertions.assertNotNull(newOrderDetail);
        
    }
}

OrderDetailRepository에서는 어떤 사람인지에 대한 user index와, 어떤 상품인지에 대한 item index가 필요하다. 따라서 위와 같이 setUserId, setItemId로 지정해두어야 하며, 해당 user와 item은 이미 존재하고 있어야 한다.

 

 


이제 테이블(=entity, 자바 class)도 다 만들었으니, 다음 글에서는 JPA를 활용해 테이블 간의 관계를 설정하는 방법에 대해 알아보겠다.

 

다음 글

 

JPA 연관관계 설정 구체적인 방법 (fetch 타입 종류: LAZY, EAGER)

JPA 연관관계 설정 구체적인 방법 (fetch 타입 종류: LAZY, EAGER) 이전 글 [JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) [JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) 이 게시..

unit-15.tistory.com

 

 

 

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

반응형