[SpringBoot]5. 로그인 기능 제작해보기(Form데이터 Controller에서 받아서 처리하기)
오늘은 저번 포스팅에서 회원가입 만들었던 것에 이어서
게시판에 로그인 기능을 만들어보려고 한다.
로그인 기능에 필요한것은 크게 3가지 정도라고 보면 될 것 같다.
1. 로그인 뷰 만들기(로그인 실패, 성공시 뷰에서 보여줄 내용 작성)
2. Controller에서 유저가 입력한 ID, Password 받아오기
3. 해당 정보를 DB와 비교해서 일치하는지 비교
실제로 실습하면서 알아보도록 하자.
1. 로그인 뷰 제작하기
먼저 유저가 ID와 비밀번호를 입력하고 전송할 수 있는 창을 만든다.
(회원가입 기능은 저번 포스팅에서 다루었으니 여기서는 생략하고
혹시 궁금하신 분들은 아래 링크를 참고하시면 됩니다)
https://chung-develop.tistory.com/22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<title>나만의 게시판 만들기!</title>
</head>
<body style="text-align: center">
안녕하세요 게시판 입니다 로그인을 해주세요:)
<form action="/login.do" method="post">
<div>
<label for="userId">아이디: </label>
<input id="userId" name="userId" type="text">
</div>
<div>
<label for="password">패스워드: </label>
<input id="password" name="password" type="password">
</div>
<input type="submit" value="로그인하기">
</form>
<p th:text="${loginMessage}" style="color: red"></p>
<p>처음이신가요? 회원가입은 여기서 해주세요!</p>
<input type="button" onclick="location.href='/login';" value="회원가입하기"></body>
</body>
</html>
|
cs |
1. 먼저 form태그를 선언하여 그 안에 id와 password 를 입력하는 input을 만든다.
이 때, id와 패스워드 입력하는 곳에 name을 선언해서
서버 Controller에서 각 값들을 받아올 변수명과 동일하게 적어주자.
내 경우에는 UserVO 객체 안에 userId, password를 변수명으로 해서 선언해 두었고
저 안에 각 값들을 넣기위해 저렇게 적어놓았다.
name과 동일하지 않으면 파라메터 바인딩이 안되니 주의하자.
2. form태그에 action과 post를 작성한다.
action에는 이따 작성할 Controller에서 로그인 정보를 받을 url을 적고
post방식으로 보낼 것임을 알려준다.
3. 로그인 실패했을 때 메시지를 띄워줄 코드를 작성한다.
만약 로그인에 실패하면 서버에서 loginMessage라는 이름으로 로그인 실패 이유를 넣어서 보내주면
form태그 아래에 적어놓은 p태그에 적어준 이유가 뜨게 된다.
해당 뷰를 실행하면 아래 이미지와 같이 나온다.
2. Controller 코드 작성하기
View에서 form태그로 감싸서 보낸 값들을 받아오는 방법에는 크게 두가지가 있다.
첫 번째는 스프링이 제공해주는 자동 파라미터 바인딩을 이용하는 방법이고
두 번째는 HttpServletRequest의 getParameter를 이용하는 방법이다.
두 방법에 대해 자세히 알아보자.
1. 파라메터 바인딩 이용하기
파라미터 바인딩은 Controller에서 매핑해준 함수의 매개변수로 도메인 객체를 받아오면 된다.
내 경우 UserVO안에 userId,password라는 String 변수들을 선언해두었기 때문에 자동적으로 매핑된다.
1
2
3
4
5
|
@RequestMapping(value = "/login.do",method = RequestMethod.POST)
public String login(UserVO vo){
System.out.println("vo = " + vo);
return "main";
}
|
cs |
위와같이 코드를 작성하고 로그인 창에서 ID: hello, password: 123을 입력하고
로그인하기를 하면 다음과 같이 로그가 찍힌다.
보다시피 userId, password에 값이 잘 들어가 있는 것을 볼 수 있다.
참고로 저번 포스팅에서도 적었지만 UserVO객체는 다음과 같이 되어있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Entity
@Getter
@Setter
@ToString
public class UserVO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userSn;
private String userId;
private String password;
private String userName;
private String role;
}
|
cs |
2. 파라미터로 가져오기
다음 방법은 HttpServletRequest를 매개변수에 선언해놓고 request에서 파라미터 명으로 가져오는 방법이다.
코드는 다음과 같다.
1
2
3
4
5
6
7
8
|
@RequestMapping(value = "/login.do",method = RequestMethod.POST)
public String login(HttpServletRequest request, Model model){
String id=request.getParameter("userId");
String pwd=request.getParameter("password");
System.out.println("id = " + id);
System.out.println("pwd = " + pwd);
return "main";
}
|
cs |
이 방법은 위 코드에서 보다시피
form의 각 input값들의 name을 기준으로 파라미터 값들을 가져오면 된다.
다만 1번의 방법과 달리 자동으로 각 값들이 바인딩 되지 않으므로 일일히 적어줘야해서
입력값들이 많아지면 불편하고 코드가 길어진다는 단점이 있다.
두 방법중 나는 전자를 택하여 진행하였다.
View에서 입력한 아이디와 비밀번호를 받았으니 이 정보들을 UserTable에 아이디와 비밀번호를 비교해서 해당하는 값을 가져오도록 코드를 작성한다.
해당 내용을 작성한 코드이다.
1
2
3
4
5
6
7
8
9
10
11
|
@RequestMapping(value = "/login.do",method = RequestMethod.POST)
public String login(UserVO vo,Model model){
System.out.println("vo = " + vo);
UserVO userVO=userService.loginUser(vo.getUserId(),vo.getPassword());
//일치하는 아이디,비번이 없는 경우. if(userVO==null){
model.addAttribute("loginMessage","아이디 혹은 비밀번호가 일치하지 않습니다!");
return "index";
}
model.addAttribute("userName",userVO.getUserName());
return "main";
}
|
cs |
DB에 가서 아이디,비밀번호를 대조하는 내용은 이따 만들 Service에서 작성하고
만약 DB에 두 값이 일치하는 내용이 있다면 그대로 유저 닉네임을 model에 넣어서 다음 화면을 반환해주고
없다면 에러메시지를 넣고 로그인 창으로 보내준다.
3. Service 코드 작성하기
서비스에서는 간단하게 서버에서 받은 아이디, 비밀번호를 Repository를 통해 DB에 가서 유저 정보를 조회해온다.
1
2
3
4
|
public UserVO loginUser(String id,String pw){
UserVO userVO=userRepository.selectUserInfo(id,pw);
return userVO;
}
|
cs |
4. Repository 작성하기
Repository에서는 테이블로 가서 유저 정보를 조회해올 쿼리를 작성한다.
1
2
3
4
5
|
public interface UserRepository extends JpaRepository<UserVO,Long> {
@Query("select u from UserVO u where u.userId=:userId and u.password=:password")
UserVO selectUserInfo(@Param("userId")String userId,@Param("password")String password);
}
|
cs |
원래대로면 간단하게 함수명으로 조회할 수 있지만 @Query 어노테이션을 선언해서 원하는대로 쿼리문을 짤 수도 있다.
여기서는 @Query어노테이션으로 조회 코드를 한번 짜보았다.
@Query 내부에서 함수 매개변수로 넘겨준 값들을 바인딩하는 것은
먼저 매개변수에 @Param 어노테이션을 선언해주고 name을 설정,
이후 @Query어노테이션 안에 설정해줬던 name값을 그대로 쓰고 앞에 : 을 붙여주면 된다.
5. 로그인 성공 창 만들기
로그인 성공했을 때 띄울 main.html창을 만든다.
여기서는 로그인한 유저의 닉네임을 띄워준다.
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>나만의 게시판 만들기!</title>
</head>
<body>
<p th:text="${userName}+'님 환영합니다!'"></p>
</body>
</html>
|
cs |
6. 테스트 해보기
먼저 로그인 창이 나온다. 여기서 회원가입하기를 눌러준다.
아이디 test, 비번 123, 닉네임 TestUser로 가입해준다.
이렇게 가입하면 해당 정보로 유저 계정이 생성된다.
다시 로그인 창으로 돌아와서 아이디 비번을 잘못 입력하면
아래와 같이 다시 로그인 창이 뜨면서 경고 메시지가 추가된다.
각 정보를 제대로 입력하면 아래와 같이 입력했던 닉네임 정보와 함께 main.html창이 뜬다.
▶이전 글
[SpringBoot]4-2. SpringDataJPA를 활용하여 회원가입 예제- Controller,Service,Repository의 역할및 구현
https://chung-develop.tistory.com/23
'Backend > 게시판만들기' 카테고리의 다른 글
[Spring실습] 5분만에 알아보는 테스트 케이스 작성해보기-2 (0) | 2020.11.29 |
---|---|
[Spring실습] 5분만에 알아보는 프로젝트 설계 예제 및 회원 도메인과 리포지토리 만들기-1 (0) | 2020.11.24 |
[SpringBoot]SpringDataJPA를 활용하여 회원가입 예제- Controller,Service,Repository의 역할및 구현 (3) | 2020.08.10 |
[SpringBoot]SpringDataJPA를 활용한 회원가입 예제- View제작하기 (0) | 2020.08.08 |
[SpringBoot] 개발용으로 가볍고 편리한 H2 데이터베이스 설치 및 SpringBoot에 연동하기 (0) | 2020.08.06 |