๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒท Spring/Spring MVC_1

[Spring] ๊น€์˜ํ•œ ์Šคํ”„๋ง MVC_ ์„น์…˜4. ์„œ๋ธ”๋ฆฟ, JSP, MCVํŒจํ„ด(1)

by ._.sori 2025. 7. 1.

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

 

 

์„น์…˜ 4๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํšŒ์›๊ด€๋ฆฌ ์›น์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์„œ๋ธ”๋ฆฟ์œผ๋กœ ํ•ด๋ณด๊ณ  JSP, SpringMVC๋ฅผ ์ฐจ๋ก€๋กœ ์‚ดํŽด๋ดค๋‹ค. ์„œ๋ธ”๋ฆฟ๊ณผ JSP๋กœ ๋งŒ๋“  ์ฝ”๋“œ์—๋Š” ์–ด๋–ค ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋Š”์ง€, SpringMVC๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋ฉฐ ์„œ๋ธ”๋ฆฟ๊ณผ JSP์˜ ๋ฌธ์ œ์ ์„ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ–ˆ๋Š”์ง€ ์‚ดํŽด๋ดค๋‹ค.

 

 

โ˜˜๏ธ 

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค 


 

โœ”๏ธ  ํšŒ์› ๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ

  • ํšŒ์› ๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ username๊ณผ age๋ฅผ ์ •๋ณด๋กœ ๊ฐ€์ง„๋‹ค.
  • ํšŒ์› ์ €์žฅ๊ณผ ํšŒ์› ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

 

โ–บ  Memeber.class

@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;
    }
}
Member ํด๋ž˜์Šค์—์„œ getter, setter๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž Member์—๋Š” username๊ณผ age๋ฅผ ๋‹ด๋Š”๋‹ค. id๋Š” ์‹๋ณ„์ž๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ €์žฅํ•  ๋•Œ ๋ฐœ๊ธ‰๋œ๋‹ค. 

 

 

Q. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“  ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

A. ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ–๋Š” ์ƒ์„ฑ์ž ์™ธ์— ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“  ์ด์œ ๋Š” JSON ๋ณ€ํ™˜์ด๋‚˜ ์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด๋ฅผ ์ž๋™ ์ƒ์„ฑํ•  ๋•Œ ๊ผญ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž๋ฐ”๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜๋„ ์•ˆ๋งŒ๋“ค๋ฉด ์•Œ์•„์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทผ๋ฐ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒฝ์šฐ ์ž๋ฐ”๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋‚ด๋ถ€์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๋•Œ ํ•ญ์ƒ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋„ ๊ฐ™์ด ๋งŒ๋“œ๋Š” ์Šต๊ด€์„ ๋‘๋ฉด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.

 

 

 

โ–บ  MemeberRepository.class

private static Map<Long, Member> store = new HashMap<>();
id๊ฐ€ ํ‚ค๊ฐ€ ๋˜๊ณ  Member(๋ฐ์ดํ„ฐ, ๊ฐ์ฒด)๊ฐ€ ๊ฐ’์ด ๋œ๋‹ค. ๋“ค์–ด์˜จ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด HashMap์„ ์‚ฌ์šฉํ•œ๋‹ค. HashMap์ด ํ‚ค-๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 
private static long sequence = 0L;

public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }
Member ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ์ž Member๋Š” username๊ณผ age๋ฅผ ๊ฐ€์ง€๋„๋ก ์ •์˜ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ uesername๊ณผ age๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ ์ •๋ณด๊ฐ€ Member ํƒ€์ž…์œผ๋กœ ํฌ์žฅ๋œ๋‹ค. Member ํƒ€์ž…์œผ๋กœ ํฌ์žฅ๋œ ๊ฑธ save์—์„œ ์ €์žฅํ•œ๋‹ค. save๊ฐ€ ์ž‘๋™ํ•˜๋ฉด member.setId(++sequence)์œผ๋กœ ์ธํ•ด 0L์ด ์ฆ๊ฐ€ํ•˜์—ฌ id์— ์ฆ๊ฐ€ํ•œ ๊ฐ’์ด ์ƒˆ๋กœ ์„ธํŒ…๋œ๋‹ค. ๊ทธ ํ›„ ์ €์žฅ์†Œ์ธ store์— ์ฆ๊ฐ€ํ•œ id ๊ฐ’์„ ๊บผ๋‚ด์„œ key ๊ฐ’์œผ๋กœ ์ฃผ๊ณ , member(์ด๋ฆ„๊ณผ ๋‚˜์ด ๋ฐ์ดํ„ฐ)๋ฅผ value๋กœ ๋„ฃ๋Š”๋‹ค.

 

 

- return ์ •๋ฆฌ

 

2. return

๐Ÿชฝ"ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊น€์˜ํ•œ ์„ ์ƒ๋‹˜์˜ Spring MVC 1์„ ์œ„์ฃผ๋กœ ๊ณต๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค." โ–ถ MemberRepositoyTest.class (๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ)Member member1 = new Member("hello", 20);Member member2 = new Member("spring", 10);Member save

post-this.tistory.com

 

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

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

public void clearStore() {
        store.clear();
    }
findById ๋ฉ”์„œ๋“œ๋Š” id๋ฅผ ์ฃผ๊ณ  id์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. findAll ๋ฉ”์„œ๋“œ๋Š” store์— ์žˆ๋Š” values์˜ ๊ฐ’์„ ArrayList ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ชฉ๋ก์˜ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ArrayList๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. clearStore ๋ฉ”์„œ๋“œ๋Š” store๋ฅผ ์ง€์›Œ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋กœ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

โ–บ  MemeberRepositoryTest.class

 

@afterEach

: ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ›„ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋œ๋‹ค.

@AfterEach
    void afterEach() {
        memberRepository.clearStore();
    }
ํ…Œ์ŠคํŠธ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ์ €์žฅํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

 

 

asserThat( ).contains( )

: ์ค‘๋ณต๊ณผ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๊ฐ’๋“ค์ด ์žˆ์œผ๋ฉด ๋œ๋‹ค.

assertThat(result).contains(member1, member2);
member1๊ณผ member2๊ฐ€ result์— ์žˆ์œผ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•œ๋‹ค.

 

 

 

 


 

 

 

 

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

  • ์„œ๋ธ”๋ฆฟ์œผ๋กœ ํšŒ์› ๋“ฑ๋ก HTML ํผ์„ ๋งŒ๋“ค์ž.

 

โ–บ  MemeberSaveServlet.class

  • ํ•œ ๋ช…์˜ ํšŒ์›๋งŒ ๋ณด์ธ๋‹ค.
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));

Member member = new Member(username, age);
System.out.println("member = " + member);
memberRepository.save(member);

request๋ฅผ ํ†ตํ•ด username๊ณผ age์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ getParameter๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ •์ˆ˜ํ˜•์ธ age๋Š” Integer.parseInt๋กœ ๋ฌธ์ž์—ด๋กœ ๋ฐ›์•„์˜จ ๊ฐ’์„ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ”๊ฟ” age์— ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ member์— ๋„ฃ์€ ํ›„ save ๋ฉ”์„œ๋“œ๋กœ store์— ์ €์žฅํ•œ๋‹ค.

 

"<ul>\n" +
"    <li>id="+member.getId()+"</li>\n" +
"    <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" +
"</ul>\n" +

์ฝ”๋“œ๋กœ ๋™์  ํ™”๋ฉด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. get์„ ํ†ตํ•ด ์ €์žฅ๋์„ ๋ฐ์ดํ„ฐ์˜ id, username, age๋ฅผ ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ํ•œ๋‹ค.

 

 

 

โ–บ  MemeberListServlet.class

  • ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
List<Member> members = memberRepository.findAll();
findAll ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ €์žฅ๋œ ๋ชจ๋“  ํšŒ์›์„ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ชจ๋“  ๋ชฉ๋ก์„ ๊บผ๋‚ด๋ฉฐ ํฌ๊ธฐ๋Š” ๋™์ ์œผ๋กœ ์กฐ์ ˆ๋˜๋„๋ก ํ•˜๊ธฐ์œ„ํ•ด List๋กœ ์„ค์ •ํ•œ๋‹ค.
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>");
        }

for๋ฌธ์„ ํ†ตํ•ด List๋กœ ๊ฐ€์ ธ์˜จ members๋ฅผ member์— ๋„ฃ์–ด ์ถœ๋ ฅ์‹œํ‚จ๋‹ค. ์ด๋ ‡๊ฒŒ ์„œ๋ธ”๋ฆฟ๊ณผ ์ž๋ฐ” ์ฝ”๋“œ๋งŒ์œผ๋กœ HTML์„ ๋งŒ๋“ค์—ˆ๋”๋‹ˆ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค. ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ HTML ๋ฌธ์„œ์—์„œ ํ•„์š”ํ•œ ๊ณณ๋งŒ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

 

 

 

 


 

 

 

 

โœ”๏ธ  JSP๋กœ ํšŒ์› ๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

  • JSP๋กœ ํšŒ์› ๋“ฑ๋ก HTML ํผ์„ ๋งŒ๋“ค์ž.

 

โ–บ  new-form.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
JSP ๋ฌธ์„œ๋ผ๋Š” ๋œป์„ ์ฒซ ์ค„์— ์ ์–ด์ค˜์•ผํ•œ๋‹ค.
<form action="/jsp/members/save.jsp" method="post">
    username: <input type="text" name="username" />
    age: <input type="text" name="age" />
<button type="submit">์ „์†ก</button>

 

ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ์  ์žˆ๋‹ค๋ฉด ๋งค์šฐ ์œ ์‚ฌํ•˜์—ฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. action์— ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ๊ณ  method์— ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹์„ ์ ์–ด์ค€๋‹ค. ์•ž ์‹œ๊ฐ„์— ๋ฐฐ์› ๋“ฏ์ด GET ๋ฐฉ์‹๊ณผ POST ๋ฐฉ์‹, API JSON ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ ์–ด๋ณด๋‚ด๋Š” post ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค. 

 

 

 

โ–บ  save.jsp

 <%
      MemberRepository memberRepository = MemberRepository.getInstance();

      System.out.println("MemberSaveServlet.service");
      String username = request.getParameter("username");
      int age = Integer.parseInt(request.getParameter("age"));

      Member member = new Member(username, age);
      System.out.println("member = " + member);
      memberRepository.save(member);
 %>
<% %> ๋Š” JSP ํƒœ๊ทธ๋กœ ์ด ์•ˆ์— ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ์— request์™€ response๊ฐ€ ์—†๋Š”๋ฐ, service๋Š” jsp ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ ์ฝ”๋“œ์— ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ service ๋กœ์ง์„ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
<%=%>๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ํ˜ธ์ถœ(์ถœ๋ ฅ)ํ•˜๋Š” JSP ํƒœ๊ทธ์ด๋‹ค.  ์—ฌ์ „ํžˆ ์ž๋ฐ” ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•„ ์ž‘์—…์ด ๋ณต์žกํ•˜๊ฒŒ ๋ณด์ธ๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ ๋ณต์žกํ•œ ์ฝ”๋“œ๋Š” ์œ ์ง€๋ณด์ˆ˜๋„ ์–ด๋ ต๋‹ค.