๊ฒฐ๊ณผํ๋ฉด
๋ก๊ทธ์ธ์ด ๋์ง ์์์ผ๋ฉด ๋ก๊ทธ์ธ๋ฒํผ์ด ๋จ๊ณ , ๋ก๊ทธ์ธ์ด ๋๋ฉด ๋ก๊ทธ์์๊ณผ ์ ๋ณด์์ ๋ฒํผ์ด ์๊น๋๋ค.


๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ธฐ๋ฅ
Controller
1ํ์์ ๋ง๋ค ๋ ์ฝ๋์ ํ๋ผ๋ฏธํฐ ์์ HttpSession session์ด๋ผ๋ ๋งค๊ฐ๋ณ์๊ฐ ์์์ต๋๋ค.
์ธ์ ์ ์๋ฆฌ
1. ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์๋ฒ๊ฐ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ
2. ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ JSESSIONID ์ฟ ํค ๋ฐ๊ธ
3. ์์ฒญ ์ฌ ๋๋ง๋ค ์๋ฒ๊ฐ JSESSIONID ํ์ธ
4. ๋ก๊ทธ์์ ์ ์ธ์ ์ญ์
@PostMapping("/login")
public String login(LoginDTO dto, Model model, HttpSession session) {
LoginResult result = memberService.login(dto);
switch (result){
case NO_ID:
model.addAttribute("msg", "๋ฑ๋ก๋ ์์ด๋๊ฐ ์์ต๋๋ค.");
return "member/login";
case WRONG_PASSWORD:
model.addAttribute("msg", "๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
return "member/login";
case SUCCESS:
session.setAttribute("loginId", dto.getId()); // *** ์ด๋ถ๋ถ
return "redirect:/";
}
return "member/login";
}
๋ก๊ทธ์ธ ์ฑ๊ณต์ session.setAttribute๋ฅผ ํตํด JSESSIONID=abc1234๊ฐ์ ์ฟ ํค๊ฐ ์๋์ผ๋ก ์ฌ์ด์ ธ
๋ก๊ทธ์ธ ํ ์ฌ๋์ ์๋ณํ ์ ์๊ฒ๋ฉ๋๋ค.
๋ก๊ทธ์์์ setAttributeํ๋ ๋ถ๋ถ์ session.invalidate()๋ฅผ ํตํด ์ง์์ฃผ์๋ฉด ๋ฉ๋๋ค.
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
๊ทธ๋์ ์ด๊ฑธ ํ ๋๋ก ๋ฉ์ธํ์ด์ง์์ ํด๋น ์ธ์ ๊ฐ์ ๋๊ฒจ์ ๋ก๊ทธ์ธ์ด ๋๋์ง ์๋๋์ง ๋๊ฒจ์ ํ๋จํด์ฃผ๋ฉด ๋ฉ๋๋ค.
@Controller
public class MainController {
@GetMapping("/")
public String index(HttpSession httpSession, Model model) {
String loginId = (String) httpSession.getAttribute("loginId");
model.addAttribute("loginId", loginId);
return "index";
}
}
HTML
<!doctype html>
<html 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">
<title>Login</title>
</head>
<body>
<div>๋ฉ์ธํ์ด์ง</div>
<a th:if="${session.loginId == null}" th:href="@{/member/login}">๋ก๊ทธ์ธ</a>
<a th:if="${session.loginId != null}" th:href="@{/member/logout}">๋ก๊ทธ์์</a>
<a th:if="${session.loginId != null}" th:href="@{/member/update}">์ ๋ณด์์ </a>
</body>
</html>
ํ์๊ฐ์
์ด์ ํ์๊ฐ์ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. id, pw, name์ not null ์กฐ๊ฑด์ผ๋ก ๋ง๋ค์์ต๋๋ค.
DTO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberDTO {
@NotBlank(message = "์์ด๋๋ ํ์์
๋๋ค.")
private String id;
@NotBlank(message = "๋น๋ฐ๋ฒํธ๋ ํ์์
๋๋ค.")
private String pw;
@NotBlank(message = "์ด๋ฆ์ ํ์์
๋๋ค.")
private String name;
private String phone;
}
Mapper
์ธํฐํ์ด์ค
@Mapper
public interface MemberMapper {
// ํ์ ๋ฑ๋ก
int insertMember(MemberDTO dto);
}
xml
<insert id="insertMember" parameterType="org.example.weeks.member.dto.MemberDTO">
insert into weeks.users (id, pw, name, phone)
values (#{id}, #{pw}, #{name}, #{phone})
</insert>
Service
์ธํฐํ์ด์ค
public interface MemberService {
// ํ์ ๋ฑ๋ก
boolean registerMember(MemberDTO dto);
}
์ํ
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {
private final MemberMapper memberMapper;
// ํ์ ๋ฑ๋ก
@Override
public boolean registerMember(MemberDTO dto) {
return memberMapper.insertMember(dto) > 0;
}
}
Controller
@PostMapping("/register")
public String register(@Valid MemberDTO dto, BindingResult bindingResult, Model model) {
// ์ ํจ์ฑ ๊ฒ์ฆ ์คํจ ์
if (bindingResult.hasErrors()) {
model.addAttribute("msg", bindingResult.getFieldError().getDefaultMessage());
return "member/register";
}
boolean result = memberService.registerMember(dto);
if(result == true){
model.addAttribute("msg", "๊ฐ์
์๋ฃ.");
return "redirect:/";
}
model.addAttribute("msg", "ํ์๊ฐ์
์ด ์คํจํ์์ต๋๋ค.");
return "member/register";
}
HTML
<!doctype html>
<html 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">
<title>ํ์๊ฐ์
</title>
</head>
<body>
<h2>ํ์๊ฐ์
</h2>
<form th:action="@{/member/register}" method="post">
<div>
<input type="text" name="id" placeholder="์์ด๋"><br/>
<input type="password" name="pw" placeholder="๋น๋ฐ๋ฒํธ"><br/>
<input type="text" name="name" placeholder="์ด๋ฆ"><br/>
<input type="text" name="phone" placeholder="ํธ๋ํฐ๋ฒํธ"><br/>
<button type="submit">๊ฐ์
</button>
</div>
</form>
<script th:if="${msg}">
alert('[[${msg}]]');
</script>
</body>
</html>
๊ฒฐ๊ณผํ๋ฉด

