Developer J

JPA Entity Repository 설명 본문

개발자 되기 part1/Spring Boot

JPA Entity Repository 설명

Developer J 2021. 3. 11. 18:30
반응형

Repository

@Repository를 사용해서 따로 쿼리문을 작성하지 않아도 기본적인 CRUD 기능 구현이 가능하다.

@Repository                       //JpaRepository< User repository, 키의 타입>
public interface UserRepository extends JpaRepository<User, Long > {
}

 

Entity

@Entity는 JPA에서 테이블을 자동으로 생성해주는 기능을 가지고 있다.

@Data	    	//getter, setter, 기본 생성자를 만들어 줌
@AllArgsConstructor //모든 변수를 매개변수로 하는 생성자를 만들어 줌
@NoArgsConstructor // 파라미터가 없는 기본 생성자를 만들어 줌
@Entity // == table을 나타낸다. class 이름이 테이블 명과 다를때는 @Table(name = "user")
public class User {

    //java에는 캐멀케이스로 작성, db는 스네이크 케이스로 작성
    
    @Id							 //식별자를 뜻함
    @GeneratedValue(strategy = GenerationType.IDENTITY)  //키의 전략을 선택
    private Long id;
    private String account;
    private String email;
    private String phoneNumber;
    private LocalDateTime createdAt;
    private String createdBy;
    private LocalDateTime updatedAt;
    private String updatedBy;
    
//    User와 OrderDetail의 관계 1 : N    
//    mappedBy: 어떤 변수에 맵핑하는지, OrderDetail의 user라는 변수에 맵핑
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<OrderDetail> orderDetailList;
}

 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = {"user","item"})   //OrderDetail에서 user와 item을 상화 참조하고 있어서 자동으로 만들어지는 toString이 계속 돌게된다.제외시키기
public class OrderDetail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String status;
    private LocalDateTime arrivalDate;
    private Integer quantity;
    private BigDecimal totalPrice;
    private LocalDateTime registeredAt;
    private LocalDateTime unregisteredAt;
    private LocalDateTime createdAt;
    private String createdBy;
    private LocalDateTime updatedAt;
    private String updatedBy;
    private LocalDateTime orderAt;

// orderdetail입장에서 User는 N:1관계
    @ManyToOne
    private User user;
    @ManyToOne
    private Item item;
}

 

item의 entity는 관계에 대한 부분만 보여주겠다.

    //LAZY = 지연로딩  , EAGER = 즉시로딩
    // LAZY = SELECT * FROM item WHERE id = ?
    // EAGER = 관련 테이블들을 모두 조인함. 1:1 관계에 이용
    // item_id = order_detail.item_id
    // user_id = order_detail.user_id
    // where item.id = ?
    //1 : N
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "item")
    private List<OrderDetail> orderDetailList;

 

Test case 만들기

test 폴더 아래 java class를 생성하고, 기존에 자동으로 만들어지는 ApplicationTests를 상속받는다.

public class UserRepositoryTest extends StudyApplicationTests {

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

    @Test
    public void create(){
        User user = new User();
        user.setAccount("TestUser01");
        user.setEmail("TestUser@gmail.com");
        user.setPhoneNumber("010-1111-1111");
        user.setCreatedAt(LocalDateTime.now());
        user.setCreatedBy("admin");

        User newUser = userRepository.save(user);
        System.out.println("newUser : "+ newUser);
    }
    @Test
    @Transactional
    public void read(){
//        User user = userRepository.findById(3L); 하면 에러남 아래와 같이 optional형태로 받아야함.
        Optional<User> user = userRepository.findByAccount("TestUser03");
//      optional은 있을 수 도 없을 수 도 있기 때문에 아래와 같이 조건을 넣어 준다
        user.ifPresent(selectUser -> {

            selectUser.getOrderDetailList().stream().forEach(detail ->{

                System.out.println(detail.getItem());
            });
        });
    }
    
    @Test
    @Transactional
    public void update(){
        Optional<User> user = userRepository.findById(2L);

        user.ifPresent(selectUser -> {
            selectUser.setAccount("updateUser01");
            selectUser.setUpdatedAt(LocalDateTime.now());
            selectUser.setUpdatedBy("update method()");

            userRepository.save(selectUser);
        });
    }
    
    @Test
    @Transactional //테스트 종료 후 롤백을 해준다
    public void delete(){
        Optional<User> user = userRepository.findById(2L);


        user.ifPresent(selectUser -> {
            userRepository.delete(selectUser);
        });

        Optional<User> deleteUser = userRepository.findById(2L);

        if(deleteUser.isPresent()) {
            System.out.println("데이터 존재 : " + deleteUser.get());
        }else{
            System.out.println("데이터 삭제 데이터 없음");
        }
    }
}

 

반응형

'개발자 되기 part1 > Spring Boot' 카테고리의 다른 글

Lombok이란? 설치 방법  (0) 2021.03.09
Rest api 란? 예제 포함  (0) 2021.03.07
Spring Boot 기초 환경 설정  (0) 2020.12.15