스프링 회원관리-1

윤재열·2022년 1월 30일
0

Spring

목록 보기
1/72

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

1. domain 패키지에 Member클래스 생성

package hello.hellospring.domain;

public class Member {

    private Long id;	//시스템이 저장하는 아이디
    private String name;

    // private 변수에 대한 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;
    }
}
  • domain 폴더를 만들고 그 안에 Member모델을 작성해줄 클래스를 선언합니다.
  • 여기서는 Member에 대해 아이디,이름 2가지를 만들고 각각에 대한 getter,setter를 만들어 줍니다.

    여기까지는 그렇게 어렵진 않았다. 다만 그동안 JAVA를 배울 때는 Long 자료형을 안써서 생소할뿐...

2. repository패키지에 MemberRepository 인터페이스 생성

package hello.helllospring.repository;
import hello.helllospring.domain.Member;
import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save (Member member);    //회원을 저장소에 저장
    Optional<Member> findById(Long id); // id로 회원을 찾는다.(Optional사용)
    Optional<Member> findByName(String name);   //이름으로 회원을 찾는다.(Optional사용)
    List<Member> findAll(); //지금까지 저장된 모든 리스트들을 반환
}
  • Repository에 4가지 기능을 만듬

Optional이 null로 반환될 수 있으니까 Optional로 감싸서 반환하는걸 처음보았다.

3. repository패키지에 MemberRepository인터페이스로 MemoryMemberRepository 클래스 생성

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;

import java.util.*;

@Repository
public class MemoryMemberRepository implements MemberRepository {
    // 만들었던 MemberRepository interface를 implements -> 아래에 MemberRepository의 메서드 틀들을 가져옴. 여기선 모두 가져옴

    // Member를 저장해주기 위해 Map 사용, 실무에서는 동시성 문제로 concurrent HashMap(?) 씀. 여기선 단순히 HashMap
    // Key 타입은 Long, Value 타입은 Member,따라서 K타입 파라미터는 Long,V타입 파라미터는 Member이 된다.
    private static Map<Long, Member> store = new HashMap<>();
    // 0, 1, 2... 이렇게 key값 생성용, 실무에선 동시성 문제로 atom long..(?)해주긴함
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);	// member가 입력될때마다 sequence가 1씩 증가
        store.put(member.getId(), member);	//store에 객체 추가
        return member;	
    }

    @Override
    public Optional<Member> findById(Long id) {
        // 결과가 없는 경우 (null)을 위해 Optional로 감쌈 -> 클라이언트에서 어떻게 처리가 가능하게 됨.
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny(); // findAny =루프 돌다가 하나라도 찾으면 반환, 결과가 Optinal로 반환됨
                // stream과 람다식은 추후 다시 공부한걸 올려야겠다.
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); // store에 있는 values(Member)를 전부 반환
    }

    // 테스트시 각자의 테스트가 서로에 영향을 끼치지 않게 하기 위해 메모리를 클리어해줌
    public void clearStore() {
        store.clear();
    }
}
  • Optional이란?
    -Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 래퍼 클래스입니다
    -명시적으로 해당 변수가 null일 수도 있다는 가능성을 표현할 수 있습니다. (따라서 불필요한 방어 로직을 줄일 수 있습니다.)
    -Optional.ofNullable(value)
    👉null인지 아닌지 확신할 수 없는 객체를 담고 있는 Optional 객체를 생성합니다. Optional.empty()와 Optional.ofNullable(value)를 합쳐놓은 메소드라고 생각하시면 됩니다. null이 넘어올 경우, NPE(NullPointExceoption)를 던지지 않고 Optional.empty()와 동일하게 비어 있는 Optional 객체를 얻어옵니다. 해당 객체가 null인지 아닌지 자신이 없는 상황에서는 이 메소드를 사용하셔야 합니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글