DB - Memory DB

ys·2024년 5월 25일

Spring공부

목록 보기
10/14

1. 데이터 베이스

  • 데이터 베이스(database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합,관리하는 데이터의 집합니다
    • my sql server : 서버로 mysql을 이용하고, 여러 클라이언트들이 해당 서버의 데이터를 공유하는 것
  • 저장되는 방법에 따라 성능이 달라짐!
  • 저장되는 대상/저장 하는 방법에 따라 웹 서비스의 목적과 성능이 달라짐

2. DBMS

  • Data Base Management System
  • 데이터 베이스를 관리하는 시스템 == 데이터베이스를 관리하는 프로그램!
  • mysql, oracle, mongoDB 등등이 있다

cf) 관계형 DBMS를 다루기 위한 언어 = SQL

  • 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 조작하고 관리하기 위한 언어

3. Meomory DB

  • 시스템 재시작, 어플리케이션 재부팅시 -> 모든 데이터 날아감
  • ex) ArrayList, List, Map등등의 자료구조들...
  • 🤔 Spring Data JPA를 잘 이해하기 위해서 인터페이스를 이용해서 구현해보자!

아키텍쳐


entity


PrimaryKey

public interface PrimaryKey {
    void setId(Long id);

    Long getId();
}

Entity

public abstract class Entity implements PrimaryKey{
    @Getter @Setter
    private Long id;
}

db


Repository<T,ID>

public interface Repository<T,ID> { // ID를 제네릭 타입으로 갖는다
}

DataRepository<T,ID>

public interface DataRepository<T,ID> extends Repository<T,ID>{

    //create, update
    T save(T data);

    // read
    Optional<T> findById(ID id);

    List<T> findAll();

    // delete
    void delete(ID id);
}

SimpleDataRepository

public abstract class SimpleDataRepository<T extends Entity,ID extends Long> implements DataRepository<T,ID> { // 와일드 카드로 타입 제한
    private List<T> dataList = new ArrayList<>();
    private static long index = 0;
    private Comparator<T> sort = new Comparator<T>() {
        @Override
        public int compare(T o1, T o2) {
            return Long.compare(o1.getId(),o2.getId());
        }
    };

    // create // update 같이!

    @Override
    public T save(T data) {

        if (Objects.isNull(data)){
            throw new RuntimeException("Data is null");
        }

        // db에 데이터가 있는가?
        Optional<T> prevData = dataList.stream()
                .filter(it -> {
                    return it.getId().equals(data.getId());
                })
                .findFirst();

        if (prevData.isPresent()){
            // 기존 데이터가 있으면  -> update
            dataList.remove(prevData.get());
            dataList.add(data);
        }else {
            // 기존 데이터가 없는 경우 -> create
            index++;
            data.setId(index);
            dataList.add(data);
        }

        return data;
    }

    // read

    @Override
    public Optional<T> findById(ID id) {
        return dataList.stream()
                .filter(it ->{
                    return it.getId().equals(id);
                })
                .findFirst();
    }

    @Override
    public List<T> findAll() {
        return dataList.stream()
                .sorted(sort)
                .collect(Collectors.toList());
    }

    //delete


    @Override
    public void delete(ID id) {
        Optional<T> deleteEntity = dataList.stream()
                .filter(it -> {
                    return it.getId().equals(id);
                })
                .findFirst();

        if (deleteEntity.isPresent()){
            dataList.remove(deleteEntity.get());
        }
    }
}
  • 다음과 같이 crud 기능을 구현했다
  • create, update 기능을 같이 구현했다 -> 만약 존재하면 업데이트, 존재하지 않으면 생성 기능
  • @PutMapping으로 이어줄 수 있다
  • Comparator을 이용해 -> 정렬기능을 사용하였다!
  • 제네릭의 와일드 카드기능을 써서, extends 즉 상속계층에 대해서 제네릭을 제한하였다

75점 넘는 데이터 출력

  • 해당 조건을 만족했을 때의 데이터를 필터링 하는 로직을 만들어보자
  • 음.. 조건 에 맞는 필터링 -> 쿼리파라미터를 사용하면 좋겠다!
  • 메모리 db에서, 75점이 넘는 데이터를 가져오자...

UserRepository

public class UserRepository extends SimpleDataRepository<UserEntity, Long> {

    public List<UserEntity> FindAllScoreGreaterThan(int score){
        return this.findAll()
                .stream()
                .filter(it -> {
                    return it.getScore() >= score;
                }).collect(Collectors.toList());
    }
}
  • findall의 filter조건을 통해 리스트로 반환하자!

UserRepository

public List<UserEntity> filterScore(int score){
        return userRepository.FindAllScoreGreaterThan(score);
    }
  • repository의 위임 메서드를 service 계층에 생성

UserController

  • 처음에 설계했던대로, 🤔 기준 점수에 대한 쿼리파라미터를 받으면 좋을거같다
@GetMapping("/score")
    public List<UserEntity> filterScore(
            @RequestParam("score") int score
    ){
        return userService.filterScore(score);
    }

data

  • 이제 memory db에 10개의 데이터를 넣어보자!
[
  {
  "id": 1,
  "name": "user01",
  "score": 20
  },
  {
  "id": 2,
  "name": "user02",
  "score": 30
  },
  {
  "id": 3,
  "name": "user03",
  "score": 40
  },
  {
  "id": 4,
  "name": "user04",
  "score": 50
  },
  {
  "id": 5,
  "name": "user05",
  "score": 77
  },
  {
  "id": 6,
  "name": "user06",
  "score": 72
  },
  {
  "id": 7,
  "name": "user07",
  "score": 69
  },
  {
  "id": 8,
  "name": "user08",
  "score": 70
  },
  {
  "id": 9,
  "name": "user09",
  "score": 20
  },
  {
  "id": 10,
  "name": "user10",
  "score": 100
  }
]
  • 결과가 우리가 원하는데로 75점이 넘는 경우가 나오는 것을 알 수 있다!
  • 이렇게, 해당 조건을 필터링하는 경우는 우리가 서비스를 프로그래밍 할 때 많이 사용될 것이다
  • 이는 JpaRepository를 상속받는 reposiotry가 모두 사용하는 기능은 아니므로, 우리가 만든 repository에 추가해주자!
  • ex) 카테고리에 따른... 평균등등 -> *이런 통계 쿼리의 사용법도 알아놓자!

복습할 java 내용

  • 제네릭
  • Comparator -> sort
  • 제네릭의 와일드 카드 기능
profile
개발 공부,정리

0개의 댓글