어떤 앱을 만들까?
앱 만들면 재밌겠다…
커리어에 도움이 되면 좋겠다..
공부도 되면 좋겠다..
재미도 있으면 좋겠다..
돈도 벌고 싶다…
일을 마치고 자취방에 돌아와 항상 같이 사는 친구와 하는 이야기이다
상상만 하고 행복회로를 돌리며 지내다 유투브 광고에 나온 소개팅 앱!
소개팅 앱을 다운받아서 사용해보고 망할 외모지상주의에 환멸을 느끼고
익명성에 숨어서 채팅을 하는 앱을 만들기로 했다
… 근데 비슷한 앱들이 너무 많다 그래도 우리가 하면 다를 거라는 망상을 가지고 시작을 하기로 했다
앱을 만들기-1
L4, LoadBalance, 서버이중화는 개나 줘버려라
어플을 만들고 나면 이용하는 사람은 아마도 나와 내 친구 뿐일테니 서버구성에 크게 신경쓰지 않는다
만드는것을 목표로 빠르게 진행을 할 예정이다
간단한 앱을 만들기 위해 WAS / WEB 기능을 같이할 수 있는 Node+Express를 사용하기로 했다
Apache + Tomcat / Jboss 만 사용했던 상태라 Node를 잘 다룰순 없지만 우선 가볍게 프로젝트를 진행한다면
노드가 좀 더 적합해 보였다.
도메인을 구매하기 위해서 여러 사이트를 돌아다녀보고 만원짜리 도메인을 샀다. 드럽게 비싸다…
이후에 AWS에서 Route53을 이용해서 도메인처리를 해주었고 나중에는 ACM과 로드밸런서를 이용해서
SSL처리를 진행할 예정이다. Route53을 이용하는 비용을 지불하면 ACM 비용은 무료라고 하니 개꿀이다
앱을 만들자-2
EC2에 서버로 사용할 OS를 고민하던 와중 서버구성에는 역시 CentOS라고 생각해 인스턴스를 선택했다
하지만 불행히도 버전을 6으로 설치해서 조금의 고생을 해버렸다..
로컬환경에서는 Node 12.18.3 버전을 사용해 개발을 진행했는데 로컬작업 본을 서버에 올리고 노드로 서버를
구동하자마자 에러가 발생했다 Password에 대한 암호화 처리를 해주는 Bcrypt 모듈에 버전을 사용하려면
Node 12 버전대를 사용해야하는데 CentOS6의 경우는 해당 버전을 사용하기 위해 추가적으로 몇가지를 더 설치
해줘야하는 불편함이 있었다 … 망할 하지만 어떤 유능한 개발자분이 해당부분을 정리해서 올려주신 덕분에 수월하게
해당 문제를 해결했다
앱을 만들자-3
1. 회원가입 API 수정
app.post("/users", function (req, res) {
if (
!req.body.id ||
!req.body.password ||
!req.body.name ||
!req.body.sex ||
!req.body.age ||
!req.body.area
) {
throw Error("모든 데이터를 적어주세요!.");
}
let encryptPW;
insertOne = (password) => {
db.one(
"INSERT INTO Users(id, password, name, sex, age, area, rgsn_dttm) VALUES($1, $2, $3, $4, $5, $6, to_char(now(),'YYYY-MM-DD HH24:MI:SS')) RETURNING id",
[
req.body.id,
password,
req.body.name,
req.body.sex,
req.body.age,
req.body.area,
]
)
.then((data) => {
jsonData = { code: 200, message: "성공적으로 데이터가 삽입되었습니다" };
console.log("DATA:", data);
res.send(jsonData);
})
.catch((error) => {
jsonData = { code: "", message: "회원가입에 실패했습니다." };
console.log(error);
res.send(jsonData);
});
};
// awiat , async , promise 에 대해서 공부하기
// 동기처리관련해서 공부필요
encryptPW = bcrypt.encrypt(req.body.password, insertOne);
});
-
문제점
디비에 PassWord를 넣기전에 bcrypt 모듈을 이용해서 암호를 진행하고 Insert를 진행해야하는데
암호화를 진행하기 전에 먼저 비밀번호를 넣어서 암호화가 되지 않은채로 데이터가 들어가버렸다 -
해결
Promise Or awiat/async 를 사용해서 처리를 할려다가 이해를 못한 채로 사용하기가 조금 찝찝해서
콜백을 사용해서 처리를 진행했다bcrypt.encrypt(req.body.password, insertOne);
암호화를 진행하고 나면 insertOne()을 실행시키는 방식으로 로직을 변경했다.이해력이 드럽게 부족한데 쓸데없이 이해를 못하면 쓰기가 싫다 ….
2. 유저정보 API 추가
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.get("/users", function (req, res) {
db.many("SELECT ID, NAME, SEX, AGE, AREA, RGSN_DTTM, EDIT_DTTM FROM Users")
.then(function (data) {
console.log("DATA:", data);
res.send(data);
})
.catch(function (error) {
res.send(error);
console.log("ERROR:", error);
});
});
app.get("/users/:id", function (req, res) {
console.log("req", req.params.id);
db.one(
"SELECT ID, NAME, SEX, AGE, AREA, RGSN_DTTM, EDIT_DTTM FROM Users WHERE ID = $1 r",
[req.params.id]
)
.then(function (data) {
console.log("DATA:", data);
res.send(data);
})
.catch(function (error) {
console.log("ERROR:", error);
res.send(error);
});
});
- 유저들의 모든 정보는 /users 로 조회를 하도록하고
유저 한명의 정보를 얻기위해서는 /users/:id 값을 사용해 찾도록
처리를 했다
3. 테이블 생성
Users Table
Name | DataType | Length | Primary Key | Not Null |
---|---|---|---|---|
ID | character varying | 50 | Y | Y |
NAME | character varying | 20 | Y | |
SEX | character varying | 2 | Y | |
AGE | character varying | 3 | Y | |
AREA | character varying | 10 | Y | |
RGSN_DTTM | character varying | 20 | Y | |
EDIT_DTTM | character varying | 20 | ||
PASSWORD | character varying | 100 | ||
TOKEN | character varying | 100 |
Message Table
Name | DataType | Length | Primary Key | Not Null |
---|---|---|---|---|
MSG_SRNO | character varying | 50 | Y | Y |
ROOM_SRNO | character varying | 15 | Y | |
CONT | TEXT | Y | ||
SENDER | character varying | 20 | Y | |
RECIPIENT | character varying | 20 | Y | |
SEND_DTTM | character varying | 20 | Y | |
NOTICE_YN | character varying | 1 |
- 음… DTTM의 경우는 DATE타입을 써도 될거 같은데 습관적으로 character로 해버렸다
DB관련 공부를 좀더 해야하겠다..
Notices
전체적으로 서버구성 / 코딩소스 / DB구성 모든부분을 다 채워가며 진행하고 싶지만 그렇게 하면 아무래도 앱을 못 만들 것 같다. 우선은 만드는것을 목표로 집중해야겠다.