본문 바로가기
TIL/Java | Spring Boot

[Spring Boot] 회원 관리 예제 - 웹 MVC 개발

by yeon_zoo 2022. 1. 11.

스프링 부트 강의를 들으면서 수업 내 다루는 예제들을 따라해 보는 중이다. 지난 블로그에서 작성했던 스프링 빈 등록까지 마친 후 회원 관리 기능을 웹 페이지로도 보여주는 MVC 개발 단계이다. 

 

 

먼저 홈 컨트롤러를 추가해준다. 

package hello.hellospring.controller;


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

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(){
        return "home";
    }
}

하는 역할은 localhost:8080/ 이 주소로 요청이 들어왔을 때 home.html 이라는 파일을 띄워주는 역할이다. 

그리고 home.html 파일을 templates 폴더 아래에 생성해주고 다음 코드를 넣어 작성해준다. 

<!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>

 

완성된 홈화면은 다음과 같다.

이제 members/new 의 회원 가입 페이지와 /members 의 회원 목록 페이지를 각각 생성해주면 된다. 참고로 이 예제에서 이전에 정적 컨텐츠와 MVC와 템플릿 엔진, API를 비교하는 간단한 예제를 하면서 localhost:8080/ 기본 url에 hello.html을 연결해준 적이 있다. 하지만 스프링에서는 컨테이너 안에 존재하는 컨트롤러를 먼저 방문한 뒤에 해당 요청에 대한 별 다른 정보가 없으면 정적 컨텐츠로 이동하기 때문에, 여기서는 컨트롤러가 작동했다.


1. members/new 의 회원 가입 페이지 만들기

이 기능은 member과 관련한 기능이니, MemberController 파일에서 작업한다. 다음과 같이 우선 회원가입 창을 리턴해줄 수 있는 url을 설정해준다. 

package hello.hellospring.controller;

...

@Controller
public class MemberController {

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

그리고 templates 폴더 하에 members 라는 폴더를 생성해 준 후에 members 폴더 아래에 createMemberForm.html 을 생성해준다.

그리고 해당 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>

그리고 나서 서버를 재시작하여 기본 화면에서 회원 가입을 클릭하면, form 이 생성된 화면을 확인할 수 있다.

이 다음은 폼을 제출했을 때 (위 사진에서 등록 버튼을 눌렀을 때) post 요청이 오면서 데이터를 우리의 DB(현재는 메모리)에 등록하는 과정이다. 먼저 웹 등록 화면에서 데이터를 전달받을 폼 객체를 생성해준다.

 

package hello.hellospring.controller;
public class MemberForm {
	private String name;
 
	public String getName() {
		return name;
 	}
	public void setName(String name) {
		this.name = name;
	}
}

다음 코드를 MemberController의 메소드로 추가해주면 된다. 

@PostMapping("/members/new")
    public String createMember(MemberForm form) { //Memberform의 name 속성과 input 태그의 이름이 name인 것을 찾고 setName을 이용해서 매칭해줌.
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/";
    }

createMember에 param으로 받는 MemberForm은 스프링에서 알아서 input 태그의 이름이 name 인 것을 찾아 연결해 준다. (장고에서는 이걸 직접 해줬어야 했어서 좀 신기한 기능이긴 하다) 그리고 나서 Member 객체에 새로 저장을 하고, 전에 만들었던 회원 가입 기능 join을 이용해서 memberService에 등록해준다. 그리고 나서 "redirect:/" 해주면 폼으로부터 post 요청을 처리한 후 홈 화면으로 다시 이동한다.

 


2. 회원 전체 조회 페이지 만들기

memberController에 회원 전체 조회 페이지 요청이 들어왔을 때를 생성해줘야 한다. 아래 코드를 추가해준다.

@GetMapping("/members")
    public String list(Model model){
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }

memberService에서 만들어뒀던 findMembers()를 이용하면 쉽게 전체 회원을 조회할 수 있다. 조회된 리스트 객체를 addAttribute를 통해 "members"라는 이름으로 화면에 넘겨준다. 그리고 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>

템플릿 문법을 사용해서 각 멤버의 아이디와 이름이 각각 들어가 있다. each="member : ${members}" 같은 부분은 thymeleaf에서 제공하는 템플릿 문법을 사용한 것으로 자바나 다른 언어의 for each 문과 같은 역할을 한다. ${member.id}를 보면 Member 객체의 id 속성은 private이라 여기서 접근할 수 없는데? 하는 의문이 들 수 있다. 이것도 thymeleaf에서 제공되는 문법으로 member.id 를 치면 member.getId 가 실행되어 가져올 수 있다고 한다. 마찬가지로 member.name도 가져왔다.

 

이렇게 구성한 프로젝트를 실행시켜보면

이런 결과를 얻을 수 있다! 다만, 지금 현재는 DB가 아닌 컴퓨터의 메모리 구현체를 사용하고 있기 때문에 서버를 껐다가 키면 내가 입력한 모든 회원 정보가 리셋된다.. 아마 이 다음 블로그가 DB를 메모리가 아닌 진짜 DB를 사용하는 것과 관련한 내용이 아닐까 싶다!

댓글