본문 바로가기

Java/spring

[Java/스프링 입문] 회원 관리 예제 - 웹 MVC 개발, 홈 화면 추가/등록/조회(@Controller, @GetMapping, @PostMapping)

들어가며

👨‍🔧 회원 웹 기능: 홈 화면 추가, 등록, 조회(@Controller, @GetMapping, @PostMapping)


1. 홈 화면 추가

ℹ️ 정적 콘텐츠 동작원리
1. 웹 브라우저: localhost:8080 요청이 옵니다.
2. 내장 톰캣 서버: 스프링 컨테이너에 관련 컨트롤러가 있는지 확인합니다. (@Controller)
3. 내장 톰캣 서버: 관련 컨트롤러가 없다면, 정적 콘텐츠 파일을 찾습니다. (static 폴더 내 파일, index.html)
4. 웹 브라우저: static에 있는 index.html을 렌더링합니다.

 

1) @Controller, home.html

// HomeController.java
package hello.hello_spring.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";
    }
}
  • @Controller: HomeController.class
    • 웹 브라우저에서 요청이 왔을 때, 내장 톰캣 서버에서는 스프링 컨테이너에 컨트롤러가 있는지 확인합니다.
    • 컨트롤러가 있다면 관련 Mapping된 값이 있는지 확인합니다.
  • @GetMapping("/")
    • localhost:8080으로 요청이 들어오면 본 화면이 바로 보이도록 하는 역할입니다.

 

// 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>
  • home.html
    • 매핑된 페이지: HomeController의 GetMapping("/")에 따라 home.html로 return됩니다.
    • <a href="...">: 회원 가입을 누르면 "/members/new"로 이동, 회원 목록을 누르면 "/members"로 이동합니다.

 

2) 우선순위: index.html vs. home.html

  • 지난번 정적 콘텐츠 수업 내용을 다시 떠올려보면
    • localhost:8080/hello-static 요청이 올 경우
      • 가장 먼저 스프링 컨테이너를 확인하고, (hello-static 관련 컨트롤러 無)
      • 없으면 static 파일을 찾도록 되어 있습니다. (hello-static.html)
  • 이제 위 코드에 이 개념을 대입해서 생각해 봅시다.
    • localhost:8080 요청이 올 경우
      • 가장 먼저 스프링 컨테이너를 확인하는데, Home controller에 매핑된 값이 있습니다.
        • @Controller: public class HomeController
        • @GetMapping("/"): public String home()
          => 본 컨트롤러를 호출하고 종료합니다.
      • 따라서 기존에 만들었던 static file: index.html은 무시됩니다. (위 컨트롤러 제거 시 index.html 재동작)

2. 회원 등록 폼 개발

1) @PostMapping, createMemberForm.html

// createMemberForm
<!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>
  • action="/members/new" method="post"
    • members/new가 들어오면 post 요청을 합니다.
  • input type="text" id="name" name="name"
    • text를 입력할 수 있는 input box입니다.
    • name="name" => 서버로 넘어가는 key가 됩니다.
  • 만약 input box에 'spring!'이라고 적고, 등록 버튼을 누른다면?
    • name="spring!"이 action url(/members/new)로 post 방식으로 넘어갑니다.
    • 이는 MemberController의 PostMapping으로 연결됩니다.

 

// MemberController.java
package hello.hello_spring.controller;

import hello.hello_spring.domain.Member;
import hello.hello_spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class MemberController {
    private final MemberService memberService;

    // new를 사용하지 않고 스프링 컨테이너에 등록하여 사용하자
    @Autowired // 스프링 컨텡너에서 memberService를 가져온다
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

...

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());
        memberService.join(member);
        return "redirect:/";
    }
}
// MemberForm.java
package hello.hello_spring.controller;

public class MemberForm {
    private String name;

    public String getName(){
        return name;
    }
    public String setName(String name){
        this.name = name;
        return name;
    }
}
  • @PostMapping("/members/new")
    • PostMapping으로 넘어오면 create 메소드가 호출됩니다.
  • create 메소드
    • MemberForm.java에 있는 name에 creatMemberForm.html에서 입력한 spring! 값이 넘어오게 됩니다.
    • 이를 위해선 MemberForm.java의 name과 createMemberForm.html의 name의 이름을 같게 설정해 주어야 합니다.

3. 회원 조회

1) @GetMapping, 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}">  <!--${}: model 안에 있는 값을 꺼내는 것-->
        <td th:text="${member.id}"></td>
        <td th:text="${member.name}"></td>
      </tr>
      </tbody>
    </table>
  </div>
</div> <!-- /container -->
</body>
</html>
  • ${}
    • model 안에 있는 값을 꺼내는 것입니다.

 

package hello.hello_spring.controller;

import hello.hello_spring.domain.Member;
import hello.hello_spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@Controller
public class MemberController {
    private final MemberService memberService;

    // new를 사용하지 않고 스프링 컨테이너에 등록하여 사용하자
    @Autowired // 스프링 컨텡너에서 memberService를 가져온다
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

...

    @GetMapping("/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        // model 안에 있는 key:"members"로 value"members"를 -> memberList의 ${members}로
        model.addAttribute("members", members);
        return "members/memberList";
    }
}
  • @GetMapping("/members")
    • members로 get 요청이 오면 list 메소드가 호출됩니다.
  • model.addAttribute("members", members)
    • model 안에 있는 key:"member"가 value:members를 찾고, 이 members는
    • memberList.html의 ${members}와 일치해야 합니다.

 


 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확

www.inflearn.com

 

반응형