[ 클론코딩 ] 6주차

우영제·2021년 11월 30일
0
post-thumbnail

안녕하세요! 오늘은 velog 클론 코딩 6주차에 있었던 작업을 한 번 정리해보려고 합니다.

🎉 Done

1. 개발 서버 재재구축 ㅠ

1-1. Oracle cloud에 DB 구축 및 서버 설정

1-1-1.Oracle server 인스턴스 생성

먼저 orable 에서 제공하는 인스턴스를 생성했습니다!

오라클과 저는 정말 애증의 관계라고 할 수 있는데요...

무료라서 좋기는 하지만 계정 생성은 정말 힘들었습니다.


은행 업무 시간이 끝나(오후 4시 이후)거나 주말의 경우 계정 생성이 안 되는 경우가 있으니 참고하세요...


1-1-2. postgreSQL 설치

당연히 DB를 설치해야겠죠??

수행 내용은 1주차 환경 설정을 보고 따라했으니 궁금하신 분들은 참고하시면 좋을 거 같습니다!

1-1-3. postgreSQL 원격 접속 설정

이 설정을 해주지 않는다면 DB에 대한 원격 접속이 불가능합니다!

1-1-3-1. postgresql.conf 수정

$ sudo vi /etc/postgresql/14(version 정보)/main/postgresql.conf

먼저 해당 명령어를 통해 conf 파일을 엽니다

그리고 listen_address를 0.0.0.0으로 설정해서 모든 ip에서 connection이 가능하도록 합니다.

고정 ip를 사용한다면 static하게 할당하는 것이 안전하겠지만,

저는 여러명이 각자 원격에서 접속해야하는 상황이라 0.0.0.0으로 세팅했습니다!

1-1-3-2. pg_hba.conf 수정

$ sudo vi /etc/postgresql/14(version 정보)/main/pg_hba.conf

똑같이 해당 config 파일을 엽니다.

ipv4 설정에 아까와 같이 0.0.0.0/0 설정을 추가해줍니다.

1-1-3-3. postgresql 재시작

이로서 postgreSQL 설정은 모두 끝났으니, 서비스를 다시 시작해줍니다.

$ sudo systemctl restart postgresql

1-1-3-4. 결과 확인

postgreSQL이 사용하는 5432 포트가 성공적으로 열렸는지 확인합니다.

$ sudo netstat -ntlp | grep 5432

  • netstat은 패키지이므로 해당 명령어 수행을 위해 설치가 필요할 수 있습니다!

위 내용은 우분투에서 postgresql 외부 접속하기 글을 참고하였습니다.

1-1-4. 방화벽 설정


다음 명령어를 통해 방화벽을 제어하는 iptables 패키지를 사용해 5432번 포트를 열어줍니다.

$ iptables -I INPUT 1 -p tcp --dport 5432 -j ACCEPT
$ iptables -I OUTPUT 1 -p tcp --dport 5432 -j ACCEPT


방화벽에 성공적으로 rule이 추가됐는지 확인

$ iptables -L

postgreSQL은 5432번 포트를 사용하지만, 워낙 유명하기때문에 postgresql이라는 이름으로 나옵니다!
(자세히 보시면 80번 포트도 http라는 스트링으로 나오는 것을 확인할 수 있습니다!)

이로서 외부에서 접속할 수 있는 모든 설정을 마쳤는데요!

위 내용은 postgreSQL 커넥션 디버깅 가이드 포스팅을 참조했습니다.

1-2. postgreSQL에 날짜 타입 추가

postgreSQL에는 세 가지 날짜 타입이 있는데요,


1. date : 날짜를 저장하는 4바이트 값

2. time : 시간을 저장하는 8바이트 값

3. timestamp : 날짜 + 시간을 저장하는 8바이트 값


이렇게 세 개 중에 당연히 확장에 용이한 timestamp로 결정했습니다.

여기서 끝났다면 해피했겠지만... 추가적으로 timezone이라는 것이 존재하는데요!

timezone : 영국의 그리니치 천문대를 기준으로 지역에 따른 시간의 차이, 지구의 자전에 따른 지역 사이에 생기는 낮과 밤의 차이를 인위적으로 조정하기 위해 고안된 시간의 구분선을 일컫는다.

???

아무튼 이런 것이 존재하고 있어서 postgreSQL에서는 timezone이랑 함께 저장할 것인지 묻고 있습니다.

기본적으로 그래서 timestamp = timestamp without timezone 이라고 생각하시면 됩니다.

  • Q) 만약 timezone을 저장하지 않으면 어떻게 될까요??

    UTC 기준 timestamp로 변환되어 저장되고, 출력할 일이 있을 때 시스템의 time zone으로 출력하게 됩니다.

그래서 일단은 timestamp with timezone 타입으로 날짜를 저장하기로 했습니다!

  • 타입이 설정된 테이블

포스팅이 작성된 날짜를 저장하는 released_at 컬럼을 날짜 타입으로 세팅하고, 데이터가 추가된 모습을 확인하실 수 있습니다!

아 timezone에 관련된 내용은 이 분이 먼저 고생하시고 분석해주셨네요.

워낙 유명한 내용이라 찾으면 금방 나오는 정보들이지만, 고생한 흔적들과 함께 정리해놓으셔서 보기 좋았습니다. 아니 이해가 잘 됐습니다!

2. API 추가 및 변경

다음은 API 추가 및 변경사항입니다.

날짜 형식이 추가되면서, 기존 구현돼있는 API의 변경 혹은 새로운 API의 추가가 필요하여 해당 내용을 추가 구현 했습니다!

2-1. 전체 포스팅 GET API 변경

/posts 로 모든 포스팅을 가져오는 API가 날짜 순서대로 내림차순 정렬된 결과를 리턴하도록 변경됐습니다.

변경 전 쿼리 : SELECT * FROM public."BLOG_POSTS"
변경 후 쿼리 : SELECT * FROM public."BLOG_POSTS" ORDER BY released_at DESC

2-2. 특정 사용자의 모든 포스팅 API 변경

/@:{username} 으로 특정 사용자의 모든 포스팅을 가져오는 API가 날짜 순서대로 내림차순 정렬된 결과를 리턴하도록 변경됐습니다.

변경 전 쿼리 : SELECT * FROM public."BLOG_POSTS" JOIN public."BLOG_USERS" ON public."BLOG_USERS".user_id = public."BLOG_POSTS".fk_user_id WHERE velog_name='${userName}
변경 후 쿼리 : SELECT * FROM public."BLOG_POSTS" JOIN public."BLOG_USERS" ON public."BLOG_USERS".user_id = public."BLOG_POSTS".fk_user_id WHERE velog_name='${userName}' ORDER BY released_at DESC;

2-3. 포스팅 CREATE API 추가 (포스팅 작성)

/write 를 통해 새로운 포스팅을 추가하는 API가 추가됐습니다.

2-4. 특정 제목을 가진 포스팅 GET API 추가 (포스팅 보기)

/@:{username}/:{title} 을 통해 특정 사용자의 포스팅을 가져오는 API를 추가했습니다.

📝 To-Do

1. 이미지 관련 설계 및 API 구현 (썸네일, 블로그 내부)

2. Post viewer 일부 구현

3. Editor 설계

profile
Front-end Developer

0개의 댓글