웹 MVC 개발 - 홈 화면, 등록, 조회 그리고 정적 컨텐츠

myeonji·2022년 1월 25일
0

Spring

목록 보기
5/22

Welcome Page

스프링 부트가 제공하는 기능 중에 Welcome Page가 있습니다.

resources - static - index.html 파일을 만들면 이 파일은 Welcome page 기능을 하게 됩니다.

즉, 이 파일은 localhost:8080에 들어가면 나오는 첫 화면이 되는 것입니다.

정적 컨텐츠

웹 브라우저에서 localhost:8080 요청이 들어오면 스프링 컨테이너에서 먼저 찾고, 없으면 그 다음에 resources: static(정적 컨텐츠) 에서 찾습니다.

HelloController에 매핑된 부분이 없다면 resources: static에서 index.html 파일을 찾게 되겠지만, HelloController에 매핑된 부분이 있다면 resources: static는 찾지 않습니다.

찾는 순서가 첫 번째는 스프링 컨테이너, 두 번째가 resource: static (정적 컨텐츠)이기 때문입니다.

즉, 컨트롤러가 정적 파일보다 우선순위가 높습니다!

홈 화면

< HomeController >

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

위의 코드를 보면 요청이 들어왔을 때 가장 먼저 찾는 HelloController에 매핑 된 부분이 있으니 이것이 호출되고, 정적 resources에 있는 것들은 무시가 됩니다. 따라서 return 의 home.html이 보여질 것입니다.

등록

< MemberController >

@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:/";
    }

url 을 localhost:8080/members/new로 들어오면 @GetMapping에 매핑이 됩니다. 따라서 return이 템플릿에서 members 디렉토리에 있는 createMemberForm.html로 가는 것을 알 수 있습니다.

< createMemberForm.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>

input 태그를 자세히 뜯어보면, type="text"는 text를 입력할 수 있는 박스를 만든 것이고 name="name"은 서버로 넘어올 때의 key가 됩니다. 따라서 등록 버튼을 누르면 form 태그에 있는 "/members/new" 로 post 형식으로 보내집니다.

따라서 위의 MemberController에서 @PostMapping에 매핑이 되어 해당 메소드가 호출됩니다. @PostMapping 부분을 보면 데이터를 전달 받는 객체가 MemberForm 으로 받고 있습니다. 이는 MemberForm 객체를 따로 생성하여 이 객체를 통해 데이터를 받는 것입니다.

< MemberForm >

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

조회

< MemberController >

@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}">
 <td th:text="${member.id}"></td>
 <td th:text="${member.name}"></td>
 </tr>
 </tbody>
 </table>
 </div>
</div> <!-- /container -->
</body>
</html>

이 파일에서는 thymeleaf라는 템플릿 엔진이 동작을 하는데 컨트롤러에서 model 로 넘어온 "members" 안에는 모든 회원이 리스트로 담겨있습니다. 따라서 th:each="member : ${members}" 를 통해 모든 회원이 반복을 돌면서 th:text를 통해 id와 name을 출력하는 것입니다.

이렇게 간단한 예시로 웹 MVCModel, View, Controller에 대해 공부해보았습니다.

0개의 댓글