goosegoose.DRAM
article thumbnail

비즈니스 요구사항 정리 

  • 데이터 : 회원ID, 이름
  • 기능 : 회원 등록, 조회
  • 아직 데이터 저장소가 선정되지 않음 (가정)

 

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

출처 : 인프런-김영한-스프링입문-코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

  • 컨트롤러 : 웹 MVC읭 컨트롤러 역할
  • 서비스 : 핵심 비즈니스 로직 구현
  • 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
  • 도메인 : 비즈니스 도메인 객체, ex) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됌.

 

클래스 의존 관계

 

출처 : 인프런-김영한-스프링입문-코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

  • 아직 데이터 저장소가 선정되지 않아서 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
  • 데이터 저장소는 RDB, NoSQL, 등등 다양한 저장소를 고민중인 상황으로 가정
  • 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용.

 

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

domain(package : 생성) - Member(class) 생성. id, name 변수 생성 뒤 alt+insert를 통해 getter, setter 생성.

package hello.hellospring.domain;

public class Member {

    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;
    }

    private Long id; //시스템이 지정해주는 값.
    private String name;

}

repository(package 생성 : 저장소, 회원 객체를 저장)  - MemberRepository(interface)생성 <- 기능 메서드 구현

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);  // id로 회원찾기 기능
    Optional<Member> findByName(String name); // 이름으로 회원 찾기 기능

    // Optional findById나 findByName을 실행했을 때, 가져온 값이  Null 일 수도 있음
    // Null 값을 처리할 때 Optional로 감싸서 처리하는 방법을 더 선호.

    List<Member> findAll(); // 저장된 모든 회원 list 반환.
}

repository(package: 사용) - MemoryMemberRepository(생성 후 MemberRepository 상속) - 기능 구현

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<>(); // save 메소드 실행 시 저장 용도
    private static long sequence = 0L; //sequence == 0,1,2.. 처럼 key 값을 생성해 주는 역할
    
    @Override
    public Member save(Member member) {
        member.setId(++sequence); // sequence 값 하나 올리기
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id)); // 만약 결과가 없을 경우(Null)를 고려해 Optional로 감쌈 
    }

    @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());
    }
}

잘 동작하는 지 확인하지 위해 testcase를 작성. test - java - 

 

profile

goosegoose.DRAM

@goosesong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!