해결된 질문
작성
·
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
안녕하세요, 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
답변 감사합니다!!