본문 바로가기

RUBY ON RAILS

데이터베이스 릴레이션

안녕하세요 멋사3기 Kyunni입니다.

이번 포스팅은 열 번째 강의인 '데이터베이스 릴레이션' 에 관련된 포스팅입니다. 이쯤 되니 제법 데이터베이스의 모양도 갖춰지고, 기본적인 웹사이트의 구색은 갖출 수 있는 정도의 수준인 것 같습니다. 

오늘은 패스워드의 보안에 관련된 내용과 Database Relation의 설명과 관련 예제에 대해 다루어보는 포스팅을 진행해보도록 하겠습니다. 여담으로, 데이터베이스 전공과목이나 안드로이드, C언어 등 다양한 과목에서 SQL을 공부하고 적용하며 어려워하던 그때를 생각하니 요즘들어 Ruby가 굉장히 고맙게 느껴지고 좋은 것 같습니다 :)


비밀번호 보안

기본적으로 웹사이트 사용자에게 다른 사람들의 비밀번호 공개를 제한하고, 공개하지 않는 것이 당연시 됩니다. 나아가 개발자나 서버관리자에게 또한 그들의 비밀 정보를 노출시켜서는 안되겠죠.

Ruby에서는 기본적으로 이러한 보안상의 이슈를 제공합니다. <form>태그에서 name의 값에 'password'라는 스트링을 포함하면, 자동으로 Filtering되어 터미널 상에서도 비밀번호의 정보가 노출되지 않게 됩니다.

parameters의 내용을 확인하면, fpassword의 값이 [FILTERED]라는 형태로 가려져있음을 확인할 수 있습니다.


rails c는 'Development Environment' 화면을 보여주는 명령어입니다. 이를 통해 다양한 Test가 가능한데, 이 창에서는 데이터베이스에 저장되어 있는 내용들이 보여지기 때문에 여기에서도 철저한 보안이 요구됩니다. 


Ruby MD5

Ruby MD5는 전달받은 내용을 암호화시켜주는 기술입니다. Ruby MD5라고 구글링하고 실제 개발환경에 적용시켜보면 다음과 같습니다.

Digest::SHA256.hexdigest '암호화하고자 하는 내용'

위의 명령어를 개발환경에 내린다는 것의 의미는 test라는 문자열을 암호화시키면 => 이후에 나오는 문자열로 암호화된다는 것을 의미합니다.


Database Relation(데이터베이스 관계)

데이터베이스의 관계는 크게 네 가지로 분류됩니다. 

 1:1

 일 대 일 대응 관계

 한 명의 사람에게는 하나의 주민등록번호가 대응

 N:1

N 대 일 대응 관계 

한 명의 학생에게 많은 선생님들이 대응

 N:M

다 대 다 

많은 학생들과 많은 수강 과목들 사이의 관계 

 관계 없음

 관계 없음

상관 없는 두 테이블의 관계 


리플달기 예제

# 프로젝트명: test, 컨트롤러명: clion , 액션명: write.erb, read.erb, modify,erb, update.erb, 모델명: posting

# 프로젝트의 내용 자체는 지난 포스팅의 내용에서 이어갑니다. 명명법에서 조금 헷갈리는 관계로 수정을 해주었습니다.

리플의 경우, 릴레이션은 1:N 관계를 형성합니다. 1개의 글에 N개의 리플이 달리기 때문입니다. 루비의 경우 이러한 릴레이션이 굉장히 쉽게 적용될 수 있기 때문에 어렵지 않게 실습해볼 수 있습니다.


리플달기 폼 만들기

8~12번째 라인이 새로 추가된 소스코드입니다. 우선 컨트롤러 파일에 write_reply라는 액션을 추가해주어야함을 알 수 있습니다. 이는 리플을 달 수 있는 폼 공간을 제공해준 것입니다.


리플을 위한 새로운 모델 생성하기

이로써 현재 모델에는 posting과 reply, 두 가지의 모델이 존재합니다. 이 둘의 관계는 1:N 관계로 1개의 posting에 다수의 reply가 대응되게 됩니다. 


데이터베이스 릴레이션 결정하기

 > test > app > models > posting,rb, reply.rb

models 카테고리에 존재하는 각 모델의 rb파일의 수정을 통해 DB의 릴레이션을 결정할 수 있습니다. 이번 포스팅의 핵심 부분이기도 합니다. Ruby는 굉장히 영어와 친한 언어이기 때문에 금방 익숙해질 수 있을 것 같습니다^^

다시 한 번, 되새겨서 posting : reply = 1 : N 관계 이라는 것을 기억하시길 바랍니다.

posting.rb 

has_many    :replies
posting은 N개의 reply에 적용되므로 has_many라는 문법을 사용합니다. 이어서 N개의 복수 개이므로 replies라는 복수형을 사용해주어야합니다.

reply.rb 

belongs_to    :posting
reply는 1개의 posting에 적용되므로 belongs_to라는 문법을 사용합니다. 이어서 1개의 단수이므로 posting이라는 단수형을 사용해주어야합니다.

migration 파일 수정하기

고유의 posting에 해당되는 id값을 t.integer에 선언해줍니다. 이 문법 또한 반드시 이 명명법을 지켜주어야합니다. 그리고 사용자가 작성한 content에 해당하는 db를 저장해줍니다. 이후 rake db:drop → rake db:migrate 를 잊으면 안됩니다!

 

write.erb & 컨트롤러 파일 수정하기

write.erb 파일입니다. 10번째 라인에 input 태그를 하나 더 추가해주었습니다. form을 통해 현재 x 인자에 해당하는 id 값(즉, 해당 데이터에 해당하는 고유의 데이터베이스 id 값을 의미합니다.)을 전달합니다. hidden을 통해 사용자 측에서는 보이지 않게 설정해주었습니다. 

폼에서 전달받은 리플 내용을 처리해주는 액션부분입니다. 두 가지 데이터베이스를 1:N 릴레이션으로 id 값을 통해 연결시켜주는 코드입니다(35번째 라인).

이로써 댓글을 저장시키는 모든 작업이 완료되었고 마지막으로 이 댓글들을 화면에 출력해주기만하면 됩니다.


저장된 리플들 출력하기

9~11번째 라인이 이를 출력시켜주는 소스코드입니다. 9번째 라인을 자세히 보면, x.replies.each ~ 라고 되어있는 것을 확인할 수 있습니다. 이는 x라는 포스트에 해당하는 reply'들(ies)'을 하나씩 출력하겠다는 의미입니다.

[결과화면]




'RUBY ON RAILS' 카테고리의 다른 글

Rails 로그인하기 (Session & Cookie)  (0) 2015.07.31
데이터베이스 시드 & 이미지 업로드  (0) 2015.07.29
데이터베이스 UPDATE  (0) 2015.07.22
데이터베이스 Delete(Destroy)  (0) 2015.07.22
TDD(테스트 주도 개발)  (0) 2015.07.21