[Spring] DataBase

HOJUN·2024년 6월 9일

Backend - Spring

목록 보기
13/34

DataBase

DB를 배우는 데에 진입한다.
역시 처음 배울 내용은 CRUD이다.

CRUD

Create, Read, Update, Delete의 약자로 소프트웨어 혹은 데이터베이스에서 기본으로 가지는 기능이다.
다른 이름을 가지고 CRUD의 기능을 하는 소프트웨어나 프로토콜이 존재한다.

매우 기본적인 기능이며 대부분의 소프트웨어는 필수로 가져야한다.

Database Schema

데이터베이스 (이하 DB)는 데이터를 보관하는 Reposity를 가지고 외부에서 관리하는 작업자 혹은 사용자단의 외부스키마(External Schema)와 DB에 저장되는 데이터의 구조를 관장하는 개념스키마(Conceptual Schema), 추상화된 저장공간 DB 내부를 내부스키마(Internal Schema)로 이루어져 있다.

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

    // Create, Update
    T save(T data);

    // Read
    Optional<T> findById(ID id); //데이터가 없을 수 있으므로 Optional

    List<T> findAll();

    //delete
    void delete(ID id);
}

전체 DB를 상속하는 DataRepository 인터페이스이다.
기본적인 기능을 하는 추상 메소드의 종류를 선언했다.

abstract public class SimpleDataRepository<T extends Entity, ID extends Long> implements DataRepository<T, ID> {

    private List<T> dataList = new ArrayList<T>();

    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());
        }
    };

추상클래스로 인터페이스의 메소드를 구현한다.
data는 T타입을 가지지만 Entity를 상속하는 T 이하의 타입으로 한정하고 ID는 정수형으로 한정한다.
DB의 데이터가 저장될 dataList와 각 데이터의 index, Comparator를 이용한 sorting 변수를 선언했다

//Create
    @Override
    public T save(T data) {

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

        //db에 데이터가 있는지 찾음
        var prevData = dataList.stream()
                .filter(it -> {
                    return it.getId().equals(data.getId());
                })
                .findFirst();

        //있을 경우
        if (prevData.isPresent()) {
            dataList.remove(prevData);
            dataList.add(data);
        } else {
        //없을 경우
            index++;
            data.setId(index);
            dataList.add(data);
        }
        return data;
    }

save : create는 update기능을 포함한다.
데이터가 DB에 존재하는지 먼저 체크해야한다.
같은 id를 가지는 데이터가 있으면 삭제하고 insert하여 update하고
데이터가 없으면 index로 id를 설정하고 save한다.

//Read
@Override
public Optional<T> findById(ID id){
    //현재 리스트에 있는 Id와 id가 같으면 리턴
    return dataList.stream()
            .filter(it -> {
                return (it.getId().equals(id));
            })
            .findFirst();
}
@Override
public List<T> findAll() {
    //Comparator 이용한 sorting
    return dataList.stream().sorted(sort).collect(Collectors.toList());
}

findByID : 찾고자 하는 id가 리스트에 있으면 반환한다.
findAll : 전체 리스트를 소팅해서 반환한다. (안해도 된다)

//Delete
@Override
public void delete(ID id) {
    var deleteEntity = dataList.stream()
            .filter(it -> {
                return (it.getId().equals(id));
            })
            .findFirst();
    if(deleteEntity.isPresent()){
        dataList.remove(deleteEntity);
    }
}

delete : findById구현체를 이용해서 삭제할 데이터를 찾고, 리스트에서 삭제하면 된다.

CRUD를 추상클래스로 구현을 마쳤다.

0개의 댓글