인프런 커뮤니티 질문&답변

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

Ruby on Rails 공식 가이드 따라잡기

show api 작성시 생성된 @article을 instance 변수로 만드는 이유가 있나요??

해결된 질문

작성

·

99

·

수정됨

0

강의를 다 듣고나서 공식문서를 다시 보다, 문득 궁금한점이 생겨 질문 남겨봅니다.

예를 들어 강의에서 작성하는 다음 코드가 있었는데,

  def show
    @article = Article.find(params[:id])
  end

이때 article 앞에 @을 추가하여 instance 변수로 만드는 이유가 있나요?

instance 변수로 만들었다는 것은, 동일한 class 내의 다른 method에서 참조가 가능해지는데…?이는 좋지 못하다고 생각됩니다만? 혹 이렇게 선언하는 이유가 있을까요?

 

Spring진영으로 생각하면 다음과 같은 코드를 작성하는 느낌인데??

public class ArticleQueryApiV1 {

  private ArticleDto article;

  @GetMapping("/articles")
  public ResponseEntity<BaseResponse<ArticleDto>> show() {
    ArticleDto article = articleQueryUseCase.lookupFirst()

    this.article = article; // 이 부분을 어떠한 이유에서 수행하는???

    return ResponseEntity.ok().body(new BaseResponse<>(articles));
  }
}

Spring만 공부해왔던 저에게는 다소 생소한 "코드"라 생각되어 질문 남겨봅니다!!!

답변 1

1

Stark님의 프로필 이미지
Stark
지식공유자

안녕하세요, zbqmgldjfh님.

단순한 API만 제공하는 Controller였다면 instance 변수로 선언하지 않아도 되는게 맞아요.

가이드의 경우에는 View까지 그려줘야 하는데 View가 결국은 Controller를 통해서 그려지기 때문에 View 내부에서 article의 데이터에 접근이 필요한 경우에 위와 같이 선언해서 가져다 쓰는 용도로 쓰이고 있어요.

그러지 않고 사용한다고 하면 View에서 API콜을 따로 해서 필요한 값을 받아가는 방식이 있을텐데 이 방식이 Ruby on Rails에서는 일반적인 사용패턴이라고 알고 있어요.

 

언급하신 다른 메소드가 참조하는 좋지 못한 방식이라는 점이 Rails에서는

before action으로 미리 객체의 값을 넣어두고 메소드에서는 참조만 하게 해서 동일 코드를 제거하는 효과를 가지기도 해요.

before_action :set_article

def set_article
  @article = Article.find_by(id: 123)
end

def foo
  "Title is #{@article.title}"
end

def bar
  "Description is #{@article.description}"
end

 

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh
질문자

답변 감사합니다!!

zbqmgldjfh님의 프로필 이미지
zbqmgldjfh

작성한 질문수

질문하기