본문 바로가기

개발일지/Spring

[Spring] 스프링 입문 - 회원 도메인과 리포지토리 만들기

 

비즈니스 요구사항 정리

  • 데이터 : 회원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());
    }
  • 전체 회원 조회

 

@참고자료

[인프런] 김영한 - 스프링 입문 강의 (무료)