๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

๊ฒฐ๊ณผํ™”๋ฉด

๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ๋กœ๊ทธ์ธ๋ฒ„ํŠผ์ด ๋œจ๊ณ , ๋กœ๊ทธ์ธ์ด ๋˜๋ฉด ๋กœ๊ทธ์•„์›ƒ๊ณผ ์ •๋ณด์ˆ˜์ •๋ฒ„ํŠผ์ด ์ƒ๊น๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ

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>

๊ฒฐ๊ณผํ™”๋ฉด

 

๋ฐ˜์‘ํ˜•