비즈니스 요구사항 정리
- 데이터 : 회원 ID, 이름
- 기능 : 회원 등록, 조회
- 아직 데이터 저장소가 선정되지 않음 (가상의 시나리오)
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비즈니스 로직 구현
- 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인 : 비즈니스 도메인 객체, ex)회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
- 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 가벼운 메모리 기반의 데이터 저장소 사용
회원 도메인과 리포지토리 만들기
1. 회원 객체
- hello.hellospring에서 domain패키지 생성 후 Member객체 만들기
package hello.hellospring.domain;
public class Member {
private Long id; //회원 id는 시스템이 결정
private String name; // 회원 이름
// command + N으로 getter & setter 생성
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;
}
}
2. 회원 리포지토리 인터페이스
- member객체를 저장하는 저장소 repository패키지 생성
- interface MemberRepostiory 생성
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);
List<Member> findAll();
}
- save : 회원이 저장소에 저장됨
- findById, findByName : id와 name으로 저장소에서 찾아오는 방법
- findAll : 지금까지 저장된 모든 회원들을 반환
- optional : findById 등으로 회원을 찾을 때 Null 값이 있을 수 있는데, Null 값을 그대로 반환하지 않고 Optional로 감싸서 반환
3. 회원 리포지토리 메모리 구현체
- MemoryMemberRepository를 만들고 MemberRepository를 implements해준다.
- 이때 option + enter을 눌러 메서드 구현을 해준다.
- Optional은 null이 return될 때를 대비해서 사용 !!
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<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
// getName이 파라미터로 넘어온 name과 같은 지 확인
// 같으면 필터링
.findAny(); // 하나라도 찾으면 반환
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
- stream()
- 자바 8에서 추가한 스트림(Streams)은 람다를 활용할 수 있는 기술 중 하나
- 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있음
- = 루프 돌리기
위 코드들이 잘 동작하는지 빠르고 간단하게 확인하기 위해, "테스트 케이스"라는 것을 작성한다.
@참고자료
[인프런] 김영한 - 스프링 입문 강의 (무료)
'개발 > Spring' 카테고리의 다른 글
[Spring] 스프링 입문 - 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2024.11.07 |
---|---|
[Spring] 스프링 입문 - 회원 서비스 테스트 (0) | 2024.11.07 |
[Spring] 스프링 입문 - 회원 서비스 개발 (0) | 2024.11.07 |
[Spring] 스프링 입문 - (회원 관리 예제) 회원 리포지토리 테스트 케이스 (0) | 2024.11.07 |
[Spring] 스프링 입문 - MVC, API (0) | 2024.11.05 |