프로젝트

[ bible Cash ] 로그인 시, 아이디 존재하지 않는 경우 처리, 추가로 읽은 말씀 기능

do_it_zero 2025. 2. 4. 17:30

 

MemberController
@PostMapping("/login")
public String login(@ModelAttribute LoginForm loginForm, Model model, HttpSession session){
    log.info("loginForm : {}",loginForm);
    Member findMember = memberRepository.findByUserId(loginForm.getUserId());

    if(findMember == null){
        model.addAttribute("loginError","해당 아이디는 존재하지 않습니다.");
        return "index";
    }

    session.setAttribute("member",findMember);
    model.addAttribute("id",findMember.getUserId());
    return "redirect:/home";
}

 

index.html

<form th:action="@{/login}" method="post">
    <!-- 아이디 입력란 -->
    <div class="form-group">
        <label for="userId">아이디</label>
        <input type="text" id="userId" name="userId" class="form-control"
               placeholder="아이디를 입력하세요" required>

        <!-- 오류 메시지 표시 -->
        <div th:if="${loginError}" class="text-danger mt-2">
            <i class="fas fa-exclamation-circle"></i> <span th:text="${loginError}"></span>
        </div>
    </div>

    <button type="submit" class="btn btn-primary btn-block">로그인</button>
</form>

 

 

hom.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>오늘의 말씀</title>
    <link rel="stylesheet" th:href="@{/css/style.css}">
</head>
<body>
<div class="container">
    <div class="calendar-header">
        <div class="current-month" id="yearText">2025년</div>
        <select id="monthSelect" class="dropdown"></select>
        <button class="nav-button" id="todayButton">오늘</button>
    </div>

    <div id="daysOfWeek"></div>
    <div id="calendar"></div>

    <div class="footer">
        <!-- '오늘의 말씀' 버튼을 link로 감싸지 않고, 클릭 이벤트로 처리하도록 수정 -->
        <button class="verse-button" id="verseButton">오늘의 말씀</button>

        <h2>말씀 읽은 순위</h2>
        <div th:each="entry : ${groupedRanking}">
            <span th:text="|${entry.key}등 |"></span>

            <!-- 순위 내 멤버들의 이름(그룹) 형식으로 출력 -->
            <span th:each="member, iterStat : ${entry.value}">
        <span th:text="${member.name} + '(' + ${member.memberGroup} + ')'"></span>

                <!-- 마지막 멤버가 아니면 쉼표 추가 -->
        <span th:if="!${iterStat.last}">, </span>
    </span><br/>
        </div>

        <h2>그룹별 읽은 장 수</h2>
        <div th:each="groupReadCount : ${groupReadCountDtos}">
            <span th:text="${groupReadCount.memberGroup} + ' 총 ' + ${groupReadCount.totalReadCount} + '장'"></span>
            <br/>
        </div>

        <h3>추가로 읽은 말씀</h3>
        <form id="additionalVerseForm" th:action="@{/add}" method="post">
            <div class="additional-verse">
                <input type="number" id="additionalVerseInput" name="additionalVerse" class="number-input" required>
                <button type="submit" class="verse-button" id="additionalVerseButton">추가</button>
            </div>
        </form>
    </div>

</div>

<!-- JavaScript -->
<script th:src="@{/js/calendar.js}"></script>
</body>
</html>

 

MemberController
@PostMapping("/add")
public String addAdditionalVerse(@RequestParam("additionalVerse") int additionalVerse,HttpSession session) {
    log.info("추가 읽은 구절 수: {}", additionalVerse);
    Member member = (Member)session.getAttribute("member");
    log.info("member : {}",member.getName());
    memberRepository.incrementReadCount(member.getIdx(),additionalVerse);
    return "redirect:/home"; // 홈 화면으로 리디렉트
}

 

MemberRepository
@Modifying
@Transactional
@Query("UPDATE Member m SET m.readCount = COALESCE(m.readCount, 0) + :increment WHERE m.idx = :idx")
void incrementReadCount( Long idx,  int increment);