본문 바로가기
스프링/스프링 웹

[Spring] 간단한 회원 관리 시스템 만들기

by drCode 2023. 5. 19.
728x90
반응형

Servlet을 이용하여 간단한 웹 서블릿 프로그램을 만들어보려고 한다.

 

회원 관리 시스템으로,

 

회원의 정보는 이름과 나이로 저장한다.

 

요구되는 기능은 다음과 같ㅌ다.

 - 회원 저장

 - 회원 목록 조회

 

회원 도메인 Member

Member.java

package helloMVC.servlet.domain.member;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class Member {

    private Long id;
    private String username;
    private int age;

    public Member() {}

    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }
}

 

lombok을 사용하면 따로 Getter, Setter를 만들어 줄 필요가 없다.

 

회원 저장소를 만들어줘야 한다.

 

MemberRepository.java

package helloMVC.servlet.domain.member;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
 */
public class MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    private static final MemberRepository instance = new MemberRepository();

    public static MemberRepository getInstance() {
        return instance;
    }

    private MemberRepository() {}

    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    public Member findById(Long id) {
        return store.get(id);
    }

    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void clearStore() {
        store.clear();
    }
}

 

싱글톤이 적용된 Repository이다. 

 

동시성 이슈가 있을 수 있는 경우는 ConcurrentHashMap, AtomicLong 을 사용해줘야 한다.

 

싱글톤을 만들 때는 private으로 생성자를 막아야 한다.

 

기본 생성자를 넣은 이유는 ID를 DB에  

 

아무나 생성하지 못하도록 막아야 하기 때문에, 기본 생성자를 private으로 막아줘야 한다.

 

싱글톤을 썼기 때문에 변수 선언부에 static 을 쓰지 않아도 된다,

 

이렇게 회원 저장소는 싱글톤 패턴을 적용했다.

 

스프링을 사용하면 스프링 빈으로 등록하면 되지만,

 

지금은 최대한 스프링 없이 순수 서블릿 만으로 구현하는 것이 목적이다.

 

싱글톤 패턴은 객체를 단 하나만 생생해서 공유해야 하므로 생성자를 private 접근자로 막아둔다.

 

MemberRepository.java

현재 화면에서 Ctrl + Shift + T 를 누르면

 

테스트를 할 수 있는 디렉터리로 넘어가서 테스트 클래스를 만들게 된다.

 

 

MemberRepositoryTest.java

테스트 코드 작성하는 방법이 있다..

 

void test() {
    // given - 조건이 주어졌을 때
    
    // when - 주어지는 경우에 따라
    
    // then - 처리 방법을 작성
    
}

 

package helloMVC.servlet.domain.member;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

class MemberRepositoryTest {

    MemberRepository memberRepository = MemberRepository.getInstance();
    // 스프링을 쓰면 싱글톤을 쓸 필요가 없다
    // 스프링이 알아서 싱글톤을 제공해주기 때문이다.

    @AfterEach
    void afterEach() {
        memberRepository.clearStore();
    }

    @Test
    void save() {
        // given
        Member member = new Member("hello", 20);

        // when
        Member saveMember = memberRepository.save(member);

        // then
        Member findMember = memberRepository.findById(saveMember.getId());
        assertThat(findMember).isEqualTo(saveMember);


    }

    @Test
    void findAll() {

        // given
        Member member1 = new Member("member1", 20);
        Member member2 = new Member("member2", 30);

        memberRepository.save(member1);
        memberRepository.save(member2);

        // when
        List<Member> result = memberRepository.findAll();

        // then
        assertThat(result.size()).isEqualTo(2);
        assertThat(result).contains(member1, member2);
    }
}

 

여기서 Assertions 의 assertThat 이라는 static 함수가 있다.

 

Assertions.assertTha() static 메서드 import 방법

Asstions.assertThat 에 마우스를 올리면 위처럼 노란 전구가 뜨는데

 

Add on-demand static import 를 하면 된다.

 

 

 

테스트 코드 실행 결과

테스트 코드 실행 결과 모두 정상이다.

 

만약에 일치하지 않는다거나, 포함되지 않았다면 Fail이 나왔을 것이다.

728x90
반응형

댓글