TIL - 2022

[TIL 010] 스프링부트 - 회원 도메인과 레포지토리 만들기

바랄 희 2022. 3. 19. 00:49

김영한 강사님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 듣고 작성했습니다.


1. 도메인 생성

 

도메인이란 ? 데이터베이스에 저장되고 관리되는 객체

 

도메인 패키지 내에 Member 클래스 생성함.

 

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

 

command + n 을 누르고 getter and setter 선택 및 생성

setter는 이렇게 변수의 값 대입이 여러 곳에서, 제한 없이 가능한 것을 접근 제한자로 막고, 접근 범위에 한해서 메소드로 대입전 값을 처리 후 대입되게 하기 위해 사용된다.

getter and setter 란?

getter, setter 를 이용하면 자동대로 get___ 혹은 set___ 이 생성된다. (___ 에는 필드명이 들어간다.)

이를 하는 이유는 id 와 name은 public 이 아닌 private 이다. 즉 직접 값을 할당하는 것이 아니라 메소드를 통해서 할당해야 한다. 

이렇게 해야 하는 이유는 추후에 오류를 막기 위해서이다. 

getter은 이렇게 생성된 값을 읽기 위한 메소드이다. 할당된 값이 적절하지 않은 경우가 존재할 수 있다. 예를 들어 위의 코드에서는 따로 명시하지 않았지만, cm 로 입력된 값을 km 로 바꾸어 출력해야 하는 경우에는 getter 내에서 이가 처리된다. 

 

2. 레포지토리 생성

 

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(); // ㄹㅣ스트 전부 반환
}

 

회원정보를 저장하는 저장소

interface 란?

동일한 목적 하에 동일한 기능을 보장하기 위해서 쓴다.

implements ___ 를 이용하여 클래스 내에서 이를 사용할 수 있다. 

optional 이란?

null 예외처리를 간단하게 할 수 있도록 해준다. java 8부터 도입됨.

해당 값에 null 이 들어오더라도 NullPointerException 을 통해서 처리가 가능하다.

 

3. 레포지토리 생성

 

이는 위의 인터페이스를 상속한다.

implement 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 #1번
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(),member);
        return member;
    }

    @Override #2번
    public Optional<Member> findById(Long id) {
        //optional은 null 이어도 감쌀 수 있도록 해줌.
        return Optional.ofNullable(store.get(id));
    }

    @Override #3번
    public Optional<Member> findByName(String name) {
        store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny(); //optional로 반환됨.
    }

    @Override #4번
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
}

1번

Member의 id 를 저장한다. sequence 로 1 씩 증가시킨다. 

 

2번

store에서 id 값을 꺼내어 member 를 찾는다.

ofNullable 은 null을 처리해줌

 

3번 

람다와 스트림을 이용하여 파라미터의 name 과 member의 name 이 같은지 확인하고, 같은 경우에만 반환

 

4번

전부를 리스트로 반환한다. 

 

람다에 대해서는 공부해봐야겠다..