잠자리가 생각보다 나쁘지 않아서 잠도 개운하게 잔 편인듯 하다.
아침에 일어나서 준비하고 프로젝트 기획발표가 있어서 강의실로 이동했다.
기획발표 준비자료를 마무리하고 올라가서 동료분이 발표를 진행했다.
다른 팀에게 생각보다 강한 피드백을 하셔서 무섭긴 했지만, 다행히 우리팀은 무난하게 잘 지나갔다.
본 강의실로 내려와서 오늘은 어제 못다한 로직 작성과, 프론트(View) 작업을 진행했다.
지금 Mongodb를 채택해서 사용중인데 Mongodb는 RDBMS 관계지향적인 데이터베이스가 아니어서 고생을 좀 했다.
처음 생각한 것은 User가 다른 User의 첫인상을 남기는 로직이었는데,
User의 Id를 Fk(외래키)로 삼아서 Comment라는 테이블을 생성하는 걸로 생각을 했다.
하지만 Mongodb는 딕셔너리 자료형으로 평소에 접해봤던 Oracle, Mysql과 달라서 에러가 많이 발생했다.
그러던 중, 아예 User 객체에 Comments라는 첫인상(댓글) 배열을 생성해서 update_one으로 강제로 $push 해주는 방법이 있었다.
MongoDB는 NoSQL이기 때문에 Join연산을 지원하지 않음
-> Embedding을 통해 데이터에 접근(documnent에 $push를 통해 직접 데이터 삽입)
--> 데이터의 복잡성(중복성)이 증가
아래의 코드를 보면,
@app.route('/add_comment', methods=['POST'])
@jwt_required()
def add_comment():
user_id = request.form['user_id']
login_user = get_jwt_identity()
login_user_info = db.jungle.find_one(
{'user_id': login_user}, {'comments': 0, '_id': 0, 'user_pw': 0})
comment_text = request.form['comment']
comment = {
'writter': login_user_info,
'comment': comment_text
}
db.jungle.update_one(
{'user_id': user_id},
{'$push': {'comments': comment}}
)
return jsonify({"result": "success", "comment": comment})
먼저, 첫인상을 받는 사람 (user_id)와 현재 로그인한 사람(login_user)를 저장하고,
로그인한 사람의 정보로 조회해서 사용자가 작성한 첫인상에 로그인한 사람의 데이터를 저장했다.
그리고 첫인상을 받는 사람의 데이터에 $push를 통해 comments 배열을 삽입했다.
파이썬이 이러한 기능이 있어서 요즘 편하다고 느끼는 것 같다.
트러블 슈팅이 많았지만 DB가 익숙치 않아서 많이 어려웠던 로직이었다.
MongoDB
Document 관계 데이터 저장 방식
Embedded
2가지의 Document가 있을 때, 1개의 Document 데이터를 다른 Document key의 value에 저장하는 방법
// Person
{
_id: "joe",
name: "Joe Bookreader",
address: {
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
}
// Address
{
pataron_id: "joe",
street: "123 Fake Street",
city: "Faketon",
state: "MA",
zip: "12345"
}
Reference
Pointer 개념으로 이해하며, Document를 통째로 저장하는 것이 아니라 참조할 수 있도록 ID를 저장하는 방법
// Publisher
{
_id: "oreilly",
name: "O'Reilly Media",
founded: 1980,
location: "CA"
}
// Book
{
_id: 123456789,
title: "MongoDB: The Definitive Guide",
author: [ "Kristina Chodorow", "Mike Dirolf" ],
published_date: ISODate("2010-09-24"),
pages: 216,
language: "English",
publisher_id: "oreilly" // <- Publisher._id
}
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 5-1 (2) | 2024.03.22 |
---|---|
크래프톤 정글 5기 TIL - Day 4 (0) | 2024.03.21 |
크래프톤 정글 5기 - 에세이 (0) | 2024.03.21 |
크래프톤 정글 5기 TIL - Day 3 (0) | 2024.03.21 |
크래프톤 정글 5기 TIL - Day 1 (2) | 2024.03.18 |