package hello.hellospring.domain;
public class Member {
private Long id; //사용자가 정하는게 아니라 시스템이정하는 아이디
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
회원정보 저장
package hello.hellospring.repository;
import java.util.List;
import java.util.Optional;
import hello.hellospring.domain.Member;
public interface MemberRepository {
Member save(Member member);//저장된 회원 반환
Optional<Member> findById(Long id);//id로 회원을 찾는다
Optional<Member> findById(String name);//name으로 찾기
//null 반환이 가능한 방법중에 하나 -> Optional<Member>
List<Member> findAll();//모든 회원리스트 반환
}
//동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
package hello.hellospring.repository;
//구현체클래스
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L; //0,1,2 같은 key값 생성
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
@Override
@Override
GPT형님께 여쭤보고 나서 내 모자란 머리로 이해 비스무리하게 해보자
private static Map<Long, Member> store = new HashMap<>();
- Map은 키-값(key-value) 쌍으로 이루어진 자료구조
- Long타입의 key로 Member객체를 저장한다
- store 필드는 HashMap으로 초기화(HashMap은 Map의 구현 클래스 중 하나)
- HashMap은 null을 포함한 모든 객체를 저장할 수 있으며, put 메소드를 이용하여 키와 값으로 이루어진 쌍을 저장하고, get 메소드를 이용하여 저장된 값을 조회
강의에서는 sequence 변수를 store변수의 key값으로 사용 하는것같다
Member save()메소드에서 회원을 save할때마다 sequence(key)값을 증가시켜주고 member객체의 id에 sequence값을 할당, store에 id와 member를 저장하고 return member나머지 @Override
@Override
public Optional<Member> findById(Long id) {
// TODO Auto-generated method stub
return Optional.ofNullable(store.get(id));
//값이 아무것도 안들어올경우 (ex: null) Optional.ofNullable로 감싸면 된다
}
@Override
public Optional<Member> findById(String name) {
//루프를 돌리는것이래
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
//member.getName()이 파라미터로 넘어온 name이랑 같은지 확인하는것
//name이 같으면 .filter이 되는것이고 같은걸 하나라도 찾으면 .findAny()
//결과가 Optional로 반환
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
//store의 values는 member
}
오우 진짜 어렵다 람다식이나 Stream API는 사실 배우지도않았다
GPT의 분석
- Map의 값들 중에서 name 값이 일치하는 Member 객체를 찾는 코드입니다.
- 해당 코드에서는 Stream API를 사용하여 Map의 값들을 순회하고, filter() 메소드를 이용해 name 값이 일치하는 Member 객체만 걸러냅니다. 그리고 마지막으로 findAny() 메소드를 호출하여 걸러낸 객체 중 임의의 하나를 반환합니다.
- 따라서 위 코드를 실행하면 name 값이 일치하는 Member 객체를 하나 반환하게 됩니다. 만약 일치하는 Member 객체가 없다면 빈 Optional 객체가 반환
근데 강의하는 김영한님 개멋져보여 진짜