웹/Spring vue 웹 개발

spring vue swagger 변경 작업01

컴퓨터과학 2023. 12. 3. 19:47

2023.11.27 - [웹/Spring vue 웹 개발] - spring vue swagger 사용 및 controller,serivce 코드 완료

 

spring vue swagger 사용 및 controller,serivce 코드 완료

2023.11.26 - [웹/Spring vue 웹 개발] - spring vue jpa repository 테스트코드 spring vue jpa repository 테스트코드이전글: 2023.11.25 - [웹/Spring vue 웹 개발] - spring vue entity 변경 spring vue entity 변경 테이블을 이번에 전

kwaksh2319.tistory.com

 

이번주 이상하게 사적인 일들이 많다보니 공부를 조금 많이 못했습니다.

그래도 swagger에서 테스트 안되던 문제들은 해결했고요. 조만간 다른 컨트롤러들도 전부 변경 예정입니다. 현재는 usersController만 완료되었습니다.

지금 결과도 올바르게 나옵니다.

결과: 

 

추가된 내용 :

commonserivce

package kr.co.kshproject.webDemo.Common;

import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

@Service
public class CommonService {
    public <T> Long findAllCount(EntityManager entityManager ,CriteriaBuilder cb,Class<T> entityClass) {
        CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
        Root<T> root = countQuery.from(entityClass);
        countQuery.select(cb.count(root));
        return entityManager.createQuery(countQuery).getSingleResult();
    }
}

 

usersRepositoryImpl

package kr.co.kshproject.webDemo.Domain.Users;

import kr.co.kshproject.webDemo.Common.CommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Root;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

@Repository
public class UsersCustomRepositoryImpl implements UsersCustomRepository{
    @PersistenceContext
    private EntityManager entityManager;

    private final CommonService commonService;

    @Autowired
    public UsersCustomRepositoryImpl( CommonService commonService){
        this.commonService=commonService;
    }

    @Override
    public Optional<Users> findById(Long id) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        //Notice 사용 이유는 댓글들을 불러오기때문
        CriteriaQuery<Users> cq = cb.createQuery(Users.class);
        Root<Users> user = cq.from(Users.class);
        user.fetch("comments", JoinType.LEFT);
        user.fetch("notices", JoinType.LEFT);
        user.fetch("baskets", JoinType.LEFT);
        user.fetch("orders", JoinType.LEFT);

        cq.where(cb.equal(user.get("id"), id));
        //cq 쿼리 실행
        TypedQuery<Users> query = entityManager.createQuery(cq);
        List<Users> result = query.getResultList();
        //삼항 연산자 result 비엇을시 empty() 존재지 resutl 리턴
        return result.isEmpty() ? Optional.empty(): Optional.of(result.get(0));
    }

    @Override
    public List<UsersDTO> findAllDto() {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<UsersDTO> cq = cb.createQuery(UsersDTO.class);
        Root<Users> user = cq.from(Users.class);
        cq.select(cb.construct(
                UsersDTO.class,
                user.get("id"),
                user.get("username"),
                user.get("email"),
                user.get("name"),
                user.get("level"),
                user.get("password")
        ));
        TypedQuery<UsersDTO> query = entityManager.createQuery(cq);

        return query.getResultList();
    }

    @Override
    public Map<String,List> findAll(int page, int size) {
        List<Long> totalSize =new LinkedList<>();
        Map<String,List> userDTOList=new ConcurrentHashMap<>();

        //Criteria API 사용
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        //NoticeDTO <= Notice 커멘트 사용하지 않기 위함
        CriteriaQuery<UsersDTO> cq = cb.createQuery(UsersDTO.class);

        //from 절
        Root<Users> user = cq.from(Users.class);

        cq.select(cb.construct(
                UsersDTO.class,
                user.get("id"),
                user.get("username"),
                user.get("email"),
                user.get("name"),
                user.get("level"),
                user.get("password")
        ));
        //cq 쿼리 실행
        TypedQuery<UsersDTO> query = entityManager.createQuery(cq);
        //게시판 총사이즈
        Long tSize=commonService.findAllCount(entityManager,cb,Users.class);
        tSize=tSize/size+1;
        totalSize.add(tSize);

        //cq 쿼리 실행 후 페이지 갯수만큼 불러오기
        query.setFirstResult( (page-1) *size);
        query.setMaxResults(size);

        //맵리스트 저장
        userDTOList.put("lists",query.getResultList());
        userDTOList.put("totalSize",totalSize);

        //결과값 리턴
        return userDTOList;
    }
}