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

Won Baek님의 프로필 이미지
Won Baek

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

18강. Controller를 3단 분리하기 - Service와 Repository

빈의 개념

작성

·

806

·

수정됨

2

클래스를 빈이라 하지 않고, (컨테이너 안에 들어 있는) '클래스의 객체'를 빈이라 하지 않는지요?

답변 2

5

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! Won Baek님~!! 정말 좋은 질문 감사드립니다!!! 😊

결론부터 말씀드리면 클래스의 객체라는 표현은 어색하지만, object라는 표현이 더 엄밀합니다!! 🙇🙇

이 부분이 정말 어려운 부분이라, 하나씩 살펴보도록 하겠습니다!!

 

[1] 스프링의 공식 문서가 말하고 있는 것

스프링의 공식 문서 (https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction) 를 참고해보면, Bean에 대해 다음과 같이 설명하고 있습니다.

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application. Beans, and the dependencies among them, are reflected in the configuration metadata used by a container.

해석해보겠습니다!

스프링에서는, 1) 당신의 애플리케이션의 기반을 구성하고 있고, Spring IoC 컨테이너에 의해 관리되는 객체(objects)를 (bean)이라 부른다.
bean은 Spring IoC 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 객체이다. 이런 특별한 점을 제외하고 bean은 단지 당신의 애플리케이션 안에 있는 많은 객체들 중 하나일 뿐이다. (= 그러니까 bean은 그저 객체일뿐이야!!)
bean과 그들 사이의 의존성은, 컨테이너가 사용하는 설정 메타정보에 반영된다.

 

여기까지만 보면 object라고 했으니 '객체'라는 표현이 더 적절해 보입니다! 과연 그럴까요?! 조금 더 살펴보도록 하겠습니다!

 

[2] 객체 vs 클래스 vs 인스턴스

공식문서에서도 class 라는 표현 대신 object 라는 표현을 사용하고 있는데요! 제가 강의에서 클래스 라고 표현한 것을 설명드리기 전에 객체 / 클래스 / 인스턴스에 대해 간단히 짚어보겠습니다! 저희가 흔히 인터넷에 객체 클래스 인스턴스의 차이를 검색하면 다음과 같이 설명되곤 합니다. (일부 제 개인적인 의견이 반영되어 있습니다!)

  • 객체 (object) : 크게 2가지 의미가 혼용되어 쓰인다.

    • 현실세계에 존재하는 '개념'을 나타내기 위한 것. 새 / 물고기 / 나무 등. 이 개념에서 객체는 상태를 갖고 행동을 할 수 있으며, 서로 상호작용 한다.

      • ex 새는 물고기를 먹는다.

      • ex 나무는 올해로 20년이 되었다.

    • 객체 = 인스턴스와 같은 의미로도 상용됩니다.

      • 아마 Won Baek님께서 말씀해주신 '클래스의 객체'라는 의미는 인스턴스와 같은 의미로 사용해주시지 않았을까 싶습니다!

    • 다만 저는 첫 번째와 두 번째의 의미를 강하게 구분하는 편입니다. 즉, 객체와 인스턴스를 강하게 구분하는 편으로, 객체와 인스턴스는 바라보는 대상이 다르다고 생각합니다. 아래서 조금 더 설명드리겠습니다!!

  • 클래스 (class)

    • 객체를 '코드'로써 표현한 것 (공통적인 상태와 행동을 공유하는 객체들을 추상화한 것)

    • 필드와 메소드를 가지고 있는 설계도

  • 인스턴스 (instance)

    • 컴퓨터 상에서, 설계도인 클래스에 의해 실체화된 것. 각 인스턴스는 메모리에 독립된 공간을 할당 받는다

 

[3] 객체와 인스턴스

세 가지 중 객체와 인스턴스의 의미를 조금 더 비교해보겠습니다!

<스프링 입문을 위한 자바 객체 지향의 원리와 이해> 책에는 다음과 같은 구절이 있습니다.

세상에 존재하는 유일무이한 객체를 특성 (속성 = field + 기능 = method) 에 따라 분류해보니 객체를 통칭할 수 있는 집합적 개념, 즉 클래스 (분류)가 나오게 된다.

- 객체는 유일무이(unique)한 사물이다.

-클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.

그런데 클래스를 이용해 object를 만들었다는 것을 강조할 때는 object 라는 표현보다는 클래스의 instance 라는 표현을 사용한다.

또한, <오브젝트> 책에는 다음과 같은 구절이 있습니다.

개념 관점 (프로그래밍 언어 관점이 아닙니다) 에서 타입이란 우리가 인지하는 세상의 사물의 종류를 의미한다. 예를 들어, Java, Ruby, JavaScript, C를 프로그래밍 언어라고 부를 때 우리는 이것들을 프로그래밍 언어라는 타입으로 분류하고 있는 것이다.

어떤 대상이 타입으로 분류될 때 그 대상을 instance라고 부른다. Java, Ruby, JavaScript, C는 프로그래밍 언어의 인스턴스이다. 일반적으로 타입의 인스턴스를 객체라고 부른다.

좋습니다! 여기까지만 보면, 객체 = 인스턴스라고 생각할 수 있게 됩니다!

 

하지만 객체와 인스턴스는 엄밀히 말해 바라보는 주체가 다릅니다.

[2]에서 설명드린 것처럼, 객체는 현실세계에 존재하는 대상을 가리키는데 더 사용되고 인스턴스는 클래스를 실체화 시켜 메모리에 로드한 것을 가리키는데 더 사용됩니다.

저희가 객체지향 프로그래밍이라는 용어 대신 인스턴스지향 프로그래밍이란 용어가 어색한 이유가 바로 그 때문인 것 같아요! SW란 현실세계에 존재하는 객체들의 상호작용을 코드에 표현한 것이고, 인스턴스는 메모리 상에만 존재하는 것이니까요!

조금 다르게 표현해보자면, 인스턴스는 우리의 코드로 인해 생긴 '결과물'을 가리키는 느낌이고 객체는 우리가 코드로 표현하고자 하는 '대상'을 가리키는 느낌이죠.

 

(관련 글 : https://www.ijemin.com/blog/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8%EC%99%80-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4-difference-between-obect-and-instance/)

 

[4] 객체와 클래스

오히려 제 경험상으로는 실무에서 클래스와 객체를 더 혼용해서 많이 사용했습니다.

객체와 클래스는 다른 용어이지만, 결국 클래스를 통해 객체를 표현하고자 하기에 이런 멘트를 많이 사용하게 되거든요!

  • 음.. 이 코드는 서로 다른 객체로 쪼개져서 각각 책임을 나누는게 좋겠어요!

  • (코드를 바라보며) 아 찾았다~ 이 객체가 문제였네!!

이런 상황에 객체 대신 '클래스'를 집어 넣으면 어색하지 않지만 '인스턴스'를 집어 넣으면 어색하게 됩니다.

 

당장, 위에서 인용되었던 스프링 공식 문서의 한 부분도 그렇습니다.

A bean is an object that is instantiated, assembled, and managed by a Spring IoC container.

라는 구절을 보면

  • bean은 Spring IoC 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 객체이다

라고 해석할 수 있는데요, 여기에 객체 대신 클래스를 넣으면 문장이 어색하지 않습니다.

  • bean은 Spring IoC 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 클래스이다

클래스는 관리될 수도 있고, 조립될 수도 있으며, 인스턴스화 될 수도 있죠. 어색하지 않아요! 반면, 인스턴스라는 단어를 넣으면 어색합니다.

  • bean은 Spring IoC 컨테이너에 의해 인스턴스화되고, 조립되고, 관리되는 인스턴스이다.

인스턴스는 조립되거나 관리될 수는 있지만, 인스턴스화될 수 없죠! (진작 인스턴스화 되었기 때문) 무언가 문장이 어색해 집니다.

 

[5] 정리 - 그래서 Bean은 도대체 뭐야?!

그리하여! 정리를 한 번 해보도록 하겠습니다!

  1. 공식문서에서 Bean은 object 라고 표현되어 있다.

  2. object는 현실세계에 존재하는 실체 (개체) 또는 인스턴스 라는 의미의 용어로 사용된다.

  3. 하지만 공식문서에서 표현한 object는 메모리에 적재된 인스턴스와는 거리가 있으며, object와 class라는 용어 역시 자주 혼용된다.

  4. 그렇다고 우리가 bean으로 등록한 UserController / UserService 등은 현실세계에 존재하는 실체가 아니고, 현실세계에 존재하는 실체 (엄밀히는 실체를 표현한 클래스인) User는 bean이 아니다.

네.. 정리를 해도 애매 하죠..!! 😭

그리하여... 제 생각에는 공식문서에서 표현한 그대로~~ 빈은 "object" 입니다.

라고 하는게 가장 엄밀할 것 같습니다.

물론, 이때 object는 위에서 살펴보았던 것처럼 instance의 의미나 현실세계에 존재하는 실체의 의미보다는 class의 의미와 조금 더 가깝습니다.

 

 

[6] TMI - 왜 강의에서는 클래스라고 표현했을까?!

이런 애매한 상황에서 저는 다음과 같은 선택지가 있었습니다!

  • 1번 선택지 - Class / Object / Instance의 용어의 애매함에 대해 설명하고 영어 공식문서인 'object'라고 표현하기

  • 2번 선택지 - 가장 이해하기 쉽고, 크게 의미가 잘못 전달되지 않는 class라고 하기 (class는 눈에 보이기에 직관적입니다!)

이 중에.. 저는 2번 선택지를 골랐습니다 👍👍 하하하하~~

 

 

여러 책이나 문서 등을 검토하며 답변을 다느라 몇시간이 훌쩍 지나갔네요!!

프로그래밍 분야갸 이론보다는 실무가 우선하는 편이고 (ref. 소프트웨어 크리에이티비티 2.0 위키북스 2009), 실무상의 용어는 시간과 상황에 따라 계속해서 바뀌다 보니 모든 사람이 동의하는 100% 엄밀한 용어를 정의하는 것은 어려운 것 같습니다 ㅎㅎㅎ...

위에서 말씀드린 내용들 역시 저의 개인적인 생각에 가까우니 아~ 이런 시각도 있구나~~ 정도를 보시고, bean의 엄밀한 정의에 대해서는 Won Baek님 스스로도 고민해보시면 좋을 것 같습니다!! 이런 과정에서 내공도 많이 쌓이는 것 같아요!

 

위의 내용이 도움이 되었으면, 좋겠습니다!

또 궁금한 점 있으시면, 편하게 남겨주세요! 감사합니다!!!! 🙏🙏

 

1

Won Baek님의 프로필 이미지
Won Baek
질문자

자세한 설명 감사합니다.

저는 빈을, 클래스라는 설계도에 따라 만들어진 Object(즉, Class의 한 Instance)라고 생각했었습니다. 빈이 대부분 Singleton이라는 말도, 빈을 Class 그 자체라기보다는 Class의 Instance인 Object라고 해야 자연스러울 것 같습니다. ^^

왕초보인 저도 이해할 수 있게 쉽게 설명해주심에 깊이 감사드립니다. 멋진 강의, 화이팅입니다!!!

최태현님의 프로필 이미지
최태현
지식공유자

너무 좋은 관점이십니다 ㅎㅎㅎㅎ 저도 Won Baek님의 의견에 많은 부분 공감합니다!!!

항상 좋은 질문 남겨주셔서 감사드립니다! 끝까지 화이팅입니다!! 🔥

Won Baek님의 프로필 이미지
Won Baek

작성한 질문수

질문하기