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

Bummy·2023년 4월 27일
0

1) 웹 애플리케이션 계층 구조

  • 컨트롤러 : 웹 MVC의 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직
  • 리포지토리 : DB에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체 (회원, 주문 등 주로 DB에 저장하고 관리됨)

Member.java

package hello.hellospring.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에 이러한 필드가 있을 것이라고 알려준다.

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();
}
  • Optional : Java 8에 들어간 기능 → null로 반환할때 Optional이란 걸로 감싸서 반환하는 것을 선호
  • DB를 바꿀 수도 있기에 인터페이스로 작성한다.
  • Optional은 Null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(NullPointException)가 발생하지 않도록 도와준다.

MemoryMemberRepository.java

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))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}
  • 인터페이스를 상속받아 추상메소드를 구현하는 부분이다.
  • save를 위해 Map을 선언한다.

findById()에서는 null이 반환될 가능성이 있다면 Optional의 ofNullable을 사용하는 것이 좋다.

→ 클라이언트에서 해당 반환값을 활용할 수 있음

findByName()에서는 람다식을 써서 member에서 name을 찾아서 동일한게 있다면 해당 name을 반환하는 기능을 한다.

→ Map에서 루프를 돌려서 name을 찾는 로직

0개의 댓글