개발/Spring

[Spring] 스프링 입문 - (회원 관리 예제) 회원 도메인과 리포지토리

y_lime 2024. 11. 5. 22:01

비즈니스 요구사항 정리

  • 데이터 : 회원 ID, 이름
  • 기능 : 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않음 (가상의 시나리오)

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현
  • 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체, ex)회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
  • 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
  • 가벼운 메모리 기반의 데이터 저장소 사용

회원 도메인과 리포지토리 만들기

1. 회원 객체

  • hello.hellospring에서 domain패키지 생성 후 Member객체 만들기
package hello.hellospring.domain;

public class Member {

    private Long id;	//회원 id는 시스템이 결정
    private String name;	// 회원 이름
    
    // command + N으로 getter & setter 생성

    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;
    }
}

 

2. 회원 리포지토리 인터페이스

  • member객체를 저장하는 저장소 repository패키지 생성
  • interface MemberRepostiory 생성
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, findByName : id와 name으로 저장소에서 찾아오는 방법
  • findAll : 지금까지 저장된 모든 회원들을 반환
  • optional : findById 등으로 회원을 찾을 때 Null 값이 있을 수 있는데, Null 값을 그대로 반환하지 않고 Optional로 감싸서 반환

 

 

3. 회원 리포지토리 메모리 구현체

  • MemoryMemberRepository를 만들고 MemberRepository를 implements해준다.
  • 이때 option + enter을 눌러 메서드 구현을 해준다.
  • Optional은 null이 return될 때를 대비해서 사용 !!
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());
    }
}
  • stream()
    • 자바 8에서 추가한 스트림(Streams)은 람다를 활용할 수 있는 기술 중 하나
    • 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있음
    • = 루프 돌리기

위 코드들이 잘 동작하는지 빠르고 간단하게 확인하기 위해, "테스트 케이스"라는 것을 작성한다.


 

 

@참고자료

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