[Spring] HashMap을 이용한 Repository 만들기

GaramFlow·2023년 11월 13일
0

HashMap을 이용한 Repository 만들기

  • HashMap에 대해서 알아보기
  • HashMap을 이용해서 Repository 만들어보기
  • Repository 만들 시 필요한 추가적인 개념에 대해 알아보기

1) HashMap이란?

  • Java에서 java.util 패키지에 속해있는 클래스로 Map 인터페이스를 구현했다.
  • 키(key)-값(value) 쌍으로 저장하는 자료구조이다.
  • 각 키는 유일해야 하며 정확히 하나의 값을 매핑한다.

(1) 특징

  • 키의 유일성 : 같은 키에 여러 값 저장 시, 마지막에 저장한 값으로 대체된다.
  • 순서 : 요소 순서를 보장하지 않는다. 즉, 입력 순서대로 저장 및 조회되지 않는다.
  • 빠른 접근 : 키를 통해 값을 빠르게 찾을 수 있다. 키에 대한 hashcode(), equals()을 사용한다.
  • Null 허용 : 키와 값으로 null을 허용한다.

2) Optional 이란?

  • java.util 패키지에 속한 클래스이다.
  • 값을 감싸는 컨테이너 객체로, 해당 값이 null일 경우 NullPointException을 방지하는 데 효과적이다.

Optional을 이용하는 이유

  • Null 안정성 : Optional은 null을 반환할 수 있는 메소드에 대한 명시적 대안을 제공한다. NullPointException을 방지할 수 있다.
  • 의도 명확성 : Optional을 메소드 반환 타입으로 하면 해당 메소드가 null을 반환할 수 있음을 알려줄 수 있다.
  • 함수형 프로그래밍 지원 : map, filter, flatMap 등 메소드를 사용해서 함수형 프로그래밍 스타일을 지원한다.

3) 필드에 private final 사용하는 이유는?

  • 불변성 : final 키워드는 한 번 할당되면 해당 필드 값을 변경할 수 없다는 것을 의미한다. 불변 객체는 예측 가능하고 오류 발생 가능성을 줄여준다.
  • 캡슐화 : private 접근 지정자는 클래스 외부에서 필드에 직접 접근하는 것을 방지해준다. 내부 구현을 변경해도 외부에 영향을 주지 않아서 유지보수가 편해진다.
  • 의존성 주입(DI) : final 키워드는 생성자를 통해서만 한 번 할당가능하므로 생성 시점에 완전히 구성된 객체를 보장한다. 즉, 필드가 초기화되지 않은 상태로 남는 경우는 방지하게 된다.
  • 선언전 프로그래밍 : final 키워드를 사용하면 해당 필드가 애플리케이션 생명주기 동안 변경되지 않을 것을 선언적으로 나타낼 수 있다.

Spring 컴포넌트에 private final 필드 사용하는 이유는?

  • 특정 서비스나 데이터에 대한 접근을 제어하는 역할을 한다.
  • 상태가 변경되는 필드가 없도록 설계하는 것이 안정적이고 유지보수성을 향상시킨다.
  • Spring Framework에서 생성자 기반 의존성 주입을 권장하고 있다.

4) 구현하기

@Repository
public class FoodMapRepository {
    private final Map<Long, Food> db;

    public FoodMapRepository() {
        this.db = new HashMap<>();
    }

    // 상품 전체 조회
    public Collection<Food> getAllFoods() {
        return db.values();
    }

    // 상품 하나 조회
    public Optional<Food> getFoodById(Long id) {
        return Optional.ofNullable(db.get(id));
    }

    // 상품 등록
    public Food addFood(Long id, Food food) {
        return db.put(id, food);
    }

    // 상품 수정
    public Food updateFood(Long id, Food food) {
        if(db.containsKey(id)) {
            db.put(id, food);
            return food;
        }
        return null;
    }

    // 상품 삭제
    public void deleteFood(Long id) {
        db.remove(id);
    }
}
profile
간단한 지식 저장 및 공유를 위한 블로그입니다.

0개의 댓글