100세까지 코딩
[스프링 입문] 회원 도메인과 리포지토리 만들기 본문
출처 : 김영한님의 스프링 입문
회원 도메인
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;
}
}
회원 레포지토리 인터페이스
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();
}
인터페이스 사용 이유
1. 메소드의 구현 및 이름을 강제하여 협업시 표준화를 유도할 수 있다.
2. 교체 용이 : 클래스를 개발해서 이름만 교체하면 된다. 다른 로직 변경 X
3. 다중 상속
Optional
1. Optinoal<T> 클래스를 사용하여 NPE(NullPointerException)을 방지할 수 있다.
2. null이 올 수 있는 값을 Wrapper 클래스로 감싸서 NPE가 발생하지 않는다.
3. 각종 메소드를 제공해준다.
3-1. Optinoal.ofNullable() - 값이 Null일수도 아닐수도 있다.
Optional.empty() - 값이 Null이다.
Optional.of() - 값이 Null이 아니다. (null을 넣으면 NPE 발생)
회원 레포지토리
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());
}
public void clearStore(){
store.clear();
}
}
static 변수 사용 이유
1. static이 붙은 필드나 메서드는 '클래스의 소유'가 된다.
2. 어떤 클래스를 가지고 인스턴스를 무한히 생성하더라도 static은 클래스에 단 하나 존재한다.
3. 서비스나 컨트롤러, 테스트에서 인스턴스를 만들더라도 static 변수는 공동으로 사용한다.
4. 또한 애플리케이션이 시작되고 종료될 때까지 오로지 단 한번만 생성된다.
cleatStore() 생성 이유
이후 게시될 테스트케이스 작성 게시글에서 설명.
wrapper 클래스
'백엔드 > 스프링 입문' 카테고리의 다른 글
[스프링 입문] 회원 서비스 개발 (0) | 2023.12.02 |
---|---|
[스트링 입문] 회원 리포지토리 테스트 케이스 작성 (0) | 2023.12.01 |
[스프링 입문] 웹 개발 기초 (1) | 2023.11.28 |
[스프링 입문] 윈도우 명령 프롬프트에서 Gradle 빌드 (0) | 2023.11.27 |
[우테코] 종합 피드백 (0) | 2023.11.26 |