오늘은 순수 자바 코드로 간단한 회원 관리 시스템을 구현해볼 거예요!
저는 인텔리제이를 사용하고 있습니다. :)
📌 프로젝트 구조
📌 Grade.java (회원 등급)
회원 등급은 일반 등급과 VIP 등급으로 나누었어요.
왜냐하면 추후에 등급에 따른 할인 정책을 적용할 예정이기 때문이죠.
package hello.core.member;
public enum Grade {
BASIC,
VIP
}
📌 Member.java (회원 객체)
회원은 간단하게 이름, id, 등급을 멤버 변수로 가질 거예요.
Getter 및 Setter를 사용하여 값에 접근이 가능합니다.
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;
}
// 해당 메소드를 통해서 private의 값 세팅 가능
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;
}
}
📌 MemberRepository.java (회원 저장소 인터페이스)
회원을 저장하고 회원 id로 회원 찾기가 가능하도록 인터페이스를 구현합니다.
Save() -> 회원 저장
findById -> ID로 회원 찾기
package hello.core.member;
public interface MemberRepository {
// 회원 저장
void save(Member member);
// 회원 id로 회원 찾기
Member findById(Long memberId);
}
📌 MemoryMemberRepository.java (메모리 저장소 구현체)
회원 정보를 HashMap에 저장
store.put(id, member) → 회원 저장
store.get(id) → 회원 조회
package hello.core.member;
import java.util.HashMap;
import java.util.Map;
public class MemoryMemberRepository implements MemberRepository {
// 저장소
// HashMap 사용 시 동시성 이슈가 있을 수 있음 => 여러 곳에서 접근 시
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);
}
}
⚠️ 문제점
여기서 HashMap을 사용했는데, HashMap의 경우 여러 스레드에서 동시에 접근하면
동시성 이슈가 있을 수 있습니다. 따라서 추후에 ConcurrentHashMap을 사용하는 것을 권장드립니다.
지금은 정말 간단하게 구현할 것이기 때문에 HashMap을 사용했습니다.
📌 MemberService.java (회원 서비스 인터페이스)
회원 가입 및 조회 기능을 제공하는 인터페이스를 만듭니다.
package hello.core.member;
public interface MemberService {
void join(Member member);
Member findMember(Long memberId);
}
📌 MemberServiceImpl.java (회원 서비스 구현체)
(비즈니스 로직 담당)
join() → 회원 저장
findMember() → 회원 조회
package hello.core.member;
// 구현체가 한 개만 있을 때는 인터페이스 명 뒤에 Impl 많이 씀.
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);
}
}
⚠️ 문제점
구현체를 직접 생성 (new MemoryMemberRepository())
→ 향후 DBMemberRepository 등을 추가하면 수정해야 함.
Spring을 적용하면 DI(의존성 주입)으로 해결 가능
📌 MemberApp.java
지금까지 작성했던 코드를 실행할 클래스입니다.
회원을 저장하고, 회원을 찾고, 회원 가입한 이름과 조회한 회원의 이름을 출력하는 코드입니다.
package hello.core;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
public class MemberApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
해당 코드를 실행하면 저장된 회원과 조회한 회원이 일치하는 것을 확인할 수 있습니다.
해당 코드가 잘 작동하는지 테스트를 해보겠습니다.
기존에 코드를 작성하던 main 디렉토리 말고 test 디렉토리에서 테스트를 할 수 있습니다.
저는 MemberServiceTest 라는 이름으로 테스트용 java 클래스를 생성했어요.
📌 MemberServiceTest.java (JUnit 테스트)
회원 가입 및 조회 테스트
Assertions.assertThat(member).isEqualTo(findMember());로 회원 가입 및 조회 검증
package hello.core.member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
//given
void join() {
Member member = new Member(1L, "memberA", Grade.VIP);
// when
memberService.join(member);
Member findMember = memberService.findMember(1L);
// then (검증하는 api)
Assertions.assertThat(member).isEqualTo(findMember);
}
}
해당 테스트 파일을 실행하면 실행이 잘 되는 것을 확인할 수 있습니다.
2탄에서는 간단한 할인 정책을 추가해보도록 하겠습니다!
[Java] 회원 관리 시스템 구현하기 - 2탄
오늘은 지난번에 간단하게 구현했던 회원 관리 시스템에서 할인 정책을 추가할 거예요. 앞서 구현한 1탄 먼저 보고 와주세요! [Java] 회원 관리 시스템 구현하기 - 1탄오늘은 순수 자바 코드로 간
zero-talk.tistory.com
'☁️ 구름 x 카카오 Deep Dive 풀스택 > Java' 카테고리의 다른 글
[Java] 회원 관리 시스템 구현하기 - 2탄 (1) | 2025.02.05 |
---|---|
[Java] 문자열 처리 과정에 있어서 메모리 사용랑과 처리 속도 효율적으로 하기 (0) | 2025.01.14 |