회원 가입 UI 반영

송영재·2022년 10월 23일

Spring

목록 보기
8/45
  • 11) 회원 가입 UI 반영

    • 프론트 개발자가 회원 가입 및 로그인 UI 를 구현 완료해서 전달해줌
      • 타임리프 모듈 추가
        • [코드스니펫] build.gradle
          		// Thymeleaf (뷰 템플릿 엔진)
              implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
      • 회원 가입 Form 페이지
        • [코드스니펫] resources > templates > signup.html
          <!DOCTYPE html>
          <html lang="en" xmlns="http://www.w3.org/1999/xhtml" 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">
              <link rel="preconnect" href="https://fonts.gstatic.com">
              <link href="https://fonts.googleapis.com/css2?family=Nanum+Gothic&display=swap" rel="stylesheet">
              <link rel="stylesheet" type="text/css" href="/css/style.css">
              <meta charset="UTF-8">
              <title>회원가입 페이지</title>
              <script>
                  function onclickAdmin() {
                      // Get the checkbox
                      var checkBox = document.getElementById("admin-check");
                      // Get the output text
                      var box = document.getElementById("admin-token");
          
                      // If the checkbox is checked, display the output text
                      if (checkBox.checked == true){
                          box.style.display = "block";
                      } else {
                          box.style.display = "none";
                      }
                  }
              </script>
          </head>
          <body>
          <div id="login-form">
              <div id="login-title">Sign up Select Shop</div>
          
              <form action="/user/signup" method="post">
                  <div class="login-id-label">Username</div>
                  <input type="text" name="username" placeholder="Username" class="login-input-box">
          
                  <div class="login-id-label">Password</div>
                  <input type="password" name="password" class="login-input-box">
          
                  <div class="login-id-label">E-mail</div>
                  <input type="text" name="email" placeholder="E-mail" class="login-input-box">
          
                  <div>
                      <input id="admin-check" type="checkbox" name="admin" onclick="onclickAdmin()" style="margin-top: 40px;">관리자
                      <input id="admin-token" type="password" name="adminToken" placeholder="관리자 암호" class="login-input-box" style="display:none">
                  </div>
                  <button id="login-id-submit">회원 가입</button>
              </form>
          </div>
          </body>
          </html>
      • 회원 로그인 Form 페이지
        • [코드스니펫] resources > templates > login.html
          <!DOCTYPE html>
          <html lang="en" xmlns="http://www.w3.org/1999/xhtml" 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">
            <link rel="preconnect" href="https://fonts.gstatic.com">
            <link href="https://fonts.googleapis.com/css2?family=Nanum+Gothic&display=swap" rel="stylesheet">
            <link rel="stylesheet" type="text/css" href="/css/style.css">
            <meta charset="UTF-8">
            <title>로그인 페이지</title>
          </head>
          <body>
          <div id="login-form">
            <div id="login-title">Log into Select Shop</div>
            <button id="login-kakao-btn" onclick="location.href='https://kauth.kakao.com/oauth/authorize?client_id=&redirect_uri=http://localhost:8080/user/kakao/callback&response_type=code'">
              카카오로 로그인하기
            </button>
            <button id="login-id-btn" onclick="location.href='/user/signup'">
              회원 가입하기
            </button>
            <form action="/user/login" method="post">
              <div class="login-id-label">아이디</div>
              <input type="text" name="username" class="login-input-box">
          
              <div class="login-id-label">비밀번호</div>
              <input type="password" name="password" class="login-input-box">
          
              <button id="login-id-submit">로그인</button>
            </form>
            <div id="login-failed" style="display:none" class="alert alert-danger" role="alert">로그인에 실패하였습니다.</div>
          </div>
          </body>
          <script>
            const href = location.href;
            const queryString = href.substring(href.indexOf("?")+1)
            if (queryString === 'error') {
              const errorDiv = document.getElementById('login-failed');
              errorDiv.style.display = 'block';
            }
          </script>
          </html>
        • css 폴더로 옮겨짐에 따라 index.html 파일에서 style.css 의 상대 경로도 변경
          <link rel="stylesheet" href="**css/**style.css">
          • [코드스니펫] resources > static > index.html
            <!doctype html>
            <html lang="en">
            <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">
                <meta property="og:title" content="00만의 셀렉샵">
                <meta property="og:description" content="관심상품을 선택하고, 최저가 알림을 확인해보세요!">
                <meta property="og:image" content="images/og_selectshop.png">
                <link href="https://fonts.googleapis.com/css2?family=family=Nanum+Gothic&display=swap" rel="stylesheet">
                <link rel="stylesheet" href="css/style.css">
                <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
                <script src="basic.js"></script>
                <title>나만의 셀렉샵</title>
            </head>
            <body>
            <div class="header">
                Select Shop
            </div>
            <div class="nav">
                <div class="nav-see active">
                    모아보기
                </div>
                <div class="nav-search">
                    탐색하기
                </div>
            </div>
            <div id="see-area">
                <div id="product-container">
            
                </div>
            </div>
            <div id="search-area">
                <div>
                    <input type="text" id="query">
                    <!--    <img src="images/icon-search.png" alt="">-->
                </div>
                <div id="search-result-box">
            
                </div>
                <div id="container" class="popup-container">
                    <div class="popup">
                        <button id="close" class="close">
                            X
                        </button>
                        <h1>⏰최저가 설정하기</h1>
                        <p>최저가를 설정해두면 선택하신 상품의 최저가가 떴을 때<br/> 표시해드려요!</p>
                        <div>
                            <input type="text" id="myprice" placeholder="200,000"></div>
                        <button class="cta" onclick="setMyprice()">설정하기</button>
                    </div>
                </div>
            </div>
            </body>
            </html>
    • 회원 가입 페이지 요청 처리
      • WebSecurityConfig 에 formLogin() 처리 부분 변경
        • [코드스니펫] 로그인 페이지 설정
                          .and()
                              // 로그인 기능 허용
                              .formLogin()
                              .loginPage("/user/login")
                              .defaultSuccessUrl("/")
                              .failureUrl("/user/login?error")
                              .permitAll()
      • UserController 파일 생성
        • [코드스니펫] controller > UserController
          import org.springframework.stereotype.Controller;
          import org.springframework.web.bind.annotation.GetMapping;
          
          @Controller
          public class UserController {
          
              // 회원 로그인 페이지
              @GetMapping("/user/login")
              public String login() {
                  return "login";
              }
          
              // 회원 가입 페이지
              @GetMapping("/user/signup")
              public String signup() {
                  return "signup";
              }
          }
    • 회원 가입 페이지 연동 테스트
      • '/' 로 접근하면 ⇒ '/user/login' 페이지로 이동함
  • 12) UI 이슈 해결

    • "기대하는 UI" vs "실제 UI"
    • 로그인 페이지에 CSS 가 적용되지 않음
    • 웹 페이지 이슈가 생겼을 때 원인을 파악하고 해결할 수 있는 능력 필요
    • '개발자 도구' 로 에러 내용 확인
    • 스프링 시큐리티의 URL 허용 정책 변경 필요 확인
        // image 폴더를 login 없이 허용
        .antMatchers("/images/**").permitAll()
        // css 폴더를 login 없이 허용
        .antMatchers("/css/**").permitAll()
      • [코드스니펫] security > WebSecurityConfig
        import org.springframework.context.annotation.Configuration;
        import org.springframework.security.config.annotation.web.builders.HttpSecurity;
        import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
        import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
        
        @Configuration
        @EnableWebSecurity // 스프링 Security 지원을 가능하게 함
        public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
        
                http.authorizeRequests()
                        // image 폴더를 login 없이 허용
                        .antMatchers("/images/**").permitAll()
                        // css 폴더를 login 없이 허용
                        .antMatchers("/css/**").permitAll()
                        // 어떤 요청이든 '인증'
                        .anyRequest().authenticated()
                        .and()
                            // 로그인 기능 허용
                            .formLogin()
                            .loginPage("/user/login")
                            .defaultSuccessUrl("/")
                            .failureUrl("/user/login?error")
                            .permitAll()
                        .and()
                            // 로그아웃 기능 허용
                            .logout()
                            .permitAll();
            }
        }

0개의 댓글