1. info 리스트 출력
- 컨텐츠 테이블 type_id 로 조회
select * from content_tb where CONTENT_TYPE_ID = 12 limit 10;
- contentReposiroty
리턴되는 데이터가 많아 
query.setMaxResults(10); 넣어놓음 public List<Content> findByContentTypeId(String contentTypeId) {
    Query query = em. createQuery("select c from Content c where c.contentTypeId = :contentTypeId", Content.class);
    query.setParameter("contentTypeId", contentTypeId);
    query.setMaxResults(10);
    List<Content> contentList = query.getResultList();
    return contentList;
}- contentService
public ContentResponse.infoListDTO 정보컨텐츠(String contentTypeId){
    List<Content> contentList = contentRepository.findByContentTypeId(contentTypeId);
    return new ContentResponse.infoListDTO(contentList);
}- 리턴을 위한 dto
이미지가 없는 경우가 있어 빈 문자열 일 때는 임의로 지정한 이미지가 들어가도록 함.
public class ContentResponse {
    @Data
    public static class infoListDTO{
        private List<ContentDTO> contents = new ArrayList<>();
       
        public infoListDTO(List<Content> contentList) {
            for (Content content : contentList) {
                this.contents.add(new ContentDTO(content));
            }
       
        }
        @Data
        public static class ContentDTO {
            private String title;
            private String contentId;
            private String addr1;
            private String areaCode;
            private String contentTypeId;
            private String firstImage;
            // Content 엔티티를 DTO로 변환
            public ContentDTO(Content content) {
                this.title = content.getTitle();
                this.contentId = content.getContentId();
                this.addr1 = content.getAddr1();
                this.areaCode = content.getAreaCode();
                this.contentTypeId = content.getContentTypeId();
                this.firstImage = content.getFirstImage();
                if(this.firstImage == ""){
                    this.firstImage="/images/noimg.jpg";
                }
            }
        }
    }
}- mustache
{{#model.contents}}
	<div class="place__content__box">
	    <div style="display: none" name="contentId">{{contentId}}</div>
	        <img src="{{firstImage}}">
	    <div class="place__content__wrapper">
	        <div>{{title}}</div>
	        <div>{{addr1}}</div>
	        <div>40년 전통의 손맛을 자랑하고 있는 손두부전문점</div>
	        <div>해시태그 # 해시 해시# 해시 </div>
	    </div>
	    <div class="place__content__more">
	        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
	            class="bi bi-three-dots-vertical" viewBox="0 0 16 16">
	            <path
	                d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0" />
	        </svg>
	    </div>
	</div>
	{{/model.contents}}
지역의 설명 부분이 없다 ㅠ.ㅠ…
2. info 조회 count 추가

- repository
고민되는 점 : contentTypeId 만 매개변수로 받고 있어 area.code, sigungu.code 는 대응 못함.
public long countByContentTypeId(String contentTypeId) {
    Query query = em.createQuery("select count(*) from Content where contentTypeId = :contentTypeId");
    query.setParameter("contentTypeId", contentTypeId);
    return (Long) query.getSingleResult();
}- mustache

3. 지역 (area) 추가

- AreaRepositotry
area 는 모든 내용을 리턴하기 때문에 쿼리문이 간단.
그러나 
sigungu 엔티티와 양방향 매핑 되어있기 때문에 DTO 가 필수이다.    public List<Area> findAll(){
        Query query = em.createQuery("SELECT a FROM Area a", Area.class);
        List<Area> areaList = query.getResultList();
        return areaList;
    }- service
public ContentResponse.infoListDTO 정보컨텐츠(String contentTypeId){
      long count = contentRepository.countByContentTypeId(contentTypeId);
      List<Content> contentList = contentRepository.findByContentTypeId(contentTypeId);
      List<Area> areaList = areaRepository.findAll();
      return new ContentResponse.infoListDTO(contentList, count, areaList);
}위의 코드와 동일한 페이지에서 나타나기 때문에 같은 DTO 에 데이터 매핑 해야함.
- DTO
저부분이 추가되어야함..! 
public class ContentResponse {
    @Data
    public static class infoListDTO{
        private long count;
        private List<ContentDTO> contents = new ArrayList<>();
        private List<AreaDTO> areas = new ArrayList<>();
        public infoListDTO(List<Content> contentList, long count, List<Area> areaList) {
            this.count = count;
            for (Content content : contentList) {
                this.contents.add(new ContentDTO(content));
            }
            for(Area area : areaList) {
                this.areas.add(new AreaDTO(area));
            }
        }
        @Data
        public static class AreaDTO{
            private String code;
            private String name;
            public AreaDTO(Area area) {
                this.code = area.getCode();
                this.name = area.getName();
            }
        }
    }
}
- mustache
  <div class="place__box2">
            <div class="place__name1">
                <div>#전국</div>
                {{#model.areas}}
                    <div name="code" value="{{code}}">#{{name}}</div>
                {{/model.areas}}
            </div>
다음 개발에서는

area 가 클릭 되었을 때 아래의 
sigungu 항목이 동적으로 출력되어야 한다.
이는 ajax 를 사용하여 동적 출력을 해야함.

지역을 클릭했을 때 바뀌어야 하는 부분들…
ajax 와 치열한 싸움이 예상된다. 👍
Share article

