첫 번째 개인 프로젝트 - URL-Shortener
https://github.com/shinychan95/url-shortener
첫 주에 했던 프로젝트 refactoring을 이제서야 시작해 끝을 냈다. 설날동안 미뤘던 refactoring과 블로그 정리를 마치겠다는 포부를 이제 시작했는데, 월요일까지 끝을 보도록 하겠다🙋♂️
우선 이 기능은 사용해왔지만, 서비스로써 존재하는 것과 용어에 대해서는 처음 알게 되었다. 그래서 나름 새로웠고 흥미가 들었다. 또 간단하지만, 프론트 및 백 엔드 개발을 모두 해야 하는, 기본 능력을 한번 짚고 넘어가는 느낌의 프로젝트라 한번 제대로 하고 싶었다.
프로젝트의 필수 기능은 아래와 같았다.
~보여주기 민망해 refactoring 후 결과만 공개해본다.~
~(사실 서버는 다른 사람의 글을 거의 참고 및 이해만 했었고, 나는 프론트 부분만 작업했다고 봐도 무방하다.)~
매번 그러했듯이 나는 참고할만한 사이트를 찾았고, 이를 바탕으로 만들어가기 시작했다.
참고 사이트
그리고 후하고 값진 피드백을 어마무시하게 들었다. 도움이 되는 만큼 나의 현 상태를 깊게 되돌아보는 순간이었다.
~(자세한 부분은 길 것 같아서 깔끔하게 정리해본다)~
// 기존 코드
// 그저 모듈을 이용해서 shorten id를 생성하여 사용
app.post("/api/urlshortner", async (req, res) => {
const { originalUrl, shortBaseUrl } = req.body;
if (validUrl.isUri(shortBaseUrl)) {
} else {
return res
.status(401)
.json(
"Invalid Base Url"
);
}
const urlCode = shortid.generate();
const updatedAt = new Date();
if (validUrl.isUri(originalUrl)) {
try {
const item = await UrlShorten.findOne({ originalUrl: originalUrl });
if (item) {
res.status(200).json(item);
} else {
shortUrl = shortBaseUrl + "/" + urlCode;
const item = new UrlShorten({
originalUrl,
shortUrl,
urlCode,
updatedAt
});
await item.save();
res.status(200).json(item);
}
} catch (err) {
res.status(401).json("Invalid User Id");
}
} else {
return res
.status(401)
.json(
"Invalid Original Url"
);
}
});
~(물론 base62 변환하는 코드는 외부 자료를 참고했다.)~
// Refactoring 후
app.post("/api/urlshortner", async (req, res) => {
const { originalUrl } = req.body;
if (validUrl.isUri(originalUrl)) {
try {
const item = await UrlShorten.findOne({ originalUrl: originalUrl });
if (item) {
res.status(200).json(item);
} else { // 이후 원본 URL을 redirect 할 때 빠르게 찾기 위해서 idx
const idx = await UrlShorten.count({});
const shortened = base62.encode(idx + 10000000000000)
const item = new UrlShorten({
idx,
originalUrl,
shortened,
});
await item.save();
res.status(200).json(item);
}
} catch (err) {
res.status(401).json("Invalid User Id");
}
} else {
return res
.status(401)
.json(
"Invalid Original Url"
);
}
});
// 기존 코드
const urlShortenSchema = new Schema({
originalUrl: String,
urlCode: String,
shortUrl: String,
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
아 추가로 MongoDB는 MySQL과 다르게 String 한 종류의 데이터가 있더라
// Refactoring 후
const urlShortenSchema = new Schema({
idx: { type: Number, index: true },
originalUrl: { type: String, unique: true },
shortened: { type: String, index: true },
createdAt: { type: Date, default: Date.now },
});
String − This is the most commonly used datatype to store the data. String in MongoDB must be UTF-8 valid. ~(String 뿐이라니)~
Integer − This type is used to store a numerical value. Integer can be 32 bit or 64 bit depending upon your server.
Boolean − This type is used to store a boolean (true/ false) value.
Double − This type is used to store floating point values.
Min/ Max keys − This type is used to compare a value against the lowest and highest BSON elements.
Arrays − This type is used to store arrays or list or multiple values into one key.
Timestamp − ctimestamp. This can be handy for recording when a document has been modified or added.
Object − This datatype is used for embedded documents.
Null − This type is used to store a Null value.
Symbol − This datatype is used identically to a string; however, it's generally reserved for languages that use a specific symbol type.
Date − This datatype is used to store the current date or time in UNIX time format. You can specify your own date time by creating object of Date and passing day, month, year into it.
Object ID − This datatype is used to store the document’s ID.
Binary data − This datatype is used to store binary data.
Code − This datatype is used to store JavaScript code into the document.
Regular expression − This datatype is used to store regular expression.