[TIL 010] 스프링부트 - 회원 도메인과 레포지토리 만들기
김영한 강사님의 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 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번
전부를 리스트로 반환한다.
람다에 대해서는 공부해봐야겠다..