데이터 베이스(database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합,관리하는 데이터의 집합니다cf) 관계형 DBMS를 다루기 위한 언어 = SQL
- 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 조작하고 관리하기 위한 언어

public interface PrimaryKey {
void setId(Long id);
Long getId();
}
public abstract class Entity implements PrimaryKey{
@Getter @Setter
private Long id;
}
public interface Repository<T,ID> { // 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);
}
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());
}
}
}
@PutMapping으로 이어줄 수 있다와일드 카드기능을 써서, extends 즉 상속계층에 대해서 제네릭을 제한하였다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());
}
}
public List<UserEntity> filterScore(int score){
return userRepository.FindAllScoreGreaterThan(score);
}
@GetMapping("/score")
public List<UserEntity> filterScore(
@RequestParam("score") int score
){
return userService.filterScore(score);
}
[
{
"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
}
]


- 이렇게, 해당 조건을 필터링하는 경우는 우리가 서비스를 프로그래밍 할 때 많이 사용될 것이다
- 이는 JpaRepository를 상속받는 reposiotry가 모두 사용하는 기능은 아니므로, 우리가 만든 repository에 추가해주자!
- ex) 카테고리에 따른... 평균등등 -> *이런 통계 쿼리의 사용법도 알아놓자!