V2-02. 회원가입 & 로그인 기능 추가

kimsoapsoap's avatar
Sep 06, 2024
V2-02. 회원가입 & 로그인 기능 추가
 

1. 상단 메뉴에 버튼 추가

 
header.mastache
<!DOCTYPE html> <html lang="en"> <head> <title>Blog</title> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"/> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"> </head> <nav class="navbar navbar-expand-sm bg-dark navbar-dark"> <div class="container-fluid"> <a class="navbar-brand" href="/board">Metacoding</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#collapsibleNavbar"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" href="/join-form">회원가입</a> </li> <li class="nav-item"> <a class="nav-link" href="/login-form">로그인</a> </li> <li class="nav-item"> <a class="nav-link" href="/logout">로그아웃</a> </li> <li class="nav-item"> <a class="nav-link" href="/board/save-form">글쓰기</a> </li> </ul> </div> </div> </nav>
회원가입, 로그인, 로그아웃, 글쓰기 버튼을 추가해줍니다.
 
 
 

2. UserRepository 만들기

 
user패키지에 UserRepository를 만든다.
@Repository public class UserRepository { @Autowired private EntityManager em; public User findByUsernameAndPassword(String username, String password) { Query query = em.createQuery("select u from User u where u.username =:username and u.password=:password", User.class); query.setParameter("username", username); query.setParameter("password", password); return (User) query.getSingleResult(); } @Transactional public void save(User user) { em.persist(user); } }
findByUsernameAndPassword 메서드가 로그인 시도할 때 아이디/비밀번호를 확인한다.
 
 
 
 
 
 
 

3. UserController 만들기

 
user패키지에 UserController를 만든다.
@Controller public class UserController { @Autowired private UserRepository userRepository; //HttpSession은 스프링 시작시에 Ioc에(빈 컨테이너) 생성돼서 대기중이다. @Autowired로 주입 @Autowired private HttpSession session; @PostMapping("/login") public String login(UserRequest.LoginDTO loginDTO) { User sessionUser = userRepository.findByUsernameAndPassword(loginDTO.getUsername(), loginDTO.getPassword()); session.setAttribute("sessionUser", sessionUser); return "redirect:/board"; } @PostMapping("/join") public String join(UserRequest.JoinDTO joinDTO) { userRepository.save(joinDTO.toEntity()); return "redirect:/login-form"; } @GetMapping("/join-form") public String joinForm() { return "user/join-form"; } @GetMapping("/login-form") public String loginForm() { return "user/login-form"; } }
 
 

4. UserRequest 만들기

 
user패키지에 UserRequest를 만들어서 User관련 request요청에 사용할 DTO를 만들어준다.
💡
DTO(Data Transfer Object) : 데이터를 안전하고 명확하게 관리하기 위해 사용한다.
 
public class UserRequest { @Data // @Getter, @Setter, @ToString.. 등 기능 포함 public static class JoinDTO { private String username; private String password; private String email; //이 메서드의 책임은 DTO -> UserObject로 바꿔주는 책임 //toEntity()는 insert 할 때만 필요. select 할 때는 만들어줄 필요 없다. public User toEntity() { return User.builder().username(username).password(password).email(email).build(); } } @Data public static class LoginDTO { private String username; private String password; } }
 
내부에 DTO클래스를 static으로 만들어서 사용
JoinDTO : 회원가입 요청시 필요한 정보인 username, password, email의 정보를 전달
LoginDTO : 로그인 요청시 필요한 정보인 username, password 정보를 전달
 
toEntity()는 insert할 때 필요한 정보를 id(PK)값 빼고 전달하기 위해 만든 메서드이다.
UserRepository가 save(User user) 에서 id값만 빠진 User객체를 받아서 em.persist() 하면 영속성 컨텍스트에 저장하고 트랜잭션이 끝나고 쿼리가 insert 나가서 db에 넣는다.
 
 
Share article

zerfa