프로젝트를 생성해보며 스프링 구조에 대해서 알아보자
다시한번 도메인 이란?
도메인은 무언가 주체적으로 비즈니스 로직을 수행하는 객체
도메인모델 이란?
도메인에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
우리가 필요한 값은 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() : 하나라도 찾는 것