🚀
Growth log
  • About me
  • I LEARNED
    • General
      • 개발자 꿀팁
      • 그로스해킹 기초
      • 개발자에게 도메인 지식은 얼마나 중요할까?
      • DTO 논쟁에 대하여
      • MSA란?
    • Seminar
      • 테스트 커버리지 100% - SLASH 21
      • TDD가 실패하는 이유 - by 이규원님
      • 대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록
      • 결제 시스템의 SDK와 API 디자인 - SLASH 21
    • Web
      • SOP와 CORS
    • Spring & OOP
      • DTO vs VO
    • Ruby On Rails
      • Rails lib 디렉토리에 대하여
      • Rails의 concerns란?
      • Rails에서의 GC 작동원리
      • Eager loading vs Lazy loading
      • Rails 환경 구성
      • ActionCable
      • 📔Perfect ruby on rails
        • MVC 패턴인 Rails
        • Ruby on Rails 기본 - 컨트롤러
        • Ruby on Rails 기본 - 뷰
        • Ruby on Rails 기본 - 모델
        • 스캐폴딩 기능을 사용한 Rails 개발 기초
        • 뷰 개발
        • 모델 개발
        • 모델 개발 - 낙관적 동시 실행 제어
        • 모델 개발 - 유효성 검사 구현
        • 모델 개발 - Association
        • 모델 개발 - 콜백
        • 모델 개발 - 마이그레이션
        • 모델 개발 - 데이터 초기화
        • 컨트롤러 개발 - 요청 정보 추출
        • 컨트롤러 개발 - 응답
        • 컨트롤러 개발 - 상태 관리
        • 라우팅 - RESTful
        • 라우팅 - RESTful 인터페이스의 사용자 정의화
        • 라우팅 - RESTful 하지 않은 라우트 정의
        • 테스트
        • 테스트 - 준비
        • 테스트 - Unit 테스트
        • 테스트 - Functional 테스트
        • 테스트 - Integration 테스트
        • 클라이언트 개발 - Sprockets vs Webpacker
        • 클라이언트 개발 - Sprockets
    • Node.js & Express
      • 기본 개념
      • npx
    • Programing Language
      • Java
        • JavaDoc에 대해
        • invocation에 대해서
        • 어노테이션
        • 추상클래스 & 인터페이스
        • Package
        • 오버로딩 vs 오버라이딩
      • Javascript
        • TCP School 훑어보기
          • 타입
          • 형 변환
          • 변수
          • 연산자
          • 반복문
          • 배열(array)
          • 함수
          • 함수 - 스코프와 호이스팅
          • 함수 - 매개변수와 인수
          • 함수 - 미리 정의된 전역 함수
          • 객체
          • 프로토타입
          • DOM
          • BOM - Window 객체
          • 이벤트(event)
      • Ruby
        • 📔퍼펙트 루비
    • DB
      • Redis
        • Redis 개요
      • Index(인덱스)?
      • DB Transaction & Lock
      • 동시성 제어에 관하여
      • Lock(잠금)이란?
      • ActiveRecord lock vs with_lock
      • Table lock vs Row lock
      • WHERE 1=1 구문에 대하여
      • COUNT(*) vs COUNT(indexed column)
      • 📕관계형 데이터베이스 실전입문
      • 📔SQL 첫걸음
      • 📔모두의 SQL
    • Design Patterns
      • Observer pattern
      • Flyweight pattern
      • Singleton pattern
    • OOP
      • 📔오브젝트
        • 6장 메시지와 인터페이스
      • 클래스간 관계 간단 정리
    • Regex
    • Collaboration
      • Git
      • Sourcetree
  • DAILY REVIEW
    • 2021
      • August
        • 2021-08-25(Wed)
        • 2021-08-23(Mon)
        • 2021-08-11(Wed)
        • 2021-08-04(Wed)
        • 2021-08-03(Tue)
        • 2021-08-02(Mon)
      • July
        • 2021-07-29(Thu)
        • 2021-07-26(Mon)
        • 2021-07-23(Fri)
        • 2021-07-22(Thu)
        • 2021-07-21(Wed)
        • 2021-07-20(Tue)
        • 2021-07-19(Mon)
        • 2021-07-15(Thu)
        • 2021-07-14(Wed)
        • 2021-07-13(Tue)
        • 2021-07-12(Mon)
      • June
        • 2021-06-05(Sat)
        • 2021-06-04(Fri)
        • 2021-06-03(Thu)
        • 2021-06-02(Wed)
        • 2021-06-01(Tue)
      • May
        • 2021-05-31(Mon)
        • 2021-05-29(Sat)
        • 2021-05-28(Fri)
        • 2021-05-27(Thu)
        • 2021-05-26(Wed)
        • 2021-05-25(Tue)
        • 2021-05-24(Mon)
        • 2021-05-22(Sat)
        • 2021-05-21(Fri)
        • 2021-05-20(Thu)
        • 2021-05-19(Wed)
        • 2021-05-18(Tue)
        • 2021-05-17(Mon)
        • 2021-05-15(Sat)
        • 2021-05-13(Thu)
        • 2021-05-12(Wed)
        • 2021-05-11(Tue)
        • 2021-05-10(Mon)
        • 2021-05-03(Mon)
      • April
        • 2021-04-30(Fri)
        • 2021-04-29(Thu)
        • 2021-04-28(Wed)
        • 2021-04-27(Tue)
        • 2021-04-26(Mon)
        • 2021-04-24(Sat)
        • 2021-04-23(Fri)
        • 2021-04-21(Wed)
        • 2021-04-20(Tue)
        • 2021-04-19(Mon)
        • 2021-04-18(Sun)
        • 2021-04-16(Fri)
        • 2021-04-15(Thu)
        • 2021-04-14(Wed)
        • 2021-04-12(Mon)
        • 2021-04-11(Sun)
        • 2021-04-09(Fri)
        • 2021-04-08(Thu)
        • 2021-04-06(Tue)
        • 2021-04-05(Mon)
        • 2021-04-04(Sun)
        • 2021-04-03(Sat)
        • 2021-04-02(Fri)
        • 2021-04-01(Thu)
      • March
        • 2021-03-29(Mon)
        • 2021-03-28(Sun)
        • 2021-03-26(Fri)
        • 2021-03-25(Thu)
        • 2021-03-24(Wed)
        • 2021-03-23(Tue)
        • 2021-03-22(Mon)
        • 2021-03-21(Sun)
        • 2021-03-20(Sat)
        • 2021-03-17(Wed)
        • 2021-03-16(Tue)
        • 2021-03-15(Mon)
        • 2021-03-12(Fri)
        • 2021-03-11(Thu)
        • 2021-03-10(Wed)
        • 2021-03-09(Tue)
        • 2021-03-08(Mon)
        • 2021-03-07(Sun)
        • 2021-03-05(Fri)
        • 2021-03-03(Wed)
        • 2021-03-02(Tue)
        • 2021-03-01(Mon)
      • Feb
        • 2021-02-26(Fri)
        • 2021-02-25(Thu)
        • 2021-02-24(Wed)
        • 2021-02-23(Tue)
        • 2021-02-22(Mon)
        • 2021-02-19(Fri)
        • 2021-02-18(Thu)
        • 2021-02-17(Wed)
        • 2021-02-16(Tue)
        • 2021-02-15(Mon)
        • 2021-02-14(Sun)
        • 2021-02-13(Sat)
        • 2021-02-12(Fri)
        • 2021-02-10(Wed)
        • 2021-02-09(Tue)
        • 2021-02-08(Mon)
        • 2021-02-07(Sun)
        • 2021-02-05(Fri)
        • 2021-02-03(Wed)
        • 2021-02-02(Tue)
        • 2021-02-01(Mon)
      • Jan
        • 2021-01-29(Fri)
        • 2021-01-28(Thu)
        • 2021-01-27(Wed)
        • 2021-01-26(Tue)
        • 2021-01-25(Mon)
        • 2021-01-23(Sat)
        • 2021-01-22(Fri)
        • 2021-01-20(Wed)
        • 2021-01-19(Tue)
        • 2021-01-18(Mon)
        • 2021-01-12(Tue)
        • 2020-01-11(Mon)
        • 2021-01-08(Fri)
        • 2021-01-07(Thu)
        • 2021-01-06(Wed)
        • 2021-01-05(Tue)
        • 2021-01-04(Mon)
        • 2021-01-01(Fri)
    • 2020
      • Dec
        • 2020-12-30(Thu)
        • 2020-12-25(Fri)
        • 2020-12-24(Thu)
        • 2020-12-23(Wed)
        • 2020-12-22(Tue)
        • 2020-12-21(Mon)
        • 2020-12-18 (Fri)
      • Nov
        • 2020-11-30(Mon)
        • 2020-11-28(Sat)
        • 2020-11-26(Thu)
        • 2020-11-25(Wed)
        • 2020-11-24(Tue)
        • 2020-11-23(Mon)
        • 2020-11-22(Sun)
        • 2020-11-20(Fri)
        • 2020-11-19(Thu)
        • 2020-11-18(Wed)
        • 2020-11-17(Tue)
        • 2020-11-14(Sat)
        • 2020-11-13(Fri)
        • 2020-11-12(Thu)
        • 2020-11-11(Wed)
        • 2020-11-09(Mon)
        • 2020-11-07(Sat)
        • 2020-11-05(Thu)
        • 2020-11-04(Wed)
        • 2020-11-03(Tue)
        • 2020-11-02(Mon)
    • Good article 아카이빙
Powered by GitBook
On this page
  • render 메서드
  • redirect_to 메서드
  • send_file 메서드
  • send_data 메서드
  • logger 객체
  • HTML 이외의 응답 처리
  • 템플릿으로 JSON과 XML 데이터 생성 - Jbuilder/Builder
  • 멀티 포맷으로 출력 - response_to 메서드

Was this helpful?

  1. I LEARNED
  2. Ruby On Rails
  3. Perfect ruby on rails

컨트롤러 개발 - 응답

액션에서의 처리 결과를 출력하기 위한 메서드들이 있다. 편의상 응답 메서드라고 부르며 메모하자.

응답 메서드

설명

render

템플릿 호출 또는 글자/스크립트 출력 등, 범용적인 출력

redirect_to

지정된 주소로 처리를 리다이렉트

send_file

지정된 파일을 출력

send_data

지정된 바이너리 데이터를 출력

render 메서드

액션에서 명시적으로 응답 메서드를 호출하지 않으면 자동으로 render 메서드가 호출되어 템플릿 파일을 실행하게 된다. render 메서드는 템플릿을 호출하거나 응답을 인라인으로 설정하는 등 다양한 옵션을 가지고 있다. 후자의 경우 MVC 관점에서 어긋나니 주의하자. 디버그용으로만 쓸 것.

뷰에 yield 구가 하나만 있는데 render를 여러번 호출하면 에러가 발생하니 주의하자.

render를 head 메서드처럼 응답 상태값을 받는 용도로도 쓸 수 있다.

redirect_to 메서드

redirect_to 메서드는 지정된 페이지로 처리를 리다이렉트시킨다.

reirect_to url [, status=302]
​
# urls: 리다이렉트 대상 URL
# status: 상태 코드(숫자 또는 심볼)

메서드의 인자로 들어가는 url은 문자열 또는 해시 형식으로 지정하면 된다. 예시를 보자.

redirect_to 'http://www.wings.msn.to'           #절대 경로
redirect_to action: :index                      #같은 컨트롤러의 액션
redirect_to controller: :hello, action: :list   #다른 컨트롤러의 액션
redirect_to books_path                          #자동 생성된 뷰 헬퍼
redirect_to :back                               #이전 페이지

send_file 메서드

지정한 경로에 있는 파일을 읽어 들여 그 내용을 클라이언트에게 전송한다.

send_file path [, opts]
# path: 읽어 들일 파일의 경로
# opts: 동작 옵션

요청 정보로 파일 경로를 직접 지정하면 사용자가 서버 내부의 파일에 접근할 수도 있게되므로 굉장히 위험하다. 아래 같은 코드는 피하자.

send_file params[:path]

send_data 메서드

매개 변수로 바이너리 데이터를 받고 응답한다.

send_data data [,opts]
# data: 파일 경로
# opts: 동작 옵션

데이터베이스에서 바이너리 자료형을 추출하고 클라이언트에게 응답하는 경우 레코드를 추출하고, 콘텐츠 타입을 나타내는 필드(ctype 필드)를 매개 변수 type에, 바이너리 필드를 매개 변수 data에 전달해주면 된다.

logger 객체

logger 객체는 로그를 사용하기 위해 Rails가 제공하는 객체이다. 로그의 중요도에 따라 6개의 메서드를 제공하고 있다. 아래는 우선순위가 높은 순에서 낮은 순으로 정리한 메서드.

  1. unknown(msg): 알 수 없는 오류

  2. fatal(msg): 치명적인 오류

  3. error(msg): 오류

  4. warn(msg): 경고

  5. info(msg): 정보

  6. debug(msg): 디버그 정보

로그 출력 레벨을 변경하려면 development.rb 에 config.log_level = :error 같은 내용을 추가하면 된다. 또한 filter_parameter_logging.rb 를 수정하여 패스워드 등의 파일을 로그에 기록되지 않도록 설정할 수도 있다.

HTML 이외의 응답 처리

추출한 모델의 내용을 XML 또는 JSON 형식으로 출력하는 것은 굉장히 간단하다.

render 메서드에 xml 또는 json 옵션을 지정하기만 하면 된다. 가령 xml 옵션을 지정하고 일반적인 모델을 넣어주면 아래 처리를 자동으로 수행한다.

  • to_xml 메서드로 모델을 XML 형식으로 변환

  • Content-Type 헤더를 "application/xml"로 지정

그러나 이처럼 render 메서드에 json과 xml 옵션을 지정해서 JSON 또는 XML 형식의 응답을 생성하는 것은 편리하지만, 결과 생성은 뷰에서 처리한다는 MVC의 기본 정책에는 위반된다. 또한, json과 xml 옵션으로 모델을 출력하는 방식은 모델의 내용을 기계적으로 변환하는 것뿐이므로 원하는 형식을 만들어 내는 데는 문제가 있다.

템플릿으로 JSON과 XML 데이터 생성 - Jbuilder/Builder

ERB로 HTML 데이터를 생성하는 것처럼 템플릿을 기반으로 하여 JSON과 XML 데이터를 생성하는 것이 바람직하다. 이를 수애하는 것이 바로 JBuilder와 Builder 템플릿이다. 각각 JSON 데이터를 생성하는데, XML 데이터를 생성하는 데에 특화된 템플릿이다.

한편 Builder에 있는 뷰 헬퍼인 atom_feed 메서드를 사용하면 Atom 피드를 쉽게 생성할 수 있다.

멀티 포맷으로 출력 - response_to 메서드

Rails에서 멀티 포맷을 사용할 때는 ERB, Jbuilder, Builder, Ruby 등의 템프릿을 사용해 원하는 뷰를 여러 개 준비해두는 것이 기본이다.

하지만 아래 경우에는 respond_to 메서드를 이용해 간단하게 분기 처리를 할 수 있다.

  • 디버그 전용 오류 글자를 출력하고 싶은 경우

  • 템플릿을 준비할 것도 없는 경우

  • 각각의 형식에 따라 리다이렉트를 하고 싶은 경우

  • 헤더만 출력하고 싶은 경우

respond_to do |format|
  foramt.type { statements }
  ...
end

respond_to 메서드의 내부 블록에는 format.type 형식으로 원하는 형식 type을 적는다. 이후 statements 부분에는 형식에 따라 원하는 처리 코드를 입력한다.

이 때 respond_to 메서드에서 사용할 수 있는 형식은 Rails의 actions_dispatch/http/mime_types.rb에 정의되어 있다. 만약 기존에 정의된 형식 외에 다른 형식을 사용하고 싶은 경우에는 /config/initializers/mime_types.rb에서 아래 형식으로 포맷을 등록하면 된다.

Mime::Type.register "text/richtext", :rtf
Mime::Type.register_alias "text/html", :iphone

Previous컨트롤러 개발 - 요청 정보 추출Next컨트롤러 개발 - 상태 관리

Last updated 4 years ago

Was this helpful?

📔