Java - Spring &&n SpringBoot

Spring - 회원 관리 페이지 만들기 - 홈 화면 추가, 등록, 조회

TerianP 2021. 12. 18.
728x90

이전까지는 회원 가입을 위한 Controller와 Repository , Service 연결을 했다면 이번에는 웹 화면에서 직접 회원 웹 기능을 홈 화면에 추가하고, 회원 등록과 조회를 가능하도록 웹 화면을 만들어보겠다.

 

 1. 회원 관리 홈 화면 추가 : 회원 가입, 조회 화면

  • Spring 시작 시 springhome.html 로 이동하도록 만들기 위한 HomeController 클래스 파일과 springhome.html 을 만든다.

 

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

@Controller
public class HomeController {

    @GetMapping("/") // 가장 기본 페이지 의미, 즉 루트 페이지 위치
    public String home(){
        return "springhome"; // springhome.html 을 찾아서 연다.
    }
}

 

  • springhome.html
<!Doctype html>

<html xmlns:th="http://www.thymeleaf.org"> <!-- thymeleaf 문법을 사용하기 위해 선언 -> th 로 www.thyleaf.org 를 연결-->
<head>
    <title>Hello Spring</title>
    <meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
</head>

<body>
<div class="container">
    <div>
        <h1>Hello Spring Home page</h1>
        <p>회원 기능</p>
        <p>
            <a href="/members/new">회원 가입</a>
            <a href="/members_list">회원 목록</a>
        </p>
    </div>
</div> <!--- /container End ---->

</body>
</html>

 

  • 스프링을 시작해서 localhost 로 들어가보면 springhome.html 이 열리는 것을 확인 할 수 있다.
  • 그런데 여기서 중요한 것이 하나 있다!! 이전에 웹을 열어서 들어갔을 때는 static / hello-static.html 로 들어갔는데 왜 이번에는 springhome.html 이 열리는 걸까?
    • 그것은 바로 '스프링 컨테이너'의 차이이다. 아래 사진을 보았을 때 이전에는 Controller 에 home 즉 " 루트 페이지 / "와 매칭되는 Controller 나 @GetMapping 가 없었다. 그러나 이번에는 관련된 컨트롤러가 있기 때문에 내가 지정한 springhome.html 로 이동하는 것이다.
    • 아래 사진으로 생각하면 편한데, 이전에는 1번에 해당하는 컨트롤러가 없기 때문에 2번인 hello-static.html 이 실행되었던 것이고, 이버에는 1번쪽에서 해당 컨트롤러를 찾았기 때문에 컨트롤러 안의 메서드에 따라서 실행된 것이다.

이걸 보면서 생각해보자!!

 

최종적으로 아래 화면을 만나 볼 수 있다.

회원 가입과 회원 목록이 보인다!

 

2. 회원 가입 페이지 && 메모리 Repository 연결

  • 다음으로 회원 가입 페이지를 만들고 메모리 repository 와 연결한다. 
  • 최종적으로 생성 & 수정되는 파일은 총 3가지로 각각 다음과 같은 역할을 한다.
    • MemberForm.java - newmember.html에서 받아온 name 과 userid, userpw 를 자바 코드로 활용하기 위한 파일
    • MemberComtroller.java - 기존의 MemberController 에서 newmember.html 로 넘어가는 코드와 newmember 에서 넘어온 값들을 member 로 저장하기 위한 코드 추가
    • newmember.html - 회원 가입 html 페이지
    • 각 코드에 대한 설명은 주석문 확인!!

1) 코드 작성하기

  • MemberForm.java : Controller 패키지 안에 작성한다.
public class MemberForm {
	
    private String name; // 회원 이름
    private String userid; // 회원 id
    private String userpw; // 회원 passwd

    public String getName() {
        return name;
    }

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

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getUserpw() {
        return userpw;
    }

    public void setUserpw(String userpw) {
        this.userpw = userpw;
    }
}

  • MemberComtroller.java
public class MemberController {

    private final memberService memberService;

    @Autowired
    // Bean 으로 설정되었던 memberService 를 넣어줌. 의존성 주입
    public MemberController(memberService memberService) {
        this.memberService = memberService;
    }


    @GetMapping("/members/new") // http 에서 get 으로 넘어올때 -> 주로 값을 출력하는 경우
    public String createForm(){
        return "members/newmember";
    }

    @PostMapping("members/new") // http 에서 members/new 페이지에 대해 post 로 넘어올 때 -> 주로 값을 등록하는 경우
    public String create(MemberForm form){
        Member member = new Member(); // member 객체 생성
        member.setName(form.getName()); // member name 에 form 에서 받아온 name 을 넣어준다
        member.setId(form.getUserid());
        member.setPasswd(form.getUserpw());

        memberService.join(member);
        //member service 를 사용해 member 객체에 대해 join 메서드를 실행한다.

//        System.out.println("member : "+member.getName());
//        System.out.println("member : "+member.getPasswd());
//        System.out.println("member : "+member.getId());


        return "redirect:/"; // 회원가입이 끝나서 가입하기를 누르면 home(root page) 으로 설정된 페이지로 돌아감
    }
  }

 


  • newmember.html : 회원 가입 페이지
    • 얘만 복사해가시면 css 와 js 는 적용이 안됩니다!!
<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>회원가입 HJProject</title>
    <link rel="stylesheet" href="/css/member.css"/>
    <script src="/js/jquery-3.5.0.min.js"></script>

    <!-- <script src="/js/newmember.js"></script> 이렇게 하거나 혹은 아래처럼 th: 를 넣어서 작성해도 상관없다-->
    <!-- 다만 thymeleaf 는 script 다음에 java/text 넣지 말아야 한다-->
    <script th:src="@{/js/newmember.js}"></script>

</head>
<body>
<div class="container">

    <form action="/members/new" method="post" onsubmit="return check_submit(this);">
<!--        여기서 action 은 아래 내용을 작성한 후 submit 에 해당하는 가입하기를 눌렀을 때 넘어갈 페이지-->
<!--        post 는 http 방식-->
        <h1>회원 가입</h1>
        <fieldset>
            <legend>로그인 정보</legend>
            <table>
                <tr>
                    <td id="line1">아이디</td>
<!--                    style="ime-mode:disabled" 는 한영키를 무시하고 영어로만 입력되도록 함-->
                    <td id="line2"><input type="text" size="35" name="userid" id="userid" style="ime-mode:disabled"
                                          placeholder="아이디" required></td>
                </tr>
                <tr>
                    <td>비밀번호</td>
                    <td><input type="password" class="pw" size="35" name="userpw" id="userpw"
                               placeholder="최소 하나의 영문 또는 숫자를 포함하여 6자리" style="ime-mode:disabled" required></td>
                </tr>
                <tr>
                    <td>비밀번호 확인</td>
                    <td>
                        <input type="password" class="pw" size="35" id="userpw2" placeholder="비밀번호 확인"
                               style="ime-mode:disabled" required>
                    </td>
                </tr>
                <tr>
                    <td>
                        <span id="alert-weakness" style="display: none; color: red; font-weight: bold;">비밀번호가 시공같네요!</span>
                        <span id="alert-middle" style="display: none; color:rgb(250, 233, 0); font-weight: bold; ">비밀번호가 중간정도군요.</span>
                        <span id="alert-strong" style="display: none; color: green;">비밀번호 정말 강하군요!...</span>
                    </td>
                    <td>
                        <span id="alert-success" style="display: none; color: green;">비밀번호가 일치합니다.</span>
                        <span id="alert-danger" style="display: none; color: #d92742; font-weight: bold; ">비밀번호가 일치하지 않습니다.</span>
                        <span id="alert-null" style="display: none; color: black;">비밀번호 확인 칸 을 입력하세요.</span>
                        <span id="alert-null2" style="display: none; color: black;">비밀번호 칸 을 입력하세요.</span>
                    </td>
                </tr>
            </table>
        </fieldset>

        <fieldset>

            <legend>개인 정보</legend>
            <table>
                <tr>
                    <td>이름</td>
                    <td><input type="text" size="35" name="name" placeholder="이름" required></td>
                </tr>
                <tr>
                    <td>성별</td>
                    <td>남<input type="radio" name="sex" value="man"> 여<input type="radio" name="sex" value="woman"></td>
                </tr>
                <tr>
                    <td>이메일</td>
                    <td>
                        <input type="text" name="email" id="email" value=""/>&#64;<input type="text" name="emaddress" value="" ReadOnly="true" />
                        <select id="emailselect" onchange="SetEmailTail(emailselect.options[this.selectedIndex].value)" >
                            <option value="notSelected">::선택하세요::</option>
                            <option value="etc" id="etc">직접입력</option>
                            <option value="naver.com">naver.com</option>
                            <option value="nate.com">nate.com</option>
                            <option value="google.com">google.com</option>
                            <!--이메일 확인 스크립트-->
                            <script type="text/javascript" th:inline="javascript">
                        function SetEmailTail(emailValue) {
                            var email = document.all("email")    // 사용자 입력
                            var emailTail = document.all("emaddress") // Select box
                           var esw = $("#etc1");
                               if ( emailValue == "notSelected" ){
                              emailTail.readOnly = true;
                              emailTail.value = '';
                              alert("이메일을 선택or입력하세요  ");
                           }
                            else if ( emailValue == "etc" ) {
                               emailTail.readOnly = false;
                               emailTail.value = "";
                              emailTail.focus();
                           }
                           else {
                               emailTail.readOnly = true;
                               emailTail.value = emailValue;
                           }
                        }
                            </script>
                        </select>
                    </td>
                </tr>
            </table>

            <button type="submit" value="가입하기">가입하기</button>
            <button type="reset" value="다시쓰기">다시쓰기</button>
        </fieldset>
    </form>
</div>
</body>
</html>
  • 여기서 잠깐!!! 외부 css 파일과 js 파일과 같은 정적인 컨텐츠의 파일들은 static 디렉토리 안에 폴더를 만들어서 넣어줘야 한다. 
  • 또한 위치를 지정 할 때는 resources/static 부터 작성하는게 아니라 static 디렉토리 안에서부터 작성하면 된다.
    • 예를 들어 아래 사진과 같이 위치해 있는 경우 resources/static/js/newmember.js 가 아닌 /js/newmember.js 만 넣어주면 된다.

요렇게 있으면 /js/newmember.js 만

  • 다음으로 js 파일을 적용하기 위한 설정이다. 솔직히 이것 때문에 가장 많이 헤맸다. 기존 html 은 내가 알기로는 아래처럼 작성한다.
<script type="text/javascript" src="newmember.js"></script>
  • 그런데 저렇게 작성했을 때는 자바 스크립트가 제대로 적용이 되지 않았다. 결국 검색을 통해서 알게되었는데 앞에 type=" ~ " 부분을 삭제하고 src=" ~ " 부분만 작성하니까 제대로 적용되는 것을 확인했다.
    • 아래에 관련 stackoverflow 내용을 첨부하겠다.
  • 마지막으로 thymeleaf 에서 css 나 자바 스크립트 파일을 적용하기 위해서는 th:herf 나 th:src 를 문법으로 사용한다.

2) 사진으로 확인!

회원 가입 페이지 화면과 자바 스크립트 적용 모두 확인!!

 

3. 회원 가입 내용 조회

  • 마지막으로 회원 가입 내용을 조회할 수 있는 페이지를 작성!!
  • 각 페이지에 대한 내용은 다음과 같으며 코드의 자세한 설명은 주석 참고!!
    • MemberController : 주석 참고
    • member_list.html : 멤버 리스트를 조회하는 기능의 페이지

 

1) 코드 작성!! 

  • MemberController : 아래 내용 추가
@GetMapping("/members") // members 페이지에 대해 Get 으로 넘어올 때 -> 주로 값을 불러오는 하는 경우
public String list(Model model){ // Model 사용을 list 로 사용
    List<Member> members = memberService.findMembers(); // memberService.findMembers() 를 list 형식으로 저장
    model.addAttribute("members", members);
    // 파라미터로 넘어온 members 을 model에 담아서 members/members_list 의 members 로 넘긴다.

    return "/members/members_List";
}

 

  • member_list.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>회원 정보</title>
</head>
<body>
<div class="container">
    <div>
        <table>
            <thead>
            <tr>
                <th>#</th>
                <th>이름</th>
                <th>아이디</th>
            </tr>
            </thead>
            <tbody>
        <!--thymeleaf 식 for 문-->
        <!--MemberController 로 넘어가는 members-->
            <tr th:each="member : ${members}">
                <td th:text="${member.code}"></td>
                <td th:text="${member.name}"></td>
                <td th:text="${member.id}"></td>
            </tr>
            </tbody>
        </table>
    </div>
</div>

</body>
</html>

2) 사진으로 확인!!

members 페이지에서 내가 저장한 내용을 확인 할 수 있다

 


 

오늘은 몇일에 걸쳐 MVC에 대해서 공부하고 thymeleaf 에 대해서 공부하고 이제 대충 웹 사이트 비스무리한거에 회원가입할 수 있도록 페이지를 만들었다.

회원 가입 페이지는 내가 공부하면서 작성한게 아니라...기존에 만들어두었던 내 사이트의 회원 가입 페이지를 가져와서 수정하여 사용하였다. 스프링과 DB를 엮는 방법을 공부하고 나면, 최종적으로 내 사이트에 있던 내용들을 전부 spring 으로 옮기고 연동하는 작업을 하도록 하겠다.

 

그때는 git 에도 올려서 코드를 다른 사람들도 쉽게 볼 수 있게 만들려고 한다!!

 


참고 사이트

- 자바 스크립트 적용 관련 stackoverflow 내용

https://stackoverflow.com/questions/50901346/trying-to-import-static-javascript-to-thymeleaf

 

Trying to import static javascript to thymeleaf

I am working on a java spring project and would like to add a static javascript file to an HTML page. here is what I currently have it seems to work for the css but not the js. the basic file struc...

stackoverflow.com

 

댓글