[스프링부트] 14. Storev2 : 유저 기능

문정준's avatar
Mar 28, 2025
[스프링부트] 14. Storev2 : 유저 기능
✏️

로그인한 상태가 아니면, 상품 관련 메뉴들은 비활성화시켜야 함

  • 쿠키의 특성을 활용하여, header에서 쿠키의 content 여부에 따라 메뉴 차별화
    • 있으면 (로그인 한 상태), 상품 메뉴, 주문 내역, 로그아웃 표시
    • 없으면 (로그인 안 한 상태), 회원가입, 로그인 표시
 

1. 회원가입

Codes
UserController
@GetMapping("/user/join-form") public String joinForm() { return "user/join-form"; } // TODO : join @PostMapping("/join") public String join(UserRequest.JoinDTO joinDTO) { if(joinDTO.getUsername().length() > 12) throw new RuntimeException("아이디가 너무 깁니다."); userService.회원가입(joinDTO); return "user/login-form"; }
UserService
@Transactional public void 회원가입(UserRequest.JoinDTO joinDTO) { User userinfo = userRepository.findByUsername(joinDTO.getUsername()); if (userinfo != null) throw new RuntimeException("이미 존재하는 아이디입니다."); userRepository.join(joinDTO.getUsername(), joinDTO.getPassword(), joinDTO.getFullname()); }
UserRepository
public void join(String username, String password, String fullname) { Query q = em.createNativeQuery("insert into user_tb(username, password, fullname, created_at) values (?, ?, ?, now())"); q.setParameter(1, username); q.setParameter(2, password); q.setParameter(3, fullname); q.executeUpdate(); } public User findByUsername(String username) { Query q = em.createNativeQuery("select * from user_tb where username = ?", User.class); q.setParameter(1, username); try { return (User) q.getSingleResult(); } catch (Exception e) { return null; } }
UserRequest
@Data public static class JoinDTO { private String username; private String password; private String fullname; }
Form
{{> layout/header}} <div class="container mt-2"> <div class="mt-4 p-5 bg-light text-dark rounded-4"> <h1>회원가입 페이지</h1> <form action="/join" method="post"> <div class="mb-3 mt-3"> <input type="text" class="form-control" placeholder="Enter username" name="username"> </div> <div class="mb-3"> <input type="password" class="form-control" placeholder="Enter password" name="password"> </div> <div class="mb-3"> <input type="text" class="form-control" placeholder="Enter fullname" name="fullname"> </div> <button type="submit" class="btn btn-primary">회원가입</button> </form> </div> </div> </body> </html>
notion image
 

2. 로그인

Codes
UserController
@GetMapping("/user/login-form") public String loginForm() { return "user/login-form"; } // TODO : login @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO, HttpSession session) { User userinfo = userService.로그인(loginDTO); session.setAttribute("sessionUser", userinfo); return "redirect:/"; }
UserService
public User 로그인(UserRequest.LoginDTO loginDTO) { User userinfo = userRepository.findByUsername(loginDTO.getUsername()); if(userinfo == null) throw new RuntimeException("회원 정보가 없습니다."); if(!(userinfo.getPassword().equals(loginDTO.getPassword()))) { throw new RuntimeException("아이디 또는 비밀번호가 틀립니다."); } return userinfo; }
UserRepository
public User findByUsername(String username) { Query q = em.createNativeQuery("select * from user_tb where username = ?", User.class); q.setParameter(1, username); try { return (User) q.getSingleResult(); } catch (Exception e) { return null; } }
UserRequest
@Data public static class LoginDTO { private String username; private String password; private String fullname; }
Form
{{> layout/header}} <div class="container mt-2"> <div class="mt-4 p-5 bg-light text-dark rounded-4"> <h1>로그인 페이지</h1> <form action="/login" method="post"> <div class="mb-3 mt-3"> <input type="text" class="form-control" placeholder="Enter username" name="username"> </div> <div class="mb-3"> <input type="password" class="form-control" placeholder="Enter password" name="password"> </div> <button type="submit" class="btn btn-primary">로그인</button> </form> </div> </div> </body> </html>
notion image

3. 로그아웃

Codes
UserController
// TODO : logout @GetMapping("/logout") public String logout(HttpSession session) { session.invalidate(); return "redirect:/"; }
Share article

sxias