본문 바로가기
개발/Spring

[스프링 입문] 스프링 회원관리 예제 - 2. 회원 도메인, 레포지토리 만들기

by ujin2021 2021. 6. 29.

* 인프런 김영한님의 '스프링 입문' 강의를 듣고 작성한 내용입니다! (https://inf.run/txXC)

 

회원 도메인 생성

도메인 : 비즈니스 도메인 객체(회원)

1. hello.hellospring/domain (package 생성)

2. domain/Member (Class 생성)

[Member.java 소스코드]

 

package hello.hellospring.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id; // data 구분을 위해 system이 생성하는 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;
}
}
view raw Member.java hosted with ❤ by GitHub

 

 

 

  • 회원은 id와 name을 가지기 때문에 id, name 변수를 만들어준다
  • id, name에 각각에 대한 getter/setter을 만들어준다

 

회원 레포지토리 인터페이스 생성

레포지토리 : DB에 접근. 도메인 객체를 DB에 저장하고 관리. 아직 DB를 선정하지 못했으므로 interface로 만들어 놓고 나중에 갈아끼운다

1. hello.hellospring/repository (package 생성)

2. repository/MemberRepository (interface 생성)

[MemberRepository.java 소스코드]

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() : 회원 id를 통해 회원 검색
  • findByName() : name을 통해 회원 검색
  • findAll() : 전체 회원 검색
  • Optional : id, name을 통해 회원을 검색할 때, 해당하는 회원이 없을 수 있다(null) -> 이것을 처리하기위해 사용(java8)

 

회원 레포지토리 구현체 생성(메모리)

1. hello.hellospring/repository/MemoryMemberRepository

[MemoryMemberRepository.java 소스코드]

package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L; // 0, 1, 2, ... 생성해준다
@Override
public Member save(Member member) { // Member 저장 시 name은 사용자가 입력한 값으로 넘어오고, id는 여기서 생성
member.setId(++sequence); // sequence 값을 증가시켜 회원의 id로 넣어준다
store.put(member.getId(), member); // Map에 member 정보 저장
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id)); // store에서 id를 찾아서 반환(null일 때를 대비하여 Optional.ofNullable로 감싸준다
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream() // loop 돌리는 것
.filter(member -> member.getName().equals(name)) // lambda 사용. member.getName이 input name과 같은지 확인
.findAny(); // 찾으면 반환
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values()); // store의 values는 member
}
public void clearStore() {
store.clear();
}
}
  • implements MemberRepository 후 alt + insert 단축키로 구현해야 할 method 전체 가져오기
  • 회원 정보를 저장해줄 Map 생성(동시성 문제가 있지만 현재는 그냥 진행)
  • 회원 id는 입력받는게 아니라 자동으로 생성되게 할것이므로 long type sequence 변수 선언
  • 여기서의 clearStore()함수는 테스트시에 필요한 함수

save()

  • member 저장시 sequence를 증가시켜서 id로 설정(현재 member의 이름은 입력받은 값으로 설정 되어있음)
  • store(Map)에 회원정보 저장후 member 객체 return