본 게시물은 인프런 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 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에 접근할때 배타적인 접근 즉 상호배제해야한다.
이런 내용과 관련된 함수이지 않을까 싶다. 재밌다ㅎㅎ 역시 이론보단 실전이다.