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

enxnong·2023년 4월 23일
0

Spring

목록 보기
10/26

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

도메인

비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

⇒ 도메인 패키지를 만들어 관리하고, Member class 생성

package hello.hellospring.domain;

public class Member {

    private Long id; // 임의의 값 => 시스템이 저장하는 아이디
    private String name;

		// 인텔리제이 단축키 : Alt + Insert
    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;
    }
}

리포지토리

데이터베이스에 접근, 도메인 객체를 데이터베이스에 저장하고 관리

⇒ 리포지토리 패키지를 만들어 저장소를 만들고 Member객체를 저장할 리포지토리를 생성한다.

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository { // 저장소

    Member save(Member member); // save를 통해 회원이 저장소에 저장됨
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll(); // findAll : 지금까지 저장된 모든 회원 List를 반환
}
💡 **Optional이란?** null이 올 수 있는 값을 감싸는 Wrapper 클래스로 findById나 Name의 값이 null이더라도 바로 NPE(NullPointerException)가 발생하지 않도록 도와준다.

구현체

단순하게 메모리를 넣었다 뺄 수 있음

⇒ MemberRepository를 상속받아 구현하는 MemberRepository 클래스를 생성하여 코드를 작성한다

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에 값을 넣기 전에 sequence(id)값 세팅
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id)); // NPE를 방지하기 위해 Optional사용
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name)) 
								// parameter로 넘어온 name이랑 같은지 확인
								// 같은 경우에만 필터링됨
                .findAny(); // findAny : 하나라도 찾기
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); // Member들이 모두 반환됨
    }
}
profile
높은 곳을 향해서

0개의 댓글