Spring boot 간단한 회원 리포지토리 만들기

·2021년 11월 4일
0

SpringBoot

목록 보기
3/5
post-custom-banner

본 게시물은 인프런 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 듣고 개인 공부용으로 작성하였습니다.

일반적인 웹 애플리케이션 계층 구조

컨트롤러: 웹 MVC의 컨트롤러 역할
서비스: 핵심 비즈니스 로직 구현 ex)회원은 중복 가입이 안된다.
리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
도메인: 비즈니스 도메인 객체를 주로 데이터베이스에 저장하고 관리

리포지토리를 인터페이스로 설계하면 데이터 저장소를 나중에 선정하여 구현 클래스를 변경하는 것이 가능하다
이 인터페이스에 회원 저장, 회원 id,이름 찾기 기능을 구현한다.
실제 구현체는 MemoryMemberRepository이다.

✔MemberRepository.java

package hello.hellospring.repository;

import hello.hellospring.controller.domain.Member;
import java.util.List;
import java.util.Optional;

public interface MemberRepository {
    Member save(Member member); //회원 저장 후 반환
    Optional<Member> findById(Long id); //null일경우 처리하기 위해 optional사용
    Optional<Member> findByName(String name);
    List<Member> findAll(); //저장된 모든 회원 리스트 반환
}

✔MemoryMemberRepository.java

package hello.hellospring.repository;

import hello.hellospring.controller.domain.Member;
import java.util.*;

//MemberRepository를 implements해야한다.
public class MemoryMemberRespository implements MemberRepository {
    private static Map<Long,Member> store=new HashMap<>();
    private static long sequence =0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence); //id 세팅시 sequence값 하나 올려주기
        store.put(member.getId(), member); //Map에 저장
        return member; //저장된 결과 반환
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id)); //결과가 null일수 있으니 ofNullable 사용
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream().filter(member->member.getName().equals(name)).findAny();
        //member.getname이 파라미터로 넘어온 name이랑 같은지 확인 후 같으면 반환
        //findAny()로 하나 찾을때까지 찾기
    }

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

위 코드 private static Map<Long,Member> store=new HashMap<>()에서 HashMap()은 간단한 예제여서 사용하는 함수고, 실무에서는 동시성 문제가 있어서 공유되는 변수일 경우 AtomicLong과 같은 타입을 사용한다고 한다. 작년 운영체제 수업을 들을때 간접적으로 배운 부분이다. 멀티 스레드에서 critical section에 접근할때 배타적인 접근 즉 상호배제해야한다.
이런 내용과 관련된 함수이지 않을까 싶다. 재밌다ㅎㅎ 역시 이론보단 실전이다.

profile
중요한 건 꺾여도 다시 일어서는 마음
post-custom-banner

0개의 댓글