티스토리 뷰

반응형

15. 15. 가게 추가 - 2 ~ 16. 16. JPA

 

Persistence : 데이터를 영구적으로 가지고 싶다. java persistence application -> 자바에서 제일 유명한건Hibernate

-> 얼마나 유명하냐면, 자바 표준 jpa 가 hibernate 에서 나왔다는 말이 있을 정도

 

 

중요한 어노테이션

@Entity -> 모델에는 반드시 이것을 붙여줘야 에러가 안난다.

우리는 Spring data jpa 를 사용할 수 있다.

우리는  H2 database 중에 in-memory 방식을 활용할 예정이다.

@Entity 에는 반드시 identifier 가 있어야한다.

identifier 에 @Id 라고 붙여주면 되고, 생성 값을 넣어주라는 어노테이션은  @GeneratedValue

임시로 처리되는 거다! -> @Transient

hms application 에서는 

@Table(name="category")
public class Category extends TimeEntity {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long categoryId;
  ....

형태가 비슷하게 들어간 것을 확인할 수 있다.

 

 

* 설치

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

implementation 'com.h2database:h2'

-> build 에서 rebuild project  눌러서 싱크를 맞춘다.

package kr.co.fastcampus.eatgo.domain;

import org.springframework.data.repository.CrudRepository;
// crud 등의 다른 구현 없이도 reposirtoty를 이용할 수 있게 된다.
import java.util.List;

public interface MenuItemRepository extends CrudRepository<MenuItem, Long> {
    List<MenuItem> findAllByRestaurantId(Long restaurantId);

    void deleteById(Long id);
}

오늘 드디어 test all 을 배움

test -> configuration 누르고 

name 을 test all 로 한다. 종류는 패키지, in whole project

 

new

: Optional<Restaurant> -> null safety 를 위한 자바 언어 null 인경우를 핸들링 해준다.

초록망치-> build

package kr.co.fastcampus.eatgo.domain;

import org.springframework.data.repository.CrudRepository;

import java.util.List;
import java.util.Optional;

public interface RestaurantRepository extends CrudRepository<Restaurant, Long> {
    List<Restaurant> findAll();

    List<Restaurant> findAllByAddressContainingAndCategoryId(
            String region, Long categoryId);

    Optional<Restaurant> findById(Long id);

    Restaurant save(Restaurant restaurant);
}

repository 구현체를 지워줌.

 

Optional.of(restaurant) -> option<Restaurant> 를 위한 test 작업

package kr.co.fastcampus.eatgo.domain;


import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Transient;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Restaurant {

    @Id
    @GeneratedValue
    @Setter
    private Long id;

    @NotNull
    private Long categoryId;

    @NotEmpty
    private String name;

    @NotEmpty
    private String address;

    @Transient
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private List<MenuItem> menuItems;

    @Transient
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private List<Review> reviews;

    public String getInformation() {
        return name + " in " + address;
    }

    public void updateInformation(Long categoryId,
                                  String name, String address) {
        this.categoryId = categoryId;
        this.name = name;
        this.address = address;
    }

    public void setMenuItems(List<MenuItem> menuItems) {
        this.menuItems = new ArrayList<>(menuItems);
    }

    public void setReviews(List<Review> reviews) {
        this.reviews = new ArrayList<>(reviews);
    }

}
package kr.co.fastcampus.eatgo.application;

import kr.co.fastcampus.eatgo.domain.Reservation;
import kr.co.fastcampus.eatgo.domain.ReservationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;

@Service
@Transactional
public class ReservationService {

    private ReservationRepository reservationRepository;

    @Autowired
    public ReservationService(ReservationRepository reservationRepository) {
        this.reservationRepository = reservationRepository;
    }

    public List<Reservation> getReservations(Long restaurantId) {
        return reservationRepository.findAllByRestaurantId(restaurantId);
    }

}

 

반응형
댓글