프로젝트를 생성해보며 스프링 구조에 대해서 알아보자
다시한번 도메인 이란?
도메인은 무언가 주체적으로 비즈니스 로직을 수행하는 객체
도메인모델 이란?
도메인에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
우리가 필요한 값은 id
, name
두개이고, 각자의 getter/setter
를 생성한다.
java/hello.springgood/domain/Member (클래스)
package hello.springgood.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;
}
}
리포지토리는 DB에 저장하고 관리하는 로직이다.
아직은 DB가 없기 때문에 일단은 메모리에 저장하는 방식으로 진행한다.
리포지토리를 생성하기 위해 우선 interface
를 먼저 생성해준다.
java/hello.springood/repository/MemberRepository (인터페이스)
package hello.springgood.repository;
import hello.springgood.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
: 데이터를 저장하고 Member
객체를 return한다Optional<Member>
: 찾으면 Memeber
를,없다면 null
을 return 해주게 한다.List<Member>
: Member
리스트 (Member[]
)이 인터페이스를 이용해 리포지토리 로직을 작성한다.
DB 대신 store
라는 hashmap
을 사용한다.
sequence
를 이용해 id
를 순차적으로 생성해준다.
package hello.springgood.repository;
import hello.springgood.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))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
}
implements
를 사용해 MemberRepository
를 불러온다. 여기서 단축키 option
+ Enter
를 이용해 전체를 불러올 수 있다.
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
}
member
의 아이디를 sequence
의 값+1로 중복을 피한다.
store
에 memberId
와 member
객체로 넣어준다 ({1:Member}
)
member
를 return 해준다
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
store.get(id)
: id를 이용해서 store에서 값을 찾는데 없을 때는 null을 보내줄 수 있게 Optional.ofNullable()
로 묶어준다.Optional<Member>
를 사용한다.public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
이런 문법은 처음 본다.. 허허
store의 values
=> 즉 member 객체들을stream()
?
filter
를 이용해 member의 이름이 파라미터로 들어온 이름이랑 같은지 찾아준다.
findAny()
: 하나라도 찾는 것