SPRING 핵심 원리 [ 기본편 ]

[스프링 핵심 원리] 섹션 2.4 예제만들기 (회원 도메인 개발)

wlalsu_u 2023. 1. 24. 14:30

2.4.0  회원 도메인 설계

 

 

 

앞선 섹션 2.3의 회원 도메인 설계를 바탕으로 회원 도메인을 개발해보자.

 

다음의 인터페이스와 클래스들을 하나씩 만들어보고자 한다.

 

 

 

 

출처 : 김영한 - spring 핵심 원리 - 기본편

 

 

 

 


 

 

2.4.1  회원 서비스 개발

 

 

 

먼저, 회원 서비스를 개발하기 전에, 회원 등급을 생성해보자.

 

 

 

main  >  java  >  hello.core  에 member 패키지를 생성하고,

 

Grade 이름의 enum 파일을 생성한다.

 

 

 

 

package hello.core.member;

public enum Grade {
    BASIC,
    VIP
}

 

 

 

public enum Grade

 

 

: 회원 등급은  BASIC / VIP 2가지로 나뉜다.

 

 

 

 


 

 

 

다음으로, 회원 정보를 담고 있는 Member 클래스를 만들어보자.

 

 

member 패키지 아래에 Member 클래스를 생성하고, 다음과 같이 작성한다.

 

 

 

 

package hello.core.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;
    }

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

 

 

 

 

id / name / grade

 

 

: 회원 속성인 id , name, grade 를 private 필드로 생성한다.

 

 

 

Member 생성자

 

 

 

Getter and Setter

 

 

: 데이터를 가져오고 사용할 수 있도록 get 과 set 메소드를 생성한다.

 

( window 의 경우 Alt + insert 를 이용하여 자동 생성 가능)

 

 

 

 


 

 

 

이제, 실제 회원 서비스 인터페이스를 개발해보자.

 

member 패키지MemberService 인터페이스를 생성하고, 다음과 같이 작성한다.

 

 

 

회원 서비스는 다음 2가지 기능만 만족하면 된다.

 

 

 

 

package hello.core.member;

public interface MemberService {

    void join(Member member);

    Member findMember(Long memberId);
}

 

 

void join(Member member)

 

 

: 회원 가입을 하는 join 메소드를 작성한다.

 

 

 

Member findMember(Long memberId);

 

 

: 회원 아이디를 이용하여 회원 객체를 조회하는 메소드를 작성한다.

 

 

 

 


 

 

 

 

다음으로 MemberService 인터페이스를 구현하는 MemberServiceImpl 클래스를 작성해보자.

 

동일하게, member 패키지 아래에 생성하고, 다음과 같이 작성한다.

 

 

 

 

( 인터페이스와 구현체를 다른 패키지에 두는 것이 설계상 좋지만, 간단히 작성하기 위해 같은 패키지에 작성하였다.)

 

 

 

 

package hello.core.member;

public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

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

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

 

 

 

public class MemberServiceImpl implements MemberService

 

 

: MemberService 인터페이스를 구현하도록 하였다.

 

 

 

 

private final MemberRepository memberRepository = new MemoryMemberRepository();

 

 

: 회원을 찾기 위해 MemberRespository 인터페이스를 사용한다.

 

: 인터페이스만 사용하면 널 포인트 exception 이되므로, MemoryMemberRepository 구현체를 사용하도록 한다. 

 

 

 

 

memberRepository.save(member)

 

 

: 회원가입의 경우, memberRepository 에 회원 객체를 저장하도록 한다.

 

 

 

 

return memberRepository.findById(memberId)

 

 

: 회원 조회의 경우, memberRepostiory 에서 회원 Id 를 이용하여 회원 객체를 찾는다. 

 

 

 

 


 

 

2.4.2  회원 저장소 개발

 

 

 

다음으로 MemberRepository 인터페이스를 작성해보자.

 

member 패키지 아래에 MemberRepository 파일을 생성하고 다음과 같이 작성한다.

 

 

 

package hello.core.member;

public interface MemberRepository {

    void save(Member member);

    Member findById(Long memberId);
}

 

 

 

void save (Member member)

 

 

: 회원객체를 저장할 수 있는 save 메소드를 작성한다.

 

 

 

Member findById(Long memberId)

 

 

: 회원 아이디를 이용하여 회원 객체를 찾는 메소드를 작성한다.

 

 

 

 

 


 

 

 

 

다음으로 MemberRepository 인터페이스를 구현하는 MemoryMemberRepository 클래스를 작성해보자.

 

 

 

 

어떤 DB 를 사용할지 아직 확정되지 않았지만, 개발은 진행해야 하므로,

 

가장 단순한 메모리 회원 저장소를 구현하는 것이다.

 

 

 

 

동일하게, member 패키지 아래에 생성하고, 다음과 같이 작성한다.

 

 

 

 

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


}

 

 

 

 

public class MemoryMemberRepository implements MemberRepository

 

 

: MemberRepository 인터페이스를 구현하는 MemoryMemberRepository 를 생성한다.

 

 

 

 

private static Map<Long, Member> store = new HashMap<>()

 

 

: 회원 객체를 저장할 수 있는 Map 을 생성한다.

 

( + 참고 : HashMap 은 실무에서 동시성 이슈가 발생할 수 있으므로, ConcurrentHashMap 을 이용하는 것이 좋다. )

 

 

 

 

store.put(member.getId(), member)

 

 

: 회원 id 와 회원 객체를 저장하는 save 메소드를 구현한다.

 

 

 

 

return store.get(memberId)

 

 

: 간단하게 회원 아이디를 이용하여 객체를 반환하도록 한다.

 

 

 

 

 

 

 

+ 추가 )
DB 확정이 되지 않아, MemoryMemberRepository 를 만들어 개발을 진행했지만,
메모리는 서버를 껐다 켜면 모든 데이터가 사라지므로 테스트 용으로만 사용가능하다.

 

 

 

 

 

 

 

 

김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8