Back_End(Ruby on Rails) (10) 썸네일형 리스트형 Basic Principle of Ruby Variable Assignment Key points assigning variables in Ruby(루비에서의 변수 할당 원칙) 루비에서의 변수는 해당 개체의 값의 참조가 아니고, 개체의 ‘위치’ 에 대한 참조다. 루비에서의 변수간 할당은 pass-by value로 전달된다! (Pass-by reference의 반대) 얼마전 코드리뷰에서 굳이 불필요한 변수 할당은 자제하라는 피드백을 꽤 여러 번 받았다. 그냥 스택 메모리를 변수가 차지하는 공간만큼 조금씩 잡아먹는다 정도로 생각하고, 크게 생각은 안했었는데, 이 참에 Ruby의 변수 할당 원리/원칙을 정리하고자 한다. 몇 가지 간단한 예시로 루비에서의 변수 할당이 어떻게 작동하는지 살펴보자. “Ruby” String 클래스의 object를 a, b라는 변수에 할당한다. 각각 의 obj.. URL 주소 입력부터 웹 브라우저 화면 출력까지 과정 url 주소 입력부터 웹브라우저에 우리가 원하는 웹 화면을 출력받기까지의 과정을 정리해봤다. 사실 거의 번역글이고, 구글링으로 양질의 블로거들이 정리해놓은 글들을 번역하는 과정에서 상당히 배울 점이 많다. 번역을 하기 위해 나도 내용을 알아야 하므로 나도 정리하는 것과 같은 효과를 볼 수 있다. 1. google.com을 타이핑 한다. 2. 브라우저는 해당 url 네임에 해당하는 ip주소를 dns cache에서 먼저 체크한 후, 적합한 ip 주소를 찾는다. 참고로 DNS 는 Domain Name System으로. URL name- linked IP address 의 리스트이다. DNS 서버가 따로 있어서 해당 url 에 대해, DNS 서버에 접근해서 ip주소를 받은 후, 그 ip로 우리가 정보를 얻고자 .. Rails_추천 시스템에 Redis 적용(Implementaion of Redis in Ruby on Rails) 대략 100,000 건의 rows에서 20개 정도의 추천 row를 내려주는 api를 만들게 되었다. 이때 추천 rows들은 거의 변하지 않고, 모든 Client들에게 항상 동일한 추천 rows를 보여주는 로직이었다. 추천 rows는 거의 변하지 않음에도 불구하고 요청시마다 100,000개의 rows가 있는 테이블에 Query를 날리는 것보다는 캐싱을 해두고 쿼리 없이 보여주는게 좋다고 생각했다. Redis Setting in Rails Application 위와 같이 Redis Object 와 args 를 url 과 드라이버와 함께 Initialize 해준다. 아 물론, initializers directory 내 파일 들은 rails 내 library에 있는 run_intializers method에 .. Ruby 의 Garbage Collection 을 이해할 수 있는 GC 모듈 (Ruby GC Module, which helps to understand the Garbage Collection of Ruby) C++을 공부하면서, C++의 특징은 소멸자를 기본적으로 직접 선언하여 메모리 해제도 직접 해준다는 점이다. 근데, Ruby 같은 high level 언어는 메모리 해제를 직접하지 않고, Garbage Collection 이라는 기능을 이용하여 힙 메모리에 할당된 object 가 해제된다. 여기서 궁금한 점은 아무리 Garbage Collection 기능으로 메모리 관리가 저절로 된다고 해도 메모리 누수가 생길 수 있는거 아닌가?(가령, 해제가 안되는 것으로 분류된다든지), 과연 Garbage Collection은 어떤 기준으로 메모리를 해제할까? 라는 점이 궁금했다. 궁금증에 대한 답변은 우선 아래와 같이 요약할 수 있다. -> object memory가 해제 안되는 경우는 Constant Variab.. Rails Application Request/Response Cycle(레일즈 애플리케이션은 서버에서 어떻게 작동할까?) 하드웨어 서버 영업을 할 때 부터 항상 궁금했던건데, 물리 서버에서 어떻게 백엔드 애플리케이션이 동작을 하는지가 항상 궁금했었다. 그런 동기에서 Rails Application을 작동 방식, 즉 서버의 핵심인 Request/Response Cycle을 정리해보았습니다. 크게 아래와 같은 1~8단계로 Cycle로 작동하며, 각 단계 위에서 Object가 새로 만들어지면서 정의된 method들을 Call한다고 볼 수 있습니다. 참고로, 같은 컨트롤러 클래스의 심지어 같은 Action Method를 요청하는 복수의 Request들이 있을 때 Object들은 어떻게 생성될까요? 이떄는 각 요청 당 Object들이 따로 만들어집니다. (the controller class creates a new instance.. RubyOnRails/Model Association Association 정리 Model간 관계를 사전에 정의하여 두 개 이상의 모델에서 동시에 데이터를 갖고 올 때, method 사용을 통해서 빠르게 갖고 올 수 있음 (Association을 사용하는 이유) Association도 결국 ActiveRecord에서 사전에 정의된 Method들이며, 알맞게 Model < ActiveRecord 파일 내에서 association을 정의한 뒤, 해당 Model에서 메쏘드처럼 사용하는 것이다. 기본적으로 모델 간 관계를 맺는 방식은 테이블의 foreign_key와 상대편 테이블의 primary_key다. primary_key는 말그대로 참조 대상 테이블의 id 이고, foreign_key는 별도의 언급이 없을 시에 참조 소스 테이블 내, (참조대상테이블 모델이름.. Rails Transaction Isolation Level (트랜잭션 격리 레벨) 트랜잭션 격리 레벨에 대해서 찾아본 이유는, 예전에 유저 등의 랭킹 시스템을 만드는 프로젝트를 맡은 적이 있었습니다. 배치 프로그램으로 매일 마다 갱신된 랭킹을 db에 삽입하는 기능을 구현해야 했는데, Transaction을 걸어서 all or not 으로 한번에 데이터를 커밋하고자 하였었습니다. 여기서 더 궁금했던 점은 랭킹 산출을 위해서는 실시간 유저의 스코어가 필요했는데, 랭킹 반복 연산 도중에 유저의 정보가 바뀌면 이것이 어떻게 저장되지? 라는 의문점에서 격리레벨이라는 것을 더 찾아보게 되었었네요. 이 결과, Backend 개발에서는 트랜잭션 격리 레벨을 만들어두고, 데이터의 특성이나 비즈니스 로직에 따라 격리 레벨을 달리 준다는 것을 알게 되었습니다. Transaction 을 먼저 짚고 넘어가면.. Rails N+1 Query (N+1 쿼리 문제란?) 아무래도 Rails 백엔드 개발은 ActiveRecord의 Subclass에서 정의된 모델을 이용해 DB에 직접 Query를 날려서 CRUD 작업을 하는데, 이 때 알아야 할 이슈가 N+1 Query Problem 입니다. N+1 Query Problem 의 영문 정의는 his problem occurs when the code needs to load the children of a parent-child relationship (the “many” in the “one-to-many” 이다. 즉, 부모 자식 관계에 있으며 자식과 부모의 db 관계가 자식:부모 => many to one 관계로 있는 두 db 테이블에서 자식 테이블을 쿼리를 통해 갖고 올 때 일어나는 문제입니다. 예를 들어봅시다. 어떤 .. 이전 1 2 다음 목록 더보기