-
Notifications
You must be signed in to change notification settings - Fork 14
Description
pg.581 본문에는 generateShortenUrl메서드를 구현하기 위해 코드 일부를 수정해야 한다고 하였고 그 대상이 하이라이트된 부분으로 보여지지만 기실 generateShortenUrl메서드는 pg.576의 null을 리턴하는 상태 이래 어떤 코드도 채워지지 않은 상태이므로 하이라이트 유무를 떠나 모두 작성해야 한다.
하지만 그 전에 선결되어야 할 과제가 있는데, 그것은 pg.577에 작성한 ShortenUrlRepository에 추상메서드들을 아래와 같이 추가해줘야 한다는 것이다. 이는 깃허브 ch.13의 domain패키지 내 ShortenUrlRepository.java에서 참고되었다. (Update Note: pg. 582부터 이들을 다룬다)
@repository
public interface ShortenUrlRepository {
void saveShortenUrl(ShortenUrl shortenUrl);
ShortenUrl findShortenUrlByShortenUrlKey(String shortenUrlKey);
}
이후 infrastructure패키지를 생성하고 패키지 내에 구현체인 MapShortenUrlRepository.java를 생성한다. 그 다음 아래와 같이 ShortenUrlRepository 인터페이스의 추상메서드들을 구현해주자. 이는 깃허브 ch.13의 infrastructure패키지 내 MapShortenUrlRepository.java에서 참고되었다.
@repository
public class MapShortenUrlRepository implements ShortenUrlRepository {
private Map<String, ShortenUrl> shortenUrls = new ConcurrentHashMap<>();
@Override
public void saveShortenUrl(ShortenUrl shortenUrl) {
shortenUrls.put(shortenUrl.getShortenUrlKey(), shortenUrl);
}
@Override
public ShortenUrl findShortenUrlByShortenUrlKey(String shortenUrlKey) {
ShortenUrl shortenUrl = shortenUrls.get(shortenUrlKey);
return shortenUrl;
}
}
위에서 주목해야할게 바로 private Map<String, ShortenUrl> shortenUrls = new ConcurrentHashMap<>(); 코드이다.
기본적으로 Map은 인터페이스이며 HashMap은 그 구현클래스들 중 하나이다. Map과 HashMap은 키와 값의 쌍을 저장하는 자료구조로 인덱스 순서를 보장하지 않지만 특정 키를 사용하여 데이터의 중복을 허용하지 않고 값을 빠르게 검색, 접근할 수 있도록 해준다는 점에서 데이터들이 순서대로 저장되며 중복을 허용하는 List와 구별된다.
하지만 Map은 동기화를 제공하지 않으므로 여러 스레드가 동시에 맵에 접근할 때 문제가 발생할 수 있다. 또한 HashMap은 스레드세이프하지 않다. 때문에 ConcurrentHashMap과 같은 동기화된 버전을 제공하여 프로세싱 중 외부스레드의 접근으로부터 스레드세이프를 보장할 수 있다.