[3-2] 회원 도메인과 리포지토리 만들기

ohun·2022년 5월 16일
0

Spring 입문

목록 보기
8/16

Member

main.java.hello.hellospring 아래에 domain 패키지 생성 후 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 관련
  • 시스템이 지정하는 (Long)id 와 회원의 (String)name 값 설정한다.

MemberRepository

main.java.hello.hellospring 아래에 repository 패키지 생성 후 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 은 null 값을 감싸는 방법 중 하나. id, email 이 null 값일 경우 대비
    Optional<Member> findByName(String name);
    List<Member> findAll();                     // 지금까지 찾은 모든 list 반환
}
```
  • 저장소. 먼저 Interface 를 이용해서 저장, ID 및 Name 검색, 모든 리스트 반환
  • 그 중 검색에서 반환값이 null 일 경우 Java8 부터 도입된 Optional 로 감싸는 것이 트렌드

MemoryMemberRepository

repository 패키지 아래 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()  // stream(): Java8 부터 지원, 컬렉션과 배열 등 저장된 요소들을 하나씩 참조하며 반복적인 처리 가능
                .filter(member -> member.getName().equals(name))    //  람다 사용, member 에서 name 을 가져와서 입력된 name과 비교
                .findAny();     //  하나라도 찾으면 return
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); //  member 는 Map 인데 반환값 List임. 걍 ㄱㄱ.
    }
}
```
  • 위에서 작성한 인터페이스를 implements 하고 모든 메소드를 포함해서 자세하게 구현한다.
  • 먼저 save 메소드의 경우 메모리 저장 메소드니까 Map 을 사용해서 저장. key = Long(회원 id), value = Member.
  • (Map) 클래스 import 단축키? : [control]+[space] / : [option]+[Enter]
  • 그리고 store 로 설정, HashMap 으로 지정(일단 따라하기)
  • sequence 설정(long 은 L 붙여서 선언). 시퀀스는 자동으로 키 값(0, 1, 2, ...) 생성해주는 것
  • save 메소드 구현
    • id를 자동으로 시퀀스 올려서 설정
    • store 에 put 해서 Map 에 저장
    • 결과 반환
  • findById 메소드 구현
    • store 에서 아이디를 가져와서 반환하는데, 이 때 Optional.ofNullable() 로 감싸줘서 null 값이 나올 경우 대비한다. 이렇게 하면 클라이언트에서 뭔가 할 수 있음(뒤에서~)
  • findByName 메소드 구현
    • stream() : Java8 부터 지원, 컬렉션과 배열 등 저장된 요소들을 하나씩 참조하며 반복적인 처리 가능
    • 람다 문법 사용, name 비교
    • findAny() : 하나라도 찾으면 성공, return
profile
공부 중입니다.

0개의 댓글