728x90

들어가며


안녕하세요,😎😎😎

3편에 들어서야 드디어 개발과 관련이 있는 정리글을 쓸 수 있게 되었습니다. 필수 아닌 필수(?)라서 기술 블로그를 시작했는데 생각보다 많이 어렵네요,,,

그래도 하루 한 편을 목표로 취업할때까지는 꾸준히 작성해보겠습니다.!

 

회원 도메인 설계


  1. 회원 도메인 요구사항
  2. 회원을 가입하고 조회할 수 있다.
  3. 회원은 일반과 VIP 두 가지 등급이 있다.
  4. 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)

클라이언트는 가입과 조회 서비스를 요청할 수 있으며, 멤버 데이터를 저장하고 조회하는 기능을 추상화하여 인터페이스를 통해 정의하고, 이를 구현하는 구체적인 클래스를 통해 실제 기능을 구현하고 사용할 수 있도록 합니다.

회원 클래스 Member Class


가장 기초적인 회원 도메인에 대한 클래스는 멤버 변수/ 생성자/ 게터 및 세터로 구성됩니다.

  1. 멤버 변수는 private로 작성하여 외부로부터 접근을 차단합니다.
  2. 생성자는 멤버 객체를 생성할 때 초기화하는 역할을 합니다.
  3. 게터 및 세터를 통해 외부에서 변수를 설정하고 호출할 수 있습니다.
package hello.core.member;
// Member 변수 생성
public class Member {
    private Long id;
    private String name;
    private Grade grade;
// 생성자
    public Member(Long id, String name, Grade grade) {
        this.id = id;
        this.name = name;
        this.grade = grade;
    }
//get과 set으로 변수 설정 및 호출
    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;
    }

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}

회원 서비스 인터페이스 Member Service Interface


클라이언트의 가입조회 서비스 요청

서비스 기능은 비교적 간단하다. 가입과 조회를 위해 join 메서드와 findMember 메서드를 이용했다.

그리고 가입을 위해 입력 받은 값이 어딘가 저장되어 있어야 조회도 가능할 것이다.

package hello.core.member;

public interface MemberService {
    void join(Member member);
    Member findMember(Long memberId);
}

회원 저장소 인터페이스 Member Repository Interface


멤버 데이터를 저장하고 조회하는 기능을 추상화

서비스(Service)와 저장소(Repository)를 분리하여, 각 역할을 명확하게 구분하였고 쉽게 확장이 가능하다.

package hello.core.member;

public interface MemberRepository {
    void save(Member member);
    Member findById(Long memberId);
}

구체적인 클래스 생성 MemberServiceImpl


구체적인 클래스를 통해 실제 기능을 구현 하기 위해 회원 저장소를 불변 값으로 놓고 생성자를 통해 의존성을 주입하였다. -> DI원칙에 의해 작성되었으며, 이후 다른 저장소로 교체가 용이합니다.

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    // 생성자를 통해 MemberRepository 주입
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

메모리 저장소 MemoryMemberRepository


데이터베이스가 결정되지 않았으므로, 메모리에 저장하는 방식으로 구현된 것이다.

키-값 쌍을 저장하는 자료구조인 Map을 활용하여 store 변수를 생성, 변수는 HashMap 알고리즘을 통해 초기화한다.

자료구조와 알고리즘에 대해 추가적인 공부가 필요하다..

더보기

HashMap은 해시 함수를 사용하여 빠르게 키-값 쌍을 검색하고 저장하고, TreeMap은 키를 기준으로 정렬하여 저장합니다. LinkedHashMap은 입력된 순서대로 키-값을 유지합니다.

package hello.core.member;

import java.util.HashMap;
import java.util.Map;

public class MemoryMemberRepository implements MemberRepository {


    private static Map<Long, Member> store = new HashMap<>();
    @Override
    public void save(Member member) {
        store.put(member.getId(), member);
    }

    @Override
    public Member findById(Long memberId) {
        return store.get(memberId);
    }
}

 

+ Recent posts