5. 회원 관리 예제 - 웹 MVC 개발

doriskim·2024년 2월 28일
0

MemberController를 통해서 회원을 등록하고 조회할 수 있도록 만들어보자

화면 웹 기능 - 홈 화면 추가

HomeController.java

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/") //처음 localhost:8080으로 들어오면
    public String home(){
        return "home"; //home.html 호출
    }
}

home.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div>
        <h1>Hello Spring</h1> <p>회원 기능</p>
        <p>
            <a href="/members/new">회원 가입</a>
            <a href="/members">회원 목록</a> </p>

    </div>
</div> <!-- /container -->
</body>
</html>

※ 참고
welcome page로 띄워주는 것엔 우선순위가 있다.
이전에 공부한 것에선 static의 index.html이 welcome page이었음. 왜 위의 코드는 home.html을 welcome page로 띄울 수 있을 까?
localhost:8080 요청이 오면 먼저 controller에서 홈 화면에 매핑된 url이 있는지 찾아본다. 있으면 해당 controller가 호출되고 끝나고 기존 index.html(정적 리소스)는 무시된다. 없으면 index.html를 띄워준다.

화면 웹 기능 - 등록

회원 등록하는 controller를 만들어보자.
MemberController.java

package hello.hellospring.controller;

import 생략

@Controller
public class MemberController {

    private MemberService memberService;

    @Autowired
    public void setMemberService(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping("/members/new") //http의 get방식으로 '/members/new'로 이동하면 다음이 매핑됨
    public String createForm() {
        return "members/createMemberForm";//view resolver를 통해 템플릿의 members/createMemberForm이 선택되고 thumeleaf 템플릿 엔진에 렌더링함
    }

    @PostMapping("/members/new") //http의 post방식으로 '/members/new'로 이동하면 다음이 매핑됨
    public String create(MemberForm form){
        Member member = new Member();
        member.setName(form.getName());//name이 private이므로 setName을 통해 getName으로 꺼낸 이름을 등록하기

        memberService.join(member);

        return "redirect:/"; //회원가입 끝나면 home화면으로 보내기
    }
}

MemberForm.java

package hello.hellospring.controller;

public class MemberForm {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

createMemberForm.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <form action="/members/new" method="post">
        <div class="form-group">
            <label for="name">이름</label>
            <input type="text" id="name" name="name" placeholder="이름을 입력하세요">
        </div>
        <button type="submit">등록</button> </form>
</div> <!-- /container -->
</body>
</html>

이름에 'spring'을 적고 등록 버튼을 누르면 어떤 일이 발생할까

<form action="/members/new" method="post">에서 post방식으로 MemberController의 @PostMapping으로 넘어와 create()가 호출된다.

createMemberForm.html의<input type="text" id="name" name="name" placeholder="이름을 입력하세요">name="name" 과 MemberForm.java의 private String name;이 매칭되면서 name값이 들어온다.

setName을 통해 getName으로 꺼낸 이름을 등록하고 join시킨다.

이후 home화면으로 되돌아간다.

※ PostMapping, GetMapping
같은 url(/members/new) 일지라도 post, get 장식에 따라 호출되는 함수가 달라진다.
보통 @PostMapping은 데이터를 form같은데 넣어서 등록할 때 주로 사용하고,
@GetMapping은 데이터를 조회할 때 주로 사용한다.

화면 웹 기능 - 조회

여기선 thymeleaf 템플릿 엔진이 본격적으로 동작한다.

MemberController.java

package hello.hellospring.controller;

import 생략

@Controller
public class MemberController {

    private MemberService memberService;

	...

    @GetMapping("/members")
    public String list(Model model){
        List<Member> members = memberService.findMembers(); //멤버 다 꺼내기
        model.addAttribute("members", members); //멤버 리스트 자체를 모델에 담아서 화면(뷰템플릿)에 넘기기
        return "members/memberList";

    }
}

memberList.html

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div>
        <table>
            <thead>
            <tr>
                <th>#</th>
                <th>이름</th> </tr>
            </thead>
            <tbody>
            <tr th:each="member : ${members}"> //$는 모델 안의 값을 꺼내는 것, members에 모든 회원이 담겨있으므로 각각 돌면서(th:each) 반복된다.
                <td th:text="${member.id}"></td>
                <td th:text="${member.name}"></td>
            </tr>
            </tbody>
        </table>
    </div>
</div> <!-- /container -->
</body>
</html>

회원 가입에서 'spring1', 'spring2'를 등록해주고 회원 목록을 들어가보면 다음과 같이 나온다.


위 소스를 보면 tr태그 부분에서 thymeleaf 템플릿 엔진이 렌더링 한 결과를 볼 수 있다.

현재는 메모리 안에 데이터를 저장했으므로 서버를 다시 키면 데이터가 다 지워지게 된다.

0개의 댓글