Spring/JPA + Security

[Spring Data JPA] 구독하기 구현하기 -5 구독 정보 모달 Ajax 연동하기 , javascript를 통한 동적인 뷰 렌더링

pyogowoon 2023. 1. 11. 17:49

 

구독정보 누를시 띄워지는 모달에 데이터를 받아오고자 한다.

profile.jsp

<div class="subscribe">
   <ul>
      <li><a href=""> 게시물<span>${dto.imageCount}</span>
      </a></li>
      <li><a href="javascript:subscribeInfoModalOpen(${dto.user.id});"> 구독정보<span>${dto.subscribeCount}</span>
      </a></li>
   </ul>
</div>

클릭 시 모달을 띄워주는 자바스크립트에 id값을 넣어서 보낸다.

 

function subscribeInfoModalOpen(pageUserId) {
   $(".modal-subscribe").css("display", "flex");
}

 이렇게 함수의 인자로 받아주고

function subscribeInfoModalOpen(pageUserId) {
   $(".modal-subscribe").css("display", "flex");

    $.ajax({

      type:"get",
      url:`/api/user/${pageUserId}/subscribe`,
      dataType: "json"

    }).done(res =>{
        console.log(res.data);
    }).fail(error =>{
        console.log("구독정보 불러오기 실패" , error);
    });
 
 

실행 결과 data가 잘넘어온다.

 

이제 이 넘어온 data를 가지고 jsp에서 EL태그로 뿌려줘야하는데, Ajax의 결과에 따라 다르게 뿌려주기 위해

javascript로 진행한다.

 

 

 

 

    <div class="subscribe-list" id="subscribeModalList">

         <div class="subscribe__item" id="subscribeModalItem-1">
            <div class="subscribe__img">
               <img src="#" onerror="this.src='/images/person.jpeg'"/>
            </div>
            <div class="subscribe__text">
               <h2>love</h2>
            </div>
            <div class="subscribe__btn">
               <button class="cta blue" onclick="toggleSubscribeModal(this)">구독취소</button>
            </div>
         </div>


         <div class="subscribe__item" id="subscribeModalItem-2">
            <div class="subscribe__img">
               <img src="#" onerror="this.src='/images/person.jpeg'"/>
            </div>
            <div class="subscribe__text">
               <h2>ssar</h2>
            </div>
            <div class="subscribe__btn">
               <button class="cta blue" onclick="toggleSubscribeModal(this)">구독취소</button>
            </div>
         </div>
      </div>
   </div>

</div>


<script src="/js/profile.js"></script>

<%@ include file="../layout/footer.jsp"%>

 

 

 

 

바꾼 후 코드

<div class="subscribe-list" id="subscribeModalList">




      </div>
   </div>

</div>


<script src="/js/profile.js"></script>

<%@ include file="../layout/footer.jsp"%>

 

div 클래스 subscribe-list 밑의 코드들을 잠시 잘라내기 해줍니다.

 잘라낸 이유는 JAVASCRIPT를 통하여 ajax결과에 따라 다른 div를 보여주기 위함

 

function getSubscribeModalItem() {
        let item =``
        
        return item;
}

 

javascript 에 함수를 만들고 let item = ``  , return item; 을 선언     `` -> 이거는 백틱으로 esc키 아래에있음

 

function subscribeInfoModalOpen(pageUserId) {
   $(".modal-subscribe").css("display", "flex");

    $.ajax({

      type:"get",
      url:`/api/user/${pageUserId}/subscribe`,
      dataType: "json"

    }).done(res =>{
        console.log(res.data);

        res.data.forEach((u) => {
        let item = getSubscribeModalItem(u);
        $(".subscribe-list").append(item);
        });
    }).fail(error =>{
        console.log("구독정보 불러오기 실패" , error);
    });


}

ajax에 forEach 문을 추가해줍니다. done(성공) 시 res.data 에 담긴 user정보 값을 u라는 변수이름으로 반복해서

 u로 getSubscribeModalItem 에 매개변수로 보내서  함수에서 인자로 받아서 유저정보를 EL태그로 처리한 후

처리가 된 let item에 담긴 HTML코드들을

 $(".subscribe-list").append(item) 을 통해  div class="subscribe-list" 를 가진 곳에 append(추가) 하는 과정입니다.

 꾀나 복잡합니다 이해가 중요합니다.

 

잠시 잘라놓은 div들을 복사붙여넣기 합니다.  백틱 사이에 붙여넣기를 하고,

 

function getSubscribeModalItem(u) {
        let item =`
        <div class="subscribe__item" id="subscribeModalItem-${u.id}">
                <div class="subscribe__img">
                    <img src="/upload/${u.profileImageUrl}" onerror="this.src='/images/person.jpeg'"/>
                </div>
                <div class="subscribe__text">
                    <h2>${u.username}</h2>
                </div>
                <div class="subscribe__btn">
                    <button class="cta blue" onclick="toggleSubscribeModal(this)">구독취소</button>
                </div>
            </div>`;


        return item;
}

 

 

 

마지막으로 모달 떴을때 구독하기- 구독취소는 맨 처음 만든 구독하기취소와 로직이 아예 똑같기 떄문에

function getSubscribeModalItem(u) {

    let item = `<div class="subscribe__item" id="subscribeModalItem-${u.id}">
                    <div class="subscribe__img">
                        <img src="/upload/${u.profileImageUrl}" onerror="this.src='/images/person.jpeg'"/>
                    </div>
                    <div class="subscribe__text">
                        <h2>${u.username}</h2>
                    </div>
                    <div class="subscribe__btn">`;
                    if(!u.equalUserState){ //동일 유저가 아닐때 버튼이 만들어져야함
                        if(u.subscribeState){
                      item+=`  <button class="cta blue" onclick="toggleSubscribe(${u.id}, this)">구독취소</button>`;
                        }else{ //구독 안한상태
            `<button class="cta" onclick="toggleSubscribe(${u.id}, this)">구독하기</button>`;
                        }

                 }
                        item +=`
                    </div>
                </div>
`


    return item;

}

 *백틱의 위치에 유의해야 한다. 중간 if문을 넣었고 if문은 백틱으로 할 필요가 없기때문에 if문의 영역은 백틱을 적용하지않았고 백틱이 시작되는 지점에선 item += 을 붙여주었다.

 

모달정보 안에서의 구독하는 방법은 현재 profile.jsp 에 있는 구독하기, 구독취소와 로직이 아예 똑같다,

 다만 지금은 js에서 데이터를 다루고 있기때문에 dto.user.id -> u.id 로 바꿔주는것이 맞다.

 

 

onclick="toggleSubscribeModal --> "toggleSubscribe" 로 변경하였고 매개변수에 toUserId 가 필요했었으므로

배열로 오브젝트에 담아서 가져온 ${u.id}를 매개변수로 넣어주면 끝.

 

모달에서도 구독취소 / 구독하기가 잘 작동한다.