๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์ธํ”„๋Ÿฐ - ์Šคํ”„๋ง MVC 1ํŽธ] ์„œ๋ธ”๋ฆฟ์œผ๋กœ ํšŒ์› ๊ด€๋ฆฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

by YeonBu 2024. 5. 20.
728x90

 

 

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

 

์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ  | ๊น€์˜ํ•œ - ์ธํ”„๋Ÿฐ

๊น€์˜ํ•œ | ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“  ์›น ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง MVC์˜ ํ•ต์‹ฌ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต

www.inflearn.com

 

 

 

 

 

 

1. ์š”๊ตฌ์‚ฌํ•ญ ์ •๋ฆฌ

 

ํšŒ์› ์ •๋ณด : ์ด๋ฆ„(username), ๋‚˜์ด(age)

๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ : ํšŒ์› ์ €์žฅ, ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ

 

 

ํšŒ์› ๋„๋ฉ”์ธ ๋ชจ๋ธ

@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๋ฅผ ํšŒ์› ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ฉด ํšŒ์› ์ €์žฅ์†Œ๊ฐ€ ํ• ๋‹นํ•ด์ค€๋‹ค

 

 

ํšŒ์› ์ €์žฅ์†Œ

public class MemberRepository {

    private 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();
    }
}

 

 - ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๊ณ ๋ ค๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ์‹ค๋ฌด์—์„œ๋Š” ConcurrentHashMap, AtomicLong ์‚ฌ์šฉ ๊ณ ๋ ค

 - instance๋Š” MemberRepository ํด๋ž˜์Šค์˜ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋กœ static๊ณผ final๋กœ ์„ ์–ธ๋˜์–ด 

   ํด๋ž˜์Šค ๋กœ๋“œ ์‹œ ๋”ฑ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ. ์ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด Singleton ํŒจํ„ด์ด ๊ตฌํ˜„๋จ

 - getInstance ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ MemberRepository์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

 - MemberRepository ์ƒ์„ฑ์ž๋ฅผ private๋กœ ์„ ์–ธํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ

 

 

ํšŒ์› ์ €์žฅ์†Œ ํ…Œ์ŠคํŠธ

class MemberRepositoryTest {

    MemberRepository memberRepository = MemberRepository.getInstance();

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

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

        // When
        Member savedMember = memberRepository.save(member);

        //Then
        Member findMember = memberRepository.findById(savedMember.getId());
        assertThat(findMember);
    }


    @Test
    void findAll() {
        // Given
        Member member1 = new Member("member1", 20);
        Member member2 = new Member("member2", 25);

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

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

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

}

 

 

 

 

2. ์„œ๋ธ”๋ฆฟ์œผ๋กœ ํšŒ์›๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

 

 

ํšŒ์› ๋“ฑ๋ก ํผ

@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/member/new-form")
public class MemberFormServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @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\">์ „์†ก</button>\n" +
                "</form>\n" +
                "</body>\n" +
                "</html>\n");
    }
    
}

 

 

ํšŒ์› ์ €์žฅ

@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.parseInt(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" +
                "</head>\n" +
                "<body>\n" +
                "์„ฑ๊ณต\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>");
    }
    
}

 

 - MemberSaveServlet์˜ ๋™์ž‘์ˆœ์„œ๋Š”

   1. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐํšŒํ•ด์„œ Member ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค

   2. Member ๊ฐ์ฒด๋ฅผ MemberRepository๋ฅผ ํ†ตํ•ด ์ €์žฅํ•œ๋‹ค

   3. Member ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฒฐ๊ณผ ํ™”๋ฉด์šฉ HTML์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์‘๋‹ตํ•œ๋‹ค.

 

 

ํšŒ์› ๋ชฉ๋ก ์กฐํšŒ

@WebServlet(name = "memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet 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>");
        w.write("<head>");
        w.write(" <meta charset=\"UTF-8\">");
        w.write(" <title>Title</title>");
        w.write("</head>");
        w.write("<body>");
        w.write("<a href=\"/index.html\">๋ฉ”์ธ</a>");
        w.write("<table>");
        w.write(" <thead>");
        w.write(" <th>id</th>");
        w.write(" <th>username</th>");
        w.write(" <th>age</th>");
        w.write(" </thead>");
        w.write(" <tbody>");
        for (Member member : members) {
            w.write(" <tr>");
            w.write(" <td>" + member.getId() + "</td>");
            w.write(" <td>" + member.getUsername() + "</td>");
            w.write(" <td>" + member.getAge() + "</td>");
            w.write(" </tr>");
        }
        w.write(" </tbody>");
        w.write("</table>");
        w.write("</body>");
        w.write("</html>");

    }
}

 

์ €์žฅ๋œ ํšŒ์› ๋ชฉ๋ก ํ™•์ธ

 

 

 * ์ง€๊ธˆ๊นŒ์ง€ ์„œ๋ธ”๋ฆฟ๊ณผ ์ž๋ฐ” ์ฝ”๋“œ๋งŒ์œผ๋กœ HTML์„ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ์—์„œ ๋ณด๋“ฏ ์ด๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ๋น„ํšจ์œจ ์ ์ธ

   ์ฝ”๋“œ์ด๋‹ค. ์ž๋ฐ” ์ฝ”๋“œ๋กœ HTML์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ ๋ณด๋‹ค HTML ๋ฌธ์„œ์— ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜

   ์žˆ๋‹ค๋ฉด ๋” ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

   ๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” JSP๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด๋ณด์ž.

 

 

 

๋ฐ˜์‘ํ˜•