Vue.js 3 & NodeJS/NodeJS

Node.js 레스트 API 업데이트 (카테고리, 베스트 탑) - Node.js REST API, Board-API Category, Best Top

carrotweb 2022. 5. 22. 14:56
728x90
반응형

블로그처럼 게시물들을 카테고리 별로 구분하여 표시되게 하고 카테고리 별로 좋아요(추천) 또는 조회 수가 많은 게시물 리스트를 가져오도록 하겠습니다.

 

 

게시판 카테고리 가져오기

 

1. C:\workspaces\nodeserver\testrestapi\boardapi.js 파일을 오픈하여 게시판 카테고리 전체를 리턴하는 라우터를 추가합니다.

 

HTTP GET 메서드로 요청(Request)이 들어오면 게시판 카테고리 배열 전체를 리턴합니다.

router.get('/categorys', function(req, res, next) {
	console.log("REST API Get Method - Read categoryList");
	res.json({success:true, data:categoryList});
});

 

2. npm run 명령어로 실행합니다.

npm run start

 

3. Postman(포스트맨)를 실행하여 게시판 카테고리를 가져오기 위해 GET Method로 호출합니다.

http://localhost:9000/boards/categorys

리턴 값에 success가 true이고 data에 게시판 카테고리를 가져옵니다.

{
    "success": true,
    "data": [
        "전체",
        "일상",
        "쇼핑",
        "노하우",
        "애견/반려동물"
    ]
}

 

 

게시판 카테고리 별 베스트 탑 가져오기

 

1. C:\workspaces\nodeserver\testrestapi\boardapi.js 파일에 게시판 카테고리 별로 좋아요(추천) 또는 조회 수에 대한 베스트 탑을 리턴하는 라우터를 추가합니다.

 

카테고리 별로 좋아요(추천) 또는 조회 수에 대한 베스트 탑을 가져오는 함수의 공통점은 카테고리로 필터하고 좋아요(추천) 또는 조회 수를 기준으로 내림차순으로 정렬하면 됩니다. 그래서 필터와 정렬 메서드 사용하여 공통 함수를 먼저 만들겠습니다.

 

함수는 응답 객체(res), 카테고리(catogory - 필터 할 카테고리), 정렬 기준(sortby - 내림차순으로 정렬할 칼럼), 탑(top - 가져올 데이터 수)을 파라미터로 전달받아 처리하겠습니다.

function getCategoryBest(res, category, sortby, top) {
}

 

카테고리가 배열을 사용하기 때문에 0이하이거나 카테고리 배열보다 크면 0으로 처리하게 하고 카테고리가 0 이면 카테고리가 지정되지 않았으므로 상태 코드를 404 에러와 에러 메시지를 리턴합니다.

그리고 탑(top)이 설정되지 않거나 0이하이면 3으로 처리하고 10 이상이면 10으로 처리합니다.

category = parseInt(category);
if (isNaN(category) || category <= 0 || category >= category.length) {
	category = 0;
}
if (top == undefined || typeof top == "undefined" || top == null) {
	top = 3;
} else {
	top = parseInt(top);
	if (isNaN(top) || top <= 0) {
		top = 3;
	} else if (top > 10) {
		top = 10;
	}
}

if (category == 0) {
	res.status(404);
	res.json({success:false, errormessage:'not found'});
} else {
}

 

필터와 정렬 메서드를 사용하여 지정된 카테고리만 필터하고 지정된 칼럼으로 내림차순 정렬합니다.

var condition = { category: "eq:" + category };
// 필터된 게시판
var filteredBoardList = filter.filtering(condition, boardList);
if (filteredBoardList.length == 0) {
	res.status(404);
	res.json({success:false, errormessage:'not found'});
} else {
	// 정렬
	sort.sortBy(filteredBoardList, sortby + ".desc");
}

 

필터되고 정렬된 리스트를 리턴합니다.

전체 소스입니다.

function getCategoryBest(res, category, sortby, top) {
	category = parseInt(category);
	if (isNaN(category) || category <= 0 || category >= category.length) {
		category = 0;
	}
	if (top == undefined || typeof top == "undefined" || top == null) {
		top = 3;
	} else {
		top = parseInt(top);
		if (isNaN(top) || top <= 0) {
			top = 3;
		} else if (top > 10) {
			top = 10;
		}
	}
	
	if (category == 0) {
		res.status(404);
		res.json({success:false, errormessage:'not found'});
	} else {
		var condition = { category: "eq:" + category };
		// 필터된 게시판
		var filteredBoardList = filter.filtering(condition, boardList);
		if (filteredBoardList.length == 0) {
			res.status(404);
			res.json({success:false, errormessage:'not found'});
		} else {
			// 정렬
			sort.sortBy(filteredBoardList, sortby + ".desc");
			if (top > filteredBoardList.length) {
				top = filteredBoardList.length;
			}
			
			var boardPageList = [];
			for (var index = 0; index < top; index++) {
				var boardItem = filteredBoardList[index];
				
				var boardPageItem = {};
				boardPageItem.no = boardItem.no;
				boardPageItem.subject = boardItem.subject;
				if (boardItem.content.length > 100) {
					boardPageItem.content = boardItem.content.substr(0, 100);
				} else {
					boardPageItem.content = boardItem.content;
				}
				boardPageItem.writer = boardItem.writer;
				var memberInfo = getMember(boardItem.writer);
				boardPageItem.writerName = memberInfo.name;
				boardPageItem.writerNickname = memberInfo.nickname;
				boardPageItem.writerProfile = memberInfo.profile;
				boardPageItem.writedate = boardItem.writedate;
				boardPageItem.poster = "/asset/board/files/" + boardItem.poster;
				boardPageItem.viewcount = boardItem.viewcount;
				boardPageItem.categoryText = categoryList[boardItem.category];
				boardPageItem.likecount = boardItem.likecount;
				boardPageList.push(boardPageItem);
			}
			res.json({success:true, data:boardPageList});
		}
	}
}

 

 

2. HTTP GET 메서드로 게시판 카테고리(category)가 포함되어서 요청(Request)이 들어오면 게시판 배열에서 카테고리로 필터하고 좋아요(추천) 칼럼을 기준으로 내림차순 정렬하여 게시물 리스트를 리턴합니다.

router.get('/bestliketop/:category', function(req, res, next) {
	console.log("REST API Get Method - Read " + req.params.category + " Best Like Top");
	
	var category = req.params.category;
	var top = req.query.top;
	
	getCategoryBest(res, category, "likecount", top);
});

 

3. HTTP GET 메서드로 게시판 카테고리(category)가 포함되어서 요청(Request)이 들어오면 게시판 배열에서 카테고리로 필터하고 조회 수 칼럼을 기준으로 내림차순 정렬하여 게시물 리스트를 리턴합니다.

router.get('/bestviewtop/:category', function(req, res, next) {
	console.log("REST API Get Method - Read " + req.params.category + " Best View Top");
	
	var category = req.params.category;
	var top = req.query.top;
	
	getCategoryBest(res, category, "viewcount", top);
});

 

4. npm run 명령어로 실행합니다.

npm run start

 

5. Postman(포스트맨)를 실행하여 좋아요(추천) 베스트 탑을 가져오기 위해 GET Method로 호출합니다.

http://localhost:9000/boards/bestliketop/2

{
    "success": true,
    "data": [
        {
            "no": 2,
            "subject": "아이스크림 틀 리뷰~ 집에서 즐겨요.",
            "content": "안녕하세요. 맘입니다.^^\n날씨가 더워지는 요즘 아이들이 시원한 음료수나 아이스크림을 많이 찾습니다.\n그래서 음료수로 간단하게 아이스크림을 만들 수 있는 틀을 리뷰하려고 합니다.",
            "writer": "testid2",
            "writerName": "김철수",
            "writerNickname": "댕댕이맘",
            "writerProfile": "/asset/member/profile/testid2.jpg",
            "writedate": "2021-08-09 13:10:00",
            "poster": "/asset/board/files/2.png",
            "viewcount": 10,
            "categoryText": "쇼핑",
            "likecount": 100
        },
        {
            "no": 13,
            "subject": "푸짐하고 맛이 괜찮았던 국물 라뽁이",
            "content": "안녕하세요. 저는 우리나라에서 파는 모든 국물 라뽁이를 먹고 소개드리고자 하는 라짱입니다.\n저는 주말을 맞아 국물맛 괜찮은 라뽁이를 리뷰해 드리고자 합니다.",
            "writer": "testid1",
            "writerName": "홍길동",
            "writerNickname": "나혼자",
            "writerProfile": "/asset/member/profile/testid1.jpg",
            "writedate": "2022-03-27 00:30:00",
            "poster": "/asset/board/files/13.png",
            "viewcount": 25,
            "categoryText": "쇼핑",
            "likecount": 40
        },
        {
            "no": 8,
            "subject": "휴대용 UV 살균기",
            "content": "코로나로 집 받을 나갔다오면 핸드폰부터 가방, 옷까지 혹시나 하는 생각에 찜찜함이 있었다.\n그래서 쇼핑몰을 검색해보니 UV 살균기를 휴대할 수 있는 제품들이 많이 있었다.\n그 중에",
            "writer": "testid2",
            "writerName": "김철수",
            "writerNickname": "댕댕이맘",
            "writerProfile": "/asset/member/profile/testid2.jpg",
            "writedate": "2022-03-26 18:40:00",
            "poster": "/asset/board/files/8.png",
            "viewcount": 60,
            "categoryText": "쇼핑",
            "likecount": 30
        }
    ]
}

 

조회 수 베스트 탑을 가져오기 위해 GET Method로 호출합니다.

top를 2로 하여 2개만 가져오게 합니다.

http://localhost:9000/boards/bestviewtop/1?top=2

{
    "success": true,
    "data": [
        {
            "no": 10,
            "subject": "통밀과자 만들기 체험",
            "content": "오늘은 강원도에 있는 통밀과자를 만들 수 있는 체험장을 다녀왔습니다.\n아침 9시부터 11시까지 두시간 동안 가족들과 함께 빵 체험과 통밀과자를 만들었습니다.",
            "writer": "testid1",
            "writerName": "홍길동",
            "writerNickname": "나혼자",
            "writerProfile": "/asset/member/profile/testid1.jpg",
            "writedate": "2022-03-26 21:00:00",
            "poster": "/asset/board/files/10.png",
            "viewcount": 80,
            "categoryText": "일상",
            "likecount": 40
        },
        {
            "no": 9,
            "subject": "이케아 광명점에서 폭풍 구매",
            "content": "안녕하세요! ㅎㅎ 오랜만에 일상으로 인사드립니다.\n사실 집에만 있다가 코에 바람도 넣을 겸 드라이브도 할 겸 이케아 광명점에 왔습니다.\n오늘 이케아에서 폭풍 구매한 내역을 공개하고",
            "writer": "testid3",
            "writerName": "이영희",
            "writerNickname": "만물상",
            "writerProfile": "/asset/member/profile/testid3.jpg",
            "writedate": "2022-03-26 19:50:00",
            "poster": "/asset/board/files/9.png",
            "viewcount": 70,
            "categoryText": "일상",
            "likecount": 10
        }
    ]
}

 

반응형

 

 

게시판 카테고리 좋아요(추천) 베스트 탑 가져오기

 

1. C:\workspaces\nodeserver\testrestapi\boardapi.js 파일에 게시판 카테고리 별로 좋아요(추천)가 제일 높은 게시물 하나씩을 리턴하는 라우터를 추가합니다.

router.get('/bestcategoryliketop', function(req, res, next) {
	console.log("REST API Get Method - Read Best Category Top");
}

 

카테고리 수만큼 탑 배열을 초기화하고 게시판 배열 전체를 for() 문으로 돌면서 카테고리 별로 좋아요(추천)가 제일 높은 게시물을 추출합니다.

var categoryTopList = [];
for (var index = 0; index < categoryList.length; index++) {
	categoryTopList[index] = null;
}

for (var index = 0; index < boardList.length; index++) {
	var boardItem = boardList[index];
	var category = boardItem.category;
	if (categoryTopList[category] == null) {
		categoryTopList[category] = boardItem;
	} else {
		if (categoryTopList[category].likecount <= boardItem.likecount) {
			categoryTopList[category] = boardItem;
		}
	}
}

 

추출한 게시물 리스트를 리턴합니다.

전체 소스입니다.

router.get('/bestcategoryliketop', function(req, res, next) {
	console.log("REST API Get Method - Read Best Category Top");
	
	var categoryTopList = [];
	for (var index = 0; index < categoryList.length; index++) {
		categoryTopList[index] = null;
	}
	
	for (var index = 0; index < boardList.length; index++) {
		var boardItem = boardList[index];
		var category = boardItem.category;
		if (categoryTopList[category] == null) {
			categoryTopList[category] = boardItem;
		} else {
			if (categoryTopList[category].likecount <= boardItem.likecount) {
				categoryTopList[category] = boardItem;
			}
		}
	}
	
	var boardPageList = [];
	for (var index = 1; index < categoryTopList.length; index++) {
		var categoryTopItem = categoryTopList[index];
		
		var boardPageItem = {};
		boardPageItem.no = categoryTopItem.no;
		boardPageItem.subject = categoryTopItem.subject;
		if (categoryTopItem.content.length > 100) {
			boardPageItem.content = categoryTopItem.content.substr(0, 100);
		} else {
			boardPageItem.content = categoryTopItem.content;
		}
		boardPageItem.writer = categoryTopItem.writer;
		var memberInfo = getMember(categoryTopItem.writer);
		boardPageItem.writerName = memberInfo.name;
		boardPageItem.writerNickname = memberInfo.nickname;
		boardPageItem.writerProfile = memberInfo.profile;
		boardPageItem.writedate = categoryTopItem.writedate;
		boardPageItem.poster = "/asset/board/files/" + categoryTopItem.poster;
		boardPageItem.viewcount = categoryTopItem.viewcount;
		boardPageItem.categoryText = categoryList[categoryTopItem.category];
		boardPageItem.likecount = categoryTopItem.likecount;
		boardPageList.push(boardPageItem);
	}
	res.json({success:true, data:boardPageList});
});

 

2. npm run 명령어로 실행합니다.

npm run start

 

3. Postman(포스트맨)를 실행하여 카테고리 좋아요(추천) 베스트 탑을 가져오기 위해 GET Method로 호출합니다.

http://localhost:9000/boards/bestcategoryliketop

{
    "success": true,
    "data": [
        {
            "no": 7,
            "subject": "포켓몬 득템",
            "content": "친구한테 받은 편의점 1만원 모바일상품권으로 편의점에 간식 사러 들렸습니다.\n그런데 운이 좋았는지 포켓몬 빵이 하나 남아 있었습니다. 망설임 없이 바로 빵과 과자, 음료수 구매했습",
            "writer": "testid1",
            "writerName": "홍길동",
            "writerNickname": "나혼자",
            "writerProfile": "/asset/member/profile/testid1.jpg",
            "writedate": "2022-03-26 17:30:00",
            "poster": "/asset/board/files/7.png",
            "viewcount": 50,
            "categoryText": "일상",
            "likecount": 50
        },
        {
            "no": 2,
            "subject": "아이스크림 틀 리뷰~ 집에서 즐겨요.",
            "content": "안녕하세요. 맘입니다.^^\n날씨가 더워지는 요즘 아이들이 시원한 음료수나 아이스크림을 많이 찾습니다.\n그래서 음료수로 간단하게 아이스크림을 만들 수 있는 틀을 리뷰하려고 합니다.",
            "writer": "testid2",
            "writerName": "김철수",
            "writerNickname": "댕댕이맘",
            "writerProfile": "/asset/member/profile/testid2.jpg",
            "writedate": "2021-08-09 13:10:00",
            "poster": "/asset/board/files/2.png",
            "viewcount": 10,
            "categoryText": "쇼핑",
            "likecount": 100
        },
        {
            "no": 6,
            "subject": "모종심기와 화분 분갈이 방법",
            "content": "예전에 배란다를 보니 화초들이 상태가 말이 아니더라고요.\n이러면 안되겠다는 생각이 들어서 조금씩 관리하기 시작하였습니다.\n저와 같은 분들이 많이 있을 것 같아서 저만의 화초 관리 ",
            "writer": "testid3",
            "writerName": "이영희",
            "writerNickname": "만물상",
            "writerProfile": "/asset/member/profile/testid3.jpg",
            "writedate": "2022-03-26 16:20:00",
            "poster": "/asset/board/files/6.png",
            "viewcount": 40,
            "categoryText": "노하우",
            "likecount": 70
        },
        {
            "no": 5,
            "subject": "가평 애견펜션 - 아침고요수목원 근처",
            "content": "봄맞이 나들이 겸 댕댕이 퍼피와 함께 아침고요수목원 근처에 있는 애견펜션에 놀러 갔어요.\n아침고요수목원 근처라 찾아가기 쉽고 사장님도 친절하십니다.",
            "writer": "testid2",
            "writerName": "김철수",
            "writerNickname": "댕댕이맘",
            "writerProfile": "/asset/member/profile/testid2.jpg",
            "writedate": "2022-03-26 15:10:00",
            "poster": "/asset/board/files/5.png",
            "viewcount": 30,
            "categoryText": "애견/반려동물",
            "likecount": 90
        }
    ]
}
728x90
반응형