10. 회원 도메인과 리포지토리 만들기
- Java/스프링 입문
- 2021. 6. 4.
우선 domain 패키지에 Member 클래스를 만들자.
[hello.hellospring.domain의 Member클래스]
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;
}
}
그리고 repository 패키지에 MemberRepository 인터페이스를 만들자.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name); // Optional 은 자바 8에 추가된 문법임
// findBy로 값을 가져올때 null일 수 있다.
// 이때 null을 그대로 반환하지 않고 Optional로
// null까지 감싸서 반환 받는다.
List<Member> findAll();
}
그리고 인터페이스를 구현할 MemoryMemberRepository 클래스를 만든다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
// 실무에서는 동시성 문제가 있어서 이렇게 공유되는 변수일때는 ConcurrentHashMap을 써야하는데
// 예제니까 단순히 HashMap을 쓰도록 한다.
private static long sequence = 0L; // 0,1,2 ... 키값을 생성해줌
// 얘도 실무에서는 long이라고 하기보다는 동시성문제를 해결하기 위해 atomlong 등을 써야하는데
// 여기서는 가장 단순하게 하자!
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member; // store(자료형 Map)에 id랑 member를 저장해준다.
}
@Override
public Optional<Member> findById(Long id) {
// return store.get(id);
// 위처럼 하면 null이 반환될 수 있다.
return Optional.ofNullable(store.get(id));
// 그래서 Optional.ofNullable을 이용하면 store에서 반환하는 값이 null이여도
// 감쌀 수 있다. 감싸서 반환해주면 클라이언트에서 뭐를 할 수가 있다. (뒤에 설명)
}
@Override
public Optional<Member> findByName(String name) {
// 이것도 자바 8의 람다를 사용한다.
return store.values().stream() // 얘를 루프를 돌린다.
.filter(member -> member.getName().equals(name))
// filter, 람다를 사용함. member에서 가져온 이름이 파라미터 name과
// 같은 경우에만 필터링 됨
.findAny();
// 그리고 찾으면(필터링되면) 그대로 반환해 준다.
// (하나라도 찾으면 결과로 Optional이 반환됨)
// Map을 루프를돌면서 하나를 찾으면 그냥 걔를 반환한다.
// 근데 끝까지 없으면 Optional에 null이 포함되서 반환함.
}
@Override
public List<Member> findAll() { // 실무에서 자바할때 List를 많이 씀. (루프 돌리기가 편함)
return new ArrayList<>(store.values()); // 여기서 values는 멤버들을 의미함.
}
}
이거를 어떻게 검증하냐? 제대로동작하는지 검증해야한다.
이거를 확인하는 기가막힌 방법이 테스트 케이스를 작성하는 거다.
출처 : 인프런의 김영한 선생님 강의를 정리한 글입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard
'Java > 스프링 입문' 카테고리의 다른 글
12. 회원 서비스 개발 (0) | 2021.06.04 |
---|---|
11. 회원 리포지토리 테스트 케이스 작성 (0) | 2021.06.04 |
9. 비즈니스 요구사항 정리 (0) | 2021.06.04 |
8. API (0) | 2021.06.04 |
7. MVC와 템플릿 엔진 (0) | 2021.06.04 |