관리 메뉴

100세까지 코딩

[스프링 입문] 회원 도메인과 리포지토리 만들기 본문

백엔드/스프링 입문

[스프링 입문] 회원 도메인과 리포지토리 만들기

100세까지 코딩 2023. 12. 1. 16:44
 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

출처 : 김영한님의 스프링 입문

회원 도메인
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 클래스
 

[자바 공부] 형 변환 함수 차이 (parseXXX, valueOf, toString)

한눈에 정리 함수 설명 Integer.parseXXX() 기본 타입인 int 타입을 반환. Integer.valueOf() Integer 래퍼 객체를 반환. toString() 대상이 null이면 Null PointException(NPE)를 발생. String.valueOf() 대상이 null이면 문자열

sjd0219.tistory.com