본문 바로가기
BackEnd/Spring

[스프링 입문] 회원 관리 예제 - 웹 MVC 개발

by 개발 Blog 2024. 7. 1.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

인프런 스프링 입문 (김영한)

 

 

회원 웹 기능 - 홈 화면 추가

컨트롤러와 html을 추가했다.

 

HomeController

package hello.hello_spring.controller;

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

@Controller
public class HomeController {
    @GetMapping("/")
    public String home() {
        return "home";
    }
}
  • @GetMapping을 이용해서 "/"를 연결시킨다. "/"는 도메인의 첫 번째 주소다.
  • 이후 "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>

그리고 실행 후 localhost:8080에 접속하면 아래와 같은 화면이 뜬다.

1. 이전 시간에 welcome page로 index.html이라는 파일을 작성 했는데 home.html이 작동한 이유

  • 웹 브라우저에서 요청이 오면 스프링 컨트롤러안에 관련 컨트롤러가 있는지 먼저 찾고 없으면 static 파일을 찾는다.
  • localhost:8080 요청이 오면 관련 Controller에서 매핑된 html이 있는지 찾는다.
  • 매핑된 url이 있기 때문에 home.html이 호출되고 끝이 난다. 따라서 기존의 index.html은 무시된다.

 

회원 웹 기능 - 등록

회원 가입 버튼을 눌렀을 때 회원가입 form이 뜨고, 이름을 입력했을 때 등록이 되는 기능을 만들 것이다.

그러기 위해 2가지 파일을 만들고(MemberForm, createMemberForm.html)

기존 컨트롤러에(MemberController) 코드를 추가할 것이다.

@Controller
public class MemberController {

    private final MemberService memberService;

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

    @GetMapping("/members/new")
    public String createForm() {
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/";
    }
}
  • 기존에 작성했던 home.html의 회원가입 url이 /members/new 이기 때문에 @GetMapping에 "/members/new"를 매핑한다.
  • 그리고 리턴으로 createMemberForm을 호출한다.
  • url에 직접 주소를 치는 것을 GET 방식이라고 한다. (조회)
  • 데이터를 폼 같은 곳에 넣어서 전달할 때 POST 방식을 사용한다.
  • createMemberForm.html에서 post방식으로 값이 넘어오면 @PostMapping("/members/new")에 매핑된다.
  • MemberForm의 name을 Member 객체에 저장하고 join으로 등록한다.
  • 등록이 되면 "redirect:/"를 통해 localhost:8080화면으로 돌아간다.

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>
  • 화면에서 이름 입력 후 등록 버튼을 누르면 "/members/new"에 "post" 방식으로 넘어간다.
  • 위에 작성한 MemberController @PostMapping 에 매핑된다.

localhost:8080에 접속 후 회원가입을 누르면 /members/new 화면으로 이동한다.

회원 등록하는 틀은 완성이 됐다. 이제 컨트롤러를 작성해보자

package hello.hello_spring.controller;

public class MemberForm {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • MemberForm의 String name이 createMemberForm.html의 name ="name"에 매칭이 된다.

 

회원 웹 기능 - 조회

회원 목록을 눌렀을 때 등록했던 회원들의 목록이 보이는 기능을 만들 것이다.

home.html에서 회원 목록을 누르면 "/members"로 이동하도록 작성했다.

따라서 컨트롤러에 이렇게 코드를 추가한다.

 

MemberController

  @GetMapping("/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }
  • @GetMapping("/members")로 매핑해 주고 memberService.findMembers()를 통해 받은 값을 List에 담는다.
  • model.addAttribute함수를 이용하여 "members" 키에 매핑되는 값을 members 리스트 객체에 담는다.
  • return으로 memberList를 반환해 준다. -> templates/members 패키지의 memberList.html을 찾는다.

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}">
                <td th:text="${member.id}"></td>
                <td th:text="${member.name}"></td>
            </tr>
            </tbody>
        </table>
    </div>
</div> <!-- /container -->
</body>
</html>
  • members 리스트를 순회하면서 각 'member' 객체의 id와 name을 출력한다.
  • th:each는 Thymeleaf의 반복문을 위한 속성으로 ${members} 리스트의 각 요소를 member 변수로 참조하여 테이블 행 'tr'을 생성한다.
  • ${members}는 컨트롤러에서 뷰로 전달된 데이터를 참조한다. 
  • 이를 통해 서버에서 전달된 데이터를 동적으로 HTML에 삽입할 수 있다.

회원목록

 

저장된 회원의 목록을 볼 수 있다. 하지만 지금은 메모리에 데이터가 있기 때문에 서버를 껐다가 다시 실행하면 데이터가 초기화되기 때문에 파일이나 DB에 저장을 해야 한다.  다음 시간에 DB에 저장하는 과정을 진행해 볼 것이다.