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