8. 웹 MVC 개발, 회원관리 예제

    목표는 간단한 웹 MVC 개발을 통해 Spring에 친숙해지고자 한다.

    비즈니스 요구 사항 정리


    1. 데이터 : 회원 ID, 이름
    2. 기능 : 회원 등록 및 조회 
    3. 아직 데이터 저장소가 선정되지 않음

     

     

    일반적인 Web Application의 계층 구조


    • 도메인 : 회원, 주문, 쿠폰처럼 DB에 저장 관리되는 비즈니스 도메인 객체
    • 서비스 : 비즈니스 도메인 객체를 가지고 핵심 비즈니스 로직이 동작하도록 구현함
    • 컨트롤러 : 웹 MVC의 컨트롤러 역할
    • 리포지토리 : DB에 접근함. 도메인 객체를 DB에 저장 관리한다.

     

    설계 구조


    Repository는 Interface로 설계를 한다. 왜냐하면 아직 DB가 결정되지 않았기 때문에 어떤 방식으로 데이터를 저장해야하는지 정할 수 없기 때문이다. 따라서, 메모리 레벨에서 리포지토리 인터페이스를 구현한 다음에 DB가 만들어지면 옮겨지는 방식으로 접근해야한다. 일반적으로 데이터를 바꿔끼우려면 인터페이스가 필요하기 때문이다.

     

    1. Member Domain 생성하기

    Main 폴더에 "domain" 패키지를 만든 후, Member Domain을 먼저 생성한다. Member는 다음 변수와 메서드를 가진다.

    • ID와 이름 멤버변수를 가진다.
    • 멤버변수에 대한 Getter, Setter를 가진다.
    package hello.hellospring.domain;
    
    public class MemberAgain {
        Long id;
        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;
        }
    }

     

    2. Member Repository 생성하기

    현재 어떤 DB를 사용할지 결정이 되지 않았다. 따라서 MemberRepository Interface를 만들고, 그 Interface를 구현한 구현체인 MemoryMemberRepository를 "repository" Package에 만든다.

    MemberRepository Interface의 메서드 정의는 다음과 같다.

    • 멤버 인스턴스를 저장한다
    • 멤버 인스턴스를 ID로 찾아온다.
    • 멤버 인스턴스를 이름으로 찾아온다.
    • 모든 멤버 인스턴스를 보여준다.
    package hello.hellospring.repository;
    
    import hello.hellospring.domain.MemberAgain;
    
    import java.util.List;
    
    public interface MemberRepositoryAgain {
    
        MemberAgain saveAgain(MemberAgain memberagain);
        Optional<MemberAgain> fidnByIdAgain(Long id);
        Optional<MemberAgain> findByNameAgain(String name);
        List<MemberAgain> findAllAgain();
    
    }

    구현체에 대한 내용은 다음과 같다.

    • ID와 이름을 Key, Value 형식으로 관리한다. 현재 ID를 관리하는 멤버변수를 가진다. 하나로 관리할 것이기 때문에 Static으로 관리한다.
    • findById, FindByNameAgain, FindAllAgain을 구현한다.
    package hello.hellospring.repository;
    import hello.hellospring.domain.MemberAgain;
    import java.util.*;
    
    public class MemoryMemberRepositoryAgain implements MemberRepositoryAgain {
    
        // DB를 Memory내의 Hash Map 형태로 관리한다.
        private static Map<Long, MemberAgain> storeAgain = new HashMap<>();
        private static Long sequentialAgain = 0L;
    
        // Member를 저장하면 ID를 부여하고, 그 ID에 대해 멤버를 저장한다.
        @Override
        public MemberAgain saveAgain(MemberAgain memberagain) {
            memberagain.setId(++sequentialAgain);
            storeAgain.put(memberagain.getId(), memberagain);
            return memberagain;
        }
    
    	// iD로 특정 멤버를 찾는다. 특정 멤버가 없을 수도 있기 때문에 Optional로 Null 처리를 한다.
        @Override
        public Optional<MemberAgain> fidnByIdAgain(Long id) {
            return Optional.ofNullable(storeAgain.get(id));
        }
    
    	// 이름으로 특정 멤버를 찾는다. 특정 멤버가 없을 수도 있기 때문에 Optional로 Null 처리를 한다.
        
        @Override
        public Optional<MemberAgain> findByNameAgain(String name) {
    
            return storeAgain.values().stream()
                    .filter(memberAgain -> memberAgain.getName().equals(name))
                    .findAny();
        }
        
        // 멤버들을 리스트에 담아서 돌려준다. 
        @Override
        public List<MemberAgain> findAllAgain() {
            return new ArrayList<>(storeAgain.values());
        }
    }

    댓글

    Designed by JB FACTORY