본문 바로가기
Spring Tutorial

[스프링MVC 16] 회원 관리 웹 애플리케이션

by 미소5 2023. 7. 24.
  • 회원 관리 웹 애플리케이션 요구사항
    • 회원 정보
      • 이름: username
      • 나이: age
    •  기능
      • 회원 저장
      • 회원 목록 조회

 

회원 관리 웹 애플리케이션을 서블릿, JSP, MVC 패턴 순으로 구현해보자.

 


 

  • 회원 도메인 모델
/**회원 도메인 모델*/

@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;
        //id는 Member를 회원저장소(DB)에 저장하면 회원저장소가 할당
    }
}
  • id 는 Member를 회원 저장소에 저장하면 회원 저장소가 할당

 

 

  • 회원 저장소
/*
 * 동시성 문제가 고려되어 있지 않음
 * 실무에서는 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();
    }
}
  • 회원 저장소는 싱글톤 패턴을 적용했다. (스프링을 사용하면 싱글톤 쓸 필요없이 스프링 빈으로 등록하면 되지만, 지금은 최대한 스프링 없이 순수 서블릿만으로 구현하는 것이 목적) 싱글톤 패턴은 객체를 단 하나만 생성해서 공유해야 하므로 생성자를 private 접근자로 막아둔다.
  • static
    • 회원 저장소가 많아져도 store와 sequence는 하나만 생성된다!

 

 

  • 회원 저장소 테스트
class MemberRepositoryTest {
    MemberRepository memberRepository = MemberRepository.getInstance();
    //회원 저장소는 싱글톤 패턴을 적용했으므로, new MemberRepository 하면 안됨

    @AfterEach  //각 테스트가 끝날 때, 다음 테스트에 영향을 주지않도록
    void afterEach() {
        memberRepository.clearStore();
        //각 테스트의 저장소를 clearStore()를 호출해 초기화
    }

    @Test
    void save() { //회원 저장
        //given
        Member member = new Member("hello", 20);
        //when
        Member savedMember = memberRepository.save(member);
        //then
        Member findMember = memberRepository.findById(savedMember.getId());
        assertThat(findMember).isEqualTo(savedMember);
    }

    @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); //clearStore()안하면 3
        assertThat(result).contains(member1, member2);
    }
}
  • 회원을 저장하고, 목록을 조회하는 테스트를 작성

 

 


[스프링MVC 17] 서블릿으로 회원 관리 웹 애플리케이션 (tistory.com)

 

[스프링MVC 17] 서블릿으로 회원 관리 웹 애플리케이션

서블릿으로 회원 관리 웹 애플리케이션을 만들어보자. MemberFormServlet 단순하게 회원 정보를 입력할 수 있는 HTML Form을 만들어 응답 /**회원 등록 폼*/ @WebServlet(name="memberFormServlet", urlPatterns = "/servlet

joly156.tistory.com

 

 



[Spring 입문3] 회원 관리 예제- 백엔드 개발 (tistory.com)

 

[Spring 입문3] 회원 관리 예제- 백엔드 개발

컨트롤러: 웹 MVC의 컨트롤러 역할 서비스: 핵심 비즈니스 로직 구현 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등

joly156.tistory.com


[Java 필수 기초 지식] 접근제어자 (tistory.com)

 

[Java 필수 기초 지식] 접근제어자

제어자= 접근제어자(public, protected, private) +그외 static, final, abstract 등등 클래스와 클래스의 멤버에 부가적인 의미 부여한다 하나의 대상에 여러 제어자 같이 사용 가능하나, 접근제어자는 1개만!

joly156.tistory.com


[스프링 MVC 2] 웹 애플리케이션 이해: 서블릿 (tistory.com)

 

[스프링 MVC 2] 웹 애플리케이션 이해: 서블릿

HTML Form 데이터 전송 예시 POST 전송 - 저장 이름이랑 나이의 값을 전송하면, HTML Form을 url은 /save, 방식은 post로 데이터(이름이랑 나이의 값)을 전달(저장) 웹브라우저가 그림과 같은 HTTP 요청 메시

joly156.tistory.com


 

728x90
반응형