안녕하세요! 오늘은 velog 클론 코딩 6주차에 있었던 작업을 한 번 정리해보려고 합니다.
먼저 orable 에서 제공하는 인스턴스를 생성했습니다!
오라클과 저는 정말 애증의 관계라고 할 수 있는데요...
무료라서 좋기는 하지만 계정 생성은 정말 힘들었습니다.
은행 업무 시간이 끝나(오후 4시 이후)거나 주말의 경우 계정 생성이 안 되는 경우가 있으니 참고하세요...
당연히 DB를 설치해야겠죠??
수행 내용은 1주차 환경 설정을 보고 따라했으니 궁금하신 분들은 참고하시면 좋을 거 같습니다!
이 설정을 해주지 않는다면 DB에 대한 원격 접속이 불가능합니다!
$ sudo vi /etc/postgresql/14(version 정보)/main/postgresql.conf
먼저 해당 명령어를 통해 conf 파일을 엽니다
그리고 listen_address를 0.0.0.0으로 설정해서 모든 ip에서 connection이 가능하도록 합니다.
고정 ip를 사용한다면 static하게 할당하는 것이 안전하겠지만,
저는 여러명이 각자 원격에서 접속해야하는 상황이라 0.0.0.0으로 세팅했습니다!
$ sudo vi /etc/postgresql/14(version 정보)/main/pg_hba.conf
똑같이 해당 config 파일을 엽니다.
ipv4 설정에 아까와 같이 0.0.0.0/0 설정을 추가해줍니다.
이로서 postgreSQL 설정은 모두 끝났으니, 서비스를 다시 시작해줍니다.
$ sudo systemctl restart postgresql
postgreSQL이 사용하는 5432 포트가 성공적으로 열렸는지 확인합니다.
$ sudo netstat -ntlp | grep 5432
위 내용은 우분투에서 postgresql 외부 접속하기 글을 참고하였습니다.
다음 명령어를 통해 방화벽을 제어하는 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 커넥션 디버깅 가이드 포스팅을 참조했습니다.
postgreSQL에는 세 가지 날짜 타입이 있는데요,
1. date : 날짜를 저장하는 4바이트 값
2. time : 시간을 저장하는 8바이트 값
3. timestamp : 날짜 + 시간을 저장하는 8바이트 값
이렇게 세 개 중에 당연히 확장에 용이한 timestamp로 결정했습니다.
여기서 끝났다면 해피했겠지만... 추가적으로 timezone이라는 것이 존재하는데요!
timezone : 영국의 그리니치 천문대를 기준으로 지역에 따른 시간의 차이, 지구의 자전에 따른 지역 사이에 생기는 낮과 밤의 차이를 인위적으로 조정하기 위해 고안된 시간의 구분선을 일컫는다.
???
아무튼 이런 것이 존재하고 있어서 postgreSQL에서는 timezone이랑 함께 저장할 것인지 묻고 있습니다.
기본적으로 그래서 timestamp = timestamp without timezone
이라고 생각하시면 됩니다.
UTC 기준 timestamp로 변환되어 저장되고, 출력할 일이 있을 때 시스템의 time zone으로 출력하게 됩니다.
그래서 일단은 timestamp with timezone 타입으로 날짜를 저장하기로 했습니다!
포스팅이 작성된 날짜를 저장하는 released_at 컬럼을 날짜 타입으로 세팅하고, 데이터가 추가된 모습을 확인하실 수 있습니다!
아 timezone에 관련된 내용은 이 분이 먼저 고생하시고 분석해주셨네요.
워낙 유명한 내용이라 찾으면 금방 나오는 정보들이지만, 고생한 흔적들과 함께 정리해놓으셔서 보기 좋았습니다. 아니 이해가 잘 됐습니다!
다음은 API 추가 및 변경사항입니다.
날짜 형식이 추가되면서, 기존 구현돼있는 API의 변경 혹은 새로운 API의 추가가 필요하여 해당 내용을 추가 구현 했습니다!
/posts 로 모든 포스팅을 가져오는 API가 날짜 순서대로 내림차순 정렬된 결과를 리턴하도록 변경됐습니다.
변경 전 쿼리 : SELECT * FROM public."BLOG_POSTS"
변경 후 쿼리 : SELECT * FROM public."BLOG_POSTS" ORDER BY released_at DESC
/@:{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;
/write 를 통해 새로운 포스팅을 추가하는 API가 추가됐습니다.
/@:{username}/:{title} 을 통해 특정 사용자의 포스팅을 가져오는 API를 추가했습니다.