비즈니스 요구사항 정리
- 데이터 : 회원ID, 이름
- 기능 : 회원 등록, 조회
- 아직 데이터 저장소가 선정되지 않았다는 가상의 시나리오
- 컨트롤러 : 웹 MVC의 컨트롤러 역할
- 서비스 : 핵심 비즈니스 로직 구현 ex) 중복 가입 안됨 등
- 리포지토리 : DB에 접근하여, 도메인 객체를 저장하고 관리한다
- 도메인 : 회원, 주문, 쿠폰처럼 DB에 저장되고 관리되는 비즈니스 도메인 객체
- 아직 데이터 저장소가 선정되지 않았음 → 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 개발 진행을 위해 일단 가벼운 메모리 기반의 데이터 저장소를 사용한다
회원 도메인과 리포지토리 만들기
1. Member Class 생성
domain이라는 패키지를 새로 생성하고, Member Class를 생성한다
package hello.hellospring.domain;
public class Member {
private Long id; // 회원 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;
}
}
getter, setter 까지 설정해주면 된다
2. 회원 리포지토리 인터페이스 만들기
새로운 패키지 repository안에 인터페이스 생성
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); // 회원 id로 찾기
Optional<Member> findByName(String name);
List<Member> findAll(); // 모든 데이터 불러오기
}
Optional?
- findById 등으로 회원을 찾을 때 Null 값이 있을 수 있는데, Null 값을 그대로 반환하지 않고 Optional로 감싸서 반환
3. 구현체 만들기
repository 패키지 안에 새로운 클래스 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<>();
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());
}
}
MemberRepository에서, [단축키] option + 엔터 하면
쉽게 implement method 할 수 있다!
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
- save 할 때, set을 하면서 키 값을 하나 올림
- store에 저장
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
- null 일 가능성도 있기 때문에 Optional로 감싸서 반환을 해준다
@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());
}
- 전체 회원 조회
@참고자료
[인프런] 김영한 - 스프링 입문 강의 (무료)
'개발일지 > Spring' 카테고리의 다른 글
[Server] TCP와 UDP (0) | 2023.09.26 |
---|---|
[Spring] 스프링 입문 - 회원 서비스 테스트 (0) | 2023.09.18 |
[Spring] 스프링 입문 - 회원 서비스 개발 (0) | 2023.09.14 |
[Spring] 스프링 입문 - 회원 리포지토리 테스트 케이스 (0) | 2023.09.13 |
[Spring] 스프링 입문 - 정적 컨텐츠, MVC, API (0) | 2023.09.08 |