MapleStory Cookie With Halo

☕ JAVA/☕ Library & Pattern

[JAVA]HttpServlet 이용해 회원관리 웹 애플리케이션 만들기

뉴이 NUEY 2025. 2. 28. 14:34
반응형
기본 환경 구성

 

  1. 스프링부트 만들기
    2025.02.27 - [☁ Network/🌏 HTTP] - [HTTP]HttpServlet 사용해보기 환경설정부터

  2. 폴더
  3. 프로젝트 생성시 만들어진 기본클래스에  @ServletComponentScan  을 추가한다.
  4. domain
  5. Repository
    💡 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려

Domain 코드

더보기
package hello.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;
    }
}

Repository 코드

더보기
package hello.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();
    }
}

test 코드

더보기
package hello.domain.member;

import java.util.List;

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

import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;

class MemberRepositoryTest {

    MemberRepository memberRepository = MemberRepository.getInstance();

    @AfterEach
    void AfterEach() {
        memberRepository.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);

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

        //then
        List<Member> result = memberRepository.findAll();
        
        assertThat(result.size()).isEqualTo(2);
        assertThat(result).contains(member1, member2);
    }
    
    
}

 


 

※ HttpServlet 사용법은 이전 글 참고

2025.02.27 - [☁ Network/🌏 HTTP] - [HTTP]HttpServlet 사용해보기 환경설정부터

그 외에 HettpServlet에 관한 설명은 [HTTP]카테고리에서 확인 가능합니다.

 

  1. 신규저장
    더보기
    package hello.servlet.web.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form")
    public class MemberFormServlet extends HttpServlet {
        
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
    
            PrintWriter w = response.getWriter();
            w.write("<!DOCTYPE html>\n" + 
                    "<html>\n" + 
                    "<head>\n" +
                        "<meta charset=\"UTF-8\">\n" +
                        "<title>Title</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                        "<form action=\"/servlet/members/save\" method=\"post\">\n" +
                            "username: <input type=\"text\" name=\"username\" />\n" +
                            "age: <input type=\"text\" name=\"age\" />\n" +
                            "<button type=\"submit\">save</button>\n" +
                        "</form>\n" +
                    "</body>\n" +
                    "</html>\n");
        }
    }
  2. 저장
    더보기
    package hello.servlet.web.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import hello.servlet.domain.member.Member;
    import hello.servlet.domain.member.MemberRepository;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
    public class MemberSaveServlet extends HttpServlet {
    
        private MemberRepository memberRepository = MemberRepository.getInstance(); 
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("MemberSaveServlet.service");
            String username = request.getParameter("username");
            int age = Integer.valueOf(request.getParameter("age"));
    
            Member member = new Member(username, age);
            memberRepository.save(member);
    
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
    
            PrintWriter w = response.getWriter();
            w.write("<html>\n" + 
                    "<head>\n" +
                        "<meta charset=\"UTF-8\">\n" +
                        "<title>Title</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                        "save success\n" +
                        "<ul>\n" +
                            "    <li>id=" + member.getId() + "</li>\n" +
                            "    <li>username=" + member.getUsername() + "</li>\n" +
                            "    <li>age=" + member.getAge() + "</li>\n" +
                        "</ul>\n" +
                        "<a href=\"/index.html\">메인</a>\n" +
                    "</body>\n" +
                    "</html>\n");
        }
    }
  3. 회원목록
    더보기
    package hello.servlet.web.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    import hello.servlet.domain.member.Member;
    import hello.servlet.domain.member.MemberRepository;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    @WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
    public class MemverListServlet extends HttpServlet {
    
        private MemberRepository memberRepository = MemberRepository.getInstance(); 
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            List<Member> members = memberRepository.findAll();
    
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
    
            PrintWriter w = response.getWriter();
            w.write("<html>\n" + 
                    "<head>\n" +
                        "<meta charset=\"UTF-8\">\n" +
                        "<title>Title</title>\n" +
                    "</head>\n" +
                    "<body>\n" +
                        "<a href=\"/index.html\">메인</a>\n" +
                        "<table>\n" +
                        "    <thead>\n" +
                        "        <th>id</th>\n" +
                        "        <th>username</th>\n" +
                        "        <th>age</th>\n" +
                        "    </thead>\n" +
                        "    <tbody>\n");
                            for (Member member : members) {
                            w.write("        <tr>\n" +
                                "            <td>" + member.getId() + "</td>\n" +
                                "            <td>" + member.getUsername() + "</td>\n" +
                                "            <td>" + member.getAge() + "</td>\n" +
                                "        </tr>\n");
                            }
                        w.write("    </tbody>\n" +
                    "</table>\n" +
                    "</body>\n" +
                    "</html>\n");
        }
    }
  4. 결과물

※ 참조 : https://www.inflearn.com/roadmaps/373

반응형