스프링부트 네이버 지역검색 API를 활용한 맛집 리스트 만들기 2. Memory CRUD DB 개발

min seung moon·2021년 7월 2일
1

Spring

목록 보기
47/50
post-thumbnail

1. Create Project

  • Spring Initalizr
    • restaurant, gradle, Spring Web, Lombok, Thymeleaf

2. Memory DB(ArrayList) 구축

01. Memory DB

  • Package : db

  • Interface : MemoryDbRepositoryIfs

  • Abstract : MemoryDbRepositoryAbstract

  • Class : MemoryDbEntity

    • Entity
      • 데이터의 집합
      • 저장되고, 관리되어야하는 데이터
  • db / MemoryDbRepositoryIfs.interface

    • Optional
      • Java8에서 Optional<T> 클래스를 사용해 NPE를 방지할 수 있도록 도와준다.
      • null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조해도 NPE가 발생하지 않도록 해준다.
      • Optional 클래스는 value에 값을 저장하기 때문에 null이더라도 바로 NPE가 발생하지 않는다
package com.example.restaurant.db;

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

public interface MemoryDbRepositoryIfs<T> {

    Optional<T> findById(int index);
    T save(T entity);
    void deleteById(int index);
    List<T> listAll();
}
  • db / MemoryDbEntity.java
    • 데이터의 집합
    • 저장되고, 관리되어야하는 데이터
package com.example.restaurant.db;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class MemoryDbEntity {
    protected int index;
}
  • db / MemoryDbRepositoryAbstract.java
package com.example.restaurant.db;

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

public abstract class MemoryDbRepositoryAbstract<T extends MemoryDbEntity> implements MemoryDbRepositoryIfs<T>{

    private final List<T> db = new ArrayList<>();
    private int index = 0;

    @Override
    public Optional<T> findById(int index) {
        // filter는 db가 갖고 있는 T에 대한 부분으로
        // 여기서 getIndex는 T가 상속받은 MemoryDbEntity의 get index이다
        return db.stream().filter(it -> it.getIndex() == index).findFirst();
    }

    @Override
    public T save(T entity) {
        var optionalEntity = db.stream().filter(it -> it.getIndex() == entity.getIndex()).findFirst();

        if(optionalEntity.isEmpty()) { // db에 데이터가 없는 경우
            index++;
            entity.setIndex(index);
        }else {// db에 이미 데이터가 있는 경우
            var preIndex = optionalEntity.get().getIndex();
            entity.setIndex(preIndex);

            deleteById(preIndex);
        }
        db.add(entity);
        return entity;
    }

    @Override
    public void deleteById(int index) {
        var optionalEntity = db.stream().filter(it -> it.getIndex() == index).findFirst();

        if(optionalEntity.isPresent()) {
            db.remove(optionalEntity.get());
        }
    }

    @Override
    public List<T> listAll() {
        return db;
    }
}

02. Wishlist

  • 내가 원하는 항목들에 대한 리스트
  • Package : wishlist > entity, repository
  • Class : WishListEntity, WishListRepository
  • wishlist.entity/WishListEntity.java
package com.example.restaurant.wishlist.entity;

import com.example.restaurant.db.MemoryDbEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class WishListEntity extends MemoryDbEntity { // DB에 저장할 내용
    private String title;                   // 음식명, 장소명
    private String category;                // 카테고리
    private String address;                 // 주소
    private String readAddress;             // 도로명
    private String homePageLink;            // 홈페이지 주소
    private String imageLink;               // 음식, 가게 이미지 주소
    private boolean isVisit;                // 방문 여부
    private int visitCount;                 // 방문 횟수
    private LocalDateTime lastVisitDate;    // 마지막 방문 일자
}
  • wishlist.repository / WishListRepository.java
package com.example.restaurant.wishlist.repository;

import com.example.restaurant.db.MemoryDbRepositoryAbstract;
import com.example.restaurant.wishlist.entity.WishListEntity;
import org.springframework.stereotype.Repository;

@Repository // DB를 저장하는 곳이다라고 지정
public class WishListRepository extends MemoryDbRepositoryAbstract<WishListEntity> {
}

03. Test

  • test 폴더에서 진행
  • test / wishlist.repository / WishListRepositoryTest.java
package com.example.restaurant.wishlist.repository;

import com.example.restaurant.wishlist.entity.WishListEntity;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class WishListRepositoryTest {

    @Autowired
    private WishListRepository wishListRepository;

    private WishListEntity create() {
        var wishList = new WishListEntity();
        wishList.setTitle("title");
        wishList.setCategory("category");
        wishList.setAddress("address");
        wishList.setReadAddress("readAddress");
        wishList.setHomePageLink("");
        wishList.setImageLink("");
        wishList.setVisit(false);
        wishList.setVisitCount(0);
        wishList.setLastVisitDate(null);

        return wishList;
    }

    @Test
    public void saveTest() {
        var wishListEntity = create();
        var expected = wishListRepository.save(wishListEntity);

        Assertions.assertNotNull(expected);
        Assertions.assertEquals(1, expected.getIndex());
    }

    @Test
    public void updateTest() {
        var wishListEntity = create();
        var expected = wishListRepository.save(wishListEntity);

        expected.setTitle("update test");
        var saveEntity = wishListRepository.save(expected);

        Assertions.assertEquals("update test", saveEntity.getTitle());
        Assertions.assertEquals(1, wishListRepository.listAll().size());
    }

    @Test
    public void findByIdTest() {
        var wishListEntity = create();
        wishListRepository.save(wishListEntity);

        var expected = wishListRepository.findById(1);


        Assertions.assertEquals(true, expected.isPresent());
        Assertions.assertEquals(1, expected.get().getIndex());
    }

    @Test
    public void deleteTest() {
        var wishListEntity = create();
        wishListRepository.save(wishListEntity);

        wishListRepository.deleteById(1);

        int count = wishListRepository.listAll().size();

        Assertions.assertEquals(0, count);
    }

    @Test
    public void listAllTest() {
        var wishListEntity1 = create();
        wishListRepository.save(wishListEntity1);

        var wishListEntity2 = create();
        wishListRepository.save(wishListEntity2);

        int count = wishListRepository.listAll().size();
        Assertions.assertEquals(2, count);
    }
}

profile
아직까지는 코린이!

0개의 댓글