2.4.0 회원 도메인 설계
앞선 섹션 2.3의 회원 도메인 설계를 바탕으로 회원 도메인을 개발해보자.
다음의 인터페이스와 클래스들을 하나씩 만들어보고자 한다.
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 를 만들어 개발을 진행했지만,
메모리는 서버를 껐다 켜면 모든 데이터가 사라지므로 테스트 용으로만 사용가능하다.
김영한 '스프링 핵심 원리 - 기본편' 강의를 기반으로 작성하였습니다.
'SPRING 핵심 원리 [ 기본편 ]' 카테고리의 다른 글
[스프링 핵심 원리] 섹션 2.6 예제만들기 (주문과 할인 도메인 설계) (0) | 2023.01.24 |
---|---|
[스프링 핵심 원리] 섹션 2.5 예제만들기 (회원 도메인 실행과 테스트) (0) | 2023.01.24 |
[스프링 핵심 원리] 섹션 2.3 예제만들기 (회원 도메인 설계) (0) | 2023.01.24 |
[스프링 핵심 원리] 섹션 2.2 예제만들기 (비즈니스 요구사항과 설계) (0) | 2023.01.24 |
[스프링 핵심 원리] 섹션 2.1 예제만들기 (프로젝트 생성) (0) | 2023.01.24 |