스프링/0. 입문, 전체방향

13강. 간단 회원 웹 기능 -등록

sdafdq 2023. 7. 8. 16:49
@Controller
public class HomeController {
    
    @GetMapping("/") //최상위에서 호출. localhost:8080 바로 가면 이거 호출
    public String home(){
        return "home";
    }
}

@Controller 여러개 등록 가능. 파일도 다른거임.

 

<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <div>
            <h1>Hello</h1>
            <p>회원 기능</p>
            <p>
                <a href="/members/new">회원 가입</a>
                <a href="/members">회원 목록</a>
            </p>
        </div>
    </div>
</body>
</html>

home은 그냥 링크만 있는 간단한. thymeleaf는 써놓긴 했는데 쓰진 않은듯?

 

@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") //이거는 Get방식이 아니라 Post. html에서 보낼 때
    public String create(MemberForm form){    // <form action="/members/new" method="post">이라고 되어있음
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);
        return "redirect:/"; // Mapping에서 return은 템플릿 경로. redirect:/ 최상위로 보냄.
    }
}

MemberController

재밌는게, 같은 이름이라도 Post랑 Get방식으로 따로 만들 수 있음.

 

<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<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>
</body>
</html>

간단한 입력.

form으로 post 방식으로 name 키의 데이터를 보냄.

name이 서버로 가는 속성임.

 

아까 위에 MemberController에

@PostMapping("/members/new") //이거는 Get방식이 아니라 Post. html에서 보낼 때
    public String create(MemberForm form){    // <form action="/members/new" method="post">이라고 되어있음
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);
        return "redirect:/"; // Mapping에서 return은 템플릿 경로. redirect:/ 최상위로 보냄.
    }

이렇게 MemberFomr form을 인자로 받는데

public class MemberForm {
    private String name;   //html의 name="name" <- 이 문자열과 같아야 매칭이 됨.

    public String getName() {
        return name;
    }

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

name속성의 값과 저 변수 이름이 같아야 매칭됨.

솔직히 나는 매개변수로 저렇게 하면 어떤 명시적으로 뭐 새로운 객체 만들지도 않았는데, 자동으로 객체 생성하고 넣어주는거 보면서 봤는데,

https://www.inflearn.com/course/lecture?courseSlug=스프링-입문-스프링부트&unitId=49590&tab=community&category=questionDetail&q=719769 

 

학습 페이지

 

www.inflearn.com

... 그것과 관련해서는 되게 나중에 배우는 듯?

일단은 하는 말씀이, getter setter가 있어야 한다고 함. 

spring이 setter 호출해서 값을 넣어준다고 함.