스프링/0. 입문, 전체방향

7강 회원관리 예제

sdafdq 2023. 7. 6. 22:53

순서

비즈니스 요구사항 저일

회원 도메인과 리포지토리 만들기

회원 리포지토리 테스트케이스 작성

회원 서비스 개발

회원 서비스 테스트

 

비즈니스 요구사항.

데이터: 회원ID, 이름

기능: 회원 등록,조회

※현재 DB를 뭘 쓸지 선정되지 않음(가상 시나리오) 개발부터 하는 상황

 

컨트롤러:웹MVC 컨트롤러

서비스: 핵심 비즈니스 로직 구현, 회원 중복 방지 로직 등, 도메인 객체를 가지고 핵심 비즈니스 로직 구현.

도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등 데이터베이스에 저장되고 관리됨.

리포지토리: DB에 접근, 도메인 객체를 DB에 저장하고 관리.

 

도메인 객체란 여러 데이터와 동작을 갖고 있는..

그러니까 만약 사용자를 나타내는 도메인이 있을 경우

이름, 이메일, 나이와 같은 데이터와

가입, 로그인, 프로필 업데이트 같은 동작을 가지고 있음

 

그러니까, 직접적으로 DB에 저장 관리 등을 하는 객체.. 인듯?

MemberService야 당연히 있고,

MemberRepository는 아직 DB를 안정했기 때문에, 일단 인터페이스로 만듦.

먼저 MemoryMemberRepository로 간단하게 구현 해놨다가, 나중에 DB 확정되면 그 때 저 인터페이스 상속 받아 구현.

 

먼저 도메인 만듦

G:\spring\hello-spring\src\main\java\hello\hellospring\domain

public class Member {
    private Long id;
    private String  name;
}

 

그 다음 레포지토리

G:\spring\hello-spring\src\main\java\hello\hellospring\repository\MemberRepository.java

인터페이스

public interface MemberRepository {
    Member save(Member member); //멤버 저장
    Optional<Member> findById(Long id); //Id로 찾음
    Optional<Member> findByName(String name); //Name으로 찾음
    List<Member> findAll(); //모든 멤버 반환
}

Optional은 자바 8부터 추가된 기능이라고 하는데, null을 처리하는 방법이라고 함. Optional로 null을 감싸 반환한다고 하는데, 아마 보통 null로 하면 뭔가 에러같은게 있을 수 있으니 그걸 편하게 관리하려고 Optional로 한번 감싸는 듯.

 

구현

public class MemoryMemberRepository implements MemberRepository{
    private static Map<Long, Member> store = new HashMap<>(); //실무에선 동시성 문제때문에 HashMap 안쓴다 함..
    private static long sequence = 0L;   //long도 실무에선 동시성 문제때문에 잘 안쓴다고 함.

    @Override
    public Member save(Member member) {
        member.setId(++sequence);  //먼저 Id 셋팅 해주고, 이름은 넘어온 상태라고 보면 됨. 왜냐하면 고객이 쓰니까.
        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)) //찾을때까지 필터로 member.getName()해서 String name과 같은지
                .findAny();  //찾을 때 까지. 찾으면 바로 반환됨. 끝까지 안나오면 Optional에 null 붙여서 반환.
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values()); //자바에선 List 거의 씀.
    }
}

구현 끝.

 

이제 테스트 해봐야 함.

가장 쉬운게 테스트케이스 작성.

 

 

'스프링 > 0. 입문, 전체방향' 카테고리의 다른 글

9장 회원관리 서비스 구현  (0) 2023.07.07
8강 회원관리 예제 테스트  (0) 2023.07.06
6강 API 방식으로 데이터 주기  (0) 2023.07.06
5강 템플릿 엔진  (0) 2023.07.06
4. 웹개발 기초  (0) 2023.07.06