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

멍때리기대마왕님의 프로필 이미지

작성한 질문수

오브젝트 - 기초편

강의 자료 통합본

왜 선배개발자님들은 절차지향이였을까?

해결된 질문

24.09.20 23:52 작성

·

5.9K

15

궁금한게 있습니다.

생각보다 많은 선배개발자님들은 강의에서 말하는 절차지향프로그래밍을 하고 있습니다. 심지어 우리나라에 네카라쿠배라고 하는 회사에서도 비슷한 장면이 자주 목격되는데요.

 

그분들이 잘못되었다고 생각하지는 않지만, 어떻게 그렇게 코딩을 하게 된건지 그 뒷배경이 궁금합니다..!

 

저는 개발한지 이제 7년밖에 되지 않아, 더 과거에 대한 이야기를 알지 못합니다. 조영호님께서는 오랜시간 연구하면서 왜 그렇게 된 것인지 알고 계시지 않을까 싶어 여쭤봐요!

답변 2

10

조영호님의 프로필 이미지
조영호
지식공유자

2024. 09. 21. 11:05

멍때리기대마왕님 안녕하세요.

먼저 강의 수강해 주셔서 감사하다는 말씀 드립니다.

실제로 객체지향으로 설계를 많이 하는지 궁금합니다객체지향은 여전히 유용한가에서 말씀드린 것처럼 절차적인 방식이 무조건 나쁜것은 아니고 객체지향이 적합한 곳에 절차적인 방식으로 코드를 작성할 경우에 문제가 된다는 사실을 먼저 말씀드리고 싶습니다.

 

객체지향이 실무에서 널리 사용되는 계기는 윈도우즈와 같은 GUI 기반의 운영체제가 널리 사용되면서 부터입니다.

객체지향 개념은 GUI 애플리케이션을 구현하는데 필요한 컴포넌트를 만드는데 적합합니다.

1994년에 출간된 GOF의 디자인 패턴에서 다루는 예제의 대부분이 GUI 애플리케이션이라는 점을 보면 이해하실 수 있으실 거에요.

90년대에 (결과적으로 실패한 기술인) 분산객체 기술이 각광을 받게 되고 웹이 급격하게 주류로 부상하면서 객체지향이 서버 사이드의 구현 기술로 널리 사용되게 됩니다.

새로운 기술이 처음 주목받을 때 으레 일어나는 일이지만 이 시점에 개발 커뮤니티는 도메인의 이슈보다는 웹이라는 새로운 환경에서 기술적인 이슈들에 해결하는데 집중하게 됩니다.

데이터베이스에서 데이터를 처리하고 동시성과 트랜잭션을 처리하는 일에 집중하게 되고 결과적으로 기술을 적용하는데 직관적인 절차적인 방식의 코드가 많이 사용되게 되었습니다.

특히 데이터베이스의 데이터를 객체 그래프로 매핑하는게 어렵다보니 강의에서 설명드렸던 것처럼 테이블과 유사한 형태의 객체에 데이터를 담고 프로세스를 구현한 객체가 데이터를 사용하는 방식으로 구현게 됩니다.

여기에 EJB와 같은 기술이 근본적으로 데이터와 처리를 분리하는 아키텍처를 강요함에 따라 절차적인 구현 방식이 널리 퍼지게 되었죠.

이후에 스프링이 EJB를 대체하고 POJO가 널리 사용되게 되지만 빈약한 도메인 모델(anemic domain model)트랜잭션 스크립트(transaction script) 패턴이라는 형태로 아키텍처 자체는 그대로 유지되고 있습니다.

 

이렇게 된 이유는 두 가지 정도로 요약할 수 있을것 같습니다.

하나는 개발을 배우거나 실무에서 참고하는 기존 코드들이 이미 절차적으로 작성되어 있기 때문에 많은 사람들이 이 방식을 그대로 답습하고 있기 때문입니다.

다른 하나는 객체지향이 배우고 적용하기가 쉽지 않기 때문입니다.

 

기술적인 한계로 인해 객체지향을 적용하기 어려웠던 과거와 달리 현재는 스프링이나 JPA처럼 객체지향을 사용할 수 있는 기술적인 기반은 갖춰져있지만 여전히 객체지향 설계 기법을 익히고 적용하는 것은 쉽지 않은 것 같아요.

앞으로 나올 강의들을 통해 관련된 이슈들을 다룰 예정인데 많이 기대해 주시면 감사하겠습니다.

 

답변이 되었는지 모르겠네요. :)

멍때리기대마왕님의 프로필 이미지

2024. 09. 21. 16:32

네, 조영호님의 말씀을 다음과 같이 이해했습니다.

  • 관습적인 사고가 만들어 어떤 현상(?)

  • 객체지향은 배우고 적용하기가 어렵기 때문.

이렇게 이해했습니다 😀 충분히 설명되었습니다 감사합니다.

 

그렇다면, 후속질문으로 이런 생각이 드는데요. 앞서 과거 개발 문화에 대한 궁금증이였다면, 조금 현시점의 관점에서 질문드리고 싶어요.

질문에서 언급드린것과 같이 도메인영역을 빈약한 도메인 모델과 트랜잭션 스크립트 패턴을 활용하는 개발자 무리가 있을 때, 개발자 무리가 "이렇게 코드를 작성하더라도 문제가 되지 않아! 우리는 충분히 요구사항을 반영할 수 있잖아!" 라고 말한다면, 조영호님이 전달해주시는 객체지향은 의미가 없어지게 될 수도 있을 것 같아요.

앞서 언급주신 것처럼 이것이 문제라고 생각하지는 않습니다. 모두가 문제가 아니라고 할 때, 한 사람만 문제라고 말한다면- 그것은 문제가 아니라고 생각하는데요.

 

이런 개발 문화를 가진 팀(회사)이라면, 객체지향 프로그래밍에 대해 설득하는 과정이 필요할 수도 있고, 아닐 수도 있을 것 같아요.

 

조영호님의 주관적인 생각이 궁금한데요, 이런 팀(회사)에서 객체지향에 대한 의미를 전달하고자하는 노력이 필요할까요?

 

(어떤 정답을 바라고 질문드리는 부분은 아닙니다. 조영호님도 비슷한 상황을 겪어보지 않았을까? 그럴때 어떻게 행동하셨는지 궁금하기도해서 여쭤봐요)

 

 

 

 

 

조영호님의 프로필 이미지
조영호
지식공유자

2024. 09. 21. 18:56

굉장히 민감한 이슈이고 대답하기 조금은 조심스러운 질문인데요

결론부터 말씀드리면 현재 적용한 트랜잭션 스크립트가 유지보수 측면에서 문제가 있다면 동료분들을 설득해서 더 좋은 방향으로 코드를 수정하는게 맞다고 말씀드리고 싶어요.

지금부터 제 생각을 말씀드리도록 하겠습니다.

 

개발자는 코드를 작성할 때 기능과 구조라는 두 가지 관점을 고민하게 됩니다.

  • 기능은 사용자에게 제공하는 시스템의 행동을 의미합니다. 강의에서 예제로 사용한 상영 예매 기능을 떠올려보시면 될것 같은데 이 기능은 사용자가 특정한 시간대의 상영을 예매할 수 있는 행동을 제공합니다.

  • 구조는 기능을 구현하기 위한 코드의 배치를 의미하며 우리가 설계라고 이야기할 때는 코드의 구조를 의미합니다. 하나의 기능은 여러 종류의 구조로 구현할 수 있습니다. 강의에서는 상영 예매 기능을 절차적인 방식과 객체지향적인 방식으로 구현했습니다.

동일한 기능을 다양한 구조로 설계할 수 있다는 이야기는 각각의 설계 방식에 따라 장단점이 있을 수 있다는 것을 의미합니다.

 

이제 첫 번째 질문에 대해 제가 답변 드렸던 내용을 다시 살펴보겠습니다.

실제로 객체지향으로 설계를 많이 하는지 궁금합니다객체지향은 여전히 유용한가에서 말씀드린 것처럼 절차적인 방식이 무조건 나쁜것은 아니고 객체지향이 적합한 곳에 절차적인 방식으로 코드를 작성할 경우에 문제가 된다는 사실을 먼저 말씀드리고 싶습니다.

위 답변에서 '절차적인 방식이 무조건 나쁜 것은 아니라는' 이야기는 동일한 기능을 절차적인 방식으로 설계하는 것이 적합한 경우도 있고 적합하지 않은 경우도 있다는 것을 의미합니다.

그리고 '객체지향이 적합한 곳에 절차적인 방식으로 코드를 작성할 경우에 문제가 된다'는 것은 동일한 기능을 객체지향으로 설계하는 것이 더 적합한 경우에 절차적인 방식으로 코드를 설계해서는 안된다는 것을 의미합니다.

그리고 이 말은 객체지향에도 동일하게 적용할 수 있습니다.

객체지향이 적합하지 않은 경우에 객제지향을 적용하는 것 역시 문제라고 할 수 있습니다.

객체지향은 여전히 유용한가 발표를 보시면 어떤 경우에 객체지향이 적합한 때와 절차적인 방식이 적합한 때를 구분하실 수 있으실거에요.

 

질문에서 언급하셨던 "이렇게 코드를 작성하더라도 문제가 되지 않아! 우리는 충분히 요구사항을 반영할 수 있잖아!"라는 말은 구조는 생각하지 않은 채 기능 측면만을 고려한 이야기입니다.

과장을 조금 보태자면 "같은 기능을 구현할 때 변수명을 a, b, c로 선언하고 goto문을 사용한 스파게티 코드를 작성해도 문제가 되지 않아!"라는 말과 흡사합니다.

따라서 어떤 경우에 어떤 구조가 적합한지 트레이드오프하지 않았기 때문에 위와 같은 주장은 잘못된 것입니다.

최종적으로 빈약한 도메인 모델과 트랜잭션 스크립트 패턴을 적용하는게 적합하다고 결론이 나더라도 그 이유가 명확해야 하고 동료 개발자들에게 설득할 수 있어야 하겠죠.

마찬가지로 무조건 "객체지향적으로 코드를 작성하더라도 문제가 되지 않아! 우리는 충분히 요구사항을 반영할 수 있잖아!"라고 말하는 것도 잘못된 접근 방법입니다.

객체지향 설계가 적합한 경우와 적합하지 않은 경우가 있기 때문이죠.

 

강의에서도 계속 강조한 것처럼 어떤 설계가 적합한지를 결정하는 것은 요구사항의 변경입니다.

결론적으로 어떤 설계가 적합한가는 코드 작성 관점이 아니라 유지보수 관점에서 판단해야 합니다.

 

따라서 애플리케이션의 특정 부분의 요구사항이 객체지향 설계가 적합한 방향으로 변경되고 있다면 개발자분들을 설득해서 설계를 개선할 필요가 있습니다.

제 개인적으로 회사에서 일을 할 때 동료 개발자분들께 객체지향 설계를 이해시키는 것이 더 쉬웠는데 함께 유지보수하는 시스템의 요구사항이 실제로 변경되고 있기 때문입니다.

좋은 설계는 요구사항이 변경될 때 코드를 쉽게 변경할 수 있도록 해주기 때문에 실제 코드를 통해 객체지향 설계의 장점을 이해시키면 그래도 잘 납득해 주시더라구요.

이런 설득 과정에서 다소 미묘하고 껄끄러운 이슈들이 발생할 수 있기는 한데 제 개인적인 경험으로는 결국은 실제로 동작하는 코드를 보여드리고 그 설계가 기존 설계보다 어떤 측면에서 더 개선됐는지를 설명드리는게 가장 효과적인 방법이었어요. 🙂

 

적다 보니 설명이 길어졌는데 더 궁금한 부분이 있으시면 추가 질문 부탁 드릴게요.

멍때리기대마왕님의 프로필 이미지

2024. 09. 22. 13:31

다소 질문의 관점이 강의에 대한 이야기가 아닐 수 있음에도 불구하고, 영호님께서 생각하시는 바에 대해 답변주셔서 감사합니다.

 

객체지향프로그래밍에 대해서 개인적인 경험을 가지고 있고, 강의에서 말씀해주신 객체지향에 대해서도 격하게 공감합니다. 공감하면서도 한편으로, 설득의 과정을 만들기 어려운 환경에 대한 아쉬움에 대해 토로하고 싶었을 수도 있을것 같아요.

 

다시한번 진심으로 답변 주셔서 감사합니다. 그리고 좋은 강의를 만들어 주셔서 감사합니다. 이 강의를 통해 더 많은 미래의 동료 개발자가 코드를 작성할 때, 객체지향에 대해 한번더 고민하고 코드를 작성하는 날이 올 수 있도록 저도 열심히 홍보하겠습니다.

조영호님의 프로필 이미지
조영호
지식공유자

2024. 09. 22. 17:13

오프라인 강의를 하다보면 멍때리기대마왕님과 비슷한 고민을 하시는 분들과 이야기를 나눌때가 있는데 안타까운 경우도 많더라구요.

저도 비슷한 고민을 했던 시기가 있다보니 어떤 말씀인지 잘 이해하고 있습니다.

개인적으로 개발과 관련해서 다양한 이야기를 나누는 일이 즐겁기 때문에 강의와 상관이 없더라도 서로의 생각을 나눌수 있는 주제가 있으면 편하게 올려주셔요. 🙂

그리고 나중에 오프라인에서 뵐 일이 있다면 멍때리기대마왕님이라고 말씀해 주시면 꼭 기억하고 인사드리겠습니다.

부족한 강의 들어주셔서 정말 감사드리고 행복한 주말 보내세요!

 

 

멍때리기대마왕님의 프로필 이미지

2024. 09. 25. 16:52

영호님과 이야기나눈 것에 대해서 작은 저의 생각에 대해 글로 작성해봤어요.

 

[링크] 왜 사람들은 빈약한 도메인 모델을 만들어 활용할까?


어떤 피드백을 받고자 하는건 아니고, 이 글을 보시는 다른 분들에게 추가적으로 도움이 될 수 있는 내용이 있을까 싶어 첨부드립니다.

 

영호님도 행복한 하루 보내세요!

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 20. 23:56

안녕하세요, 인프런 AI 인턴입니다.

멍때리기대마왕님께서 질문하신 내용에 대해서 조영호 강사님의 기존 답변을 참고할 수 있는 유사한 주제가 있습니다. 객체지향과 절차지향에 대한 이해와 그 동안의 변화 과정에 대해 설명된 몇 가지 답변을 제공해 드릴 수 있습니다.

관련 질문:

  1. 실제로 객체지향으로 설계를 많이 하는지 궁금합니다.

    • 이 질문에서 강사님은 객체지향 설계와 절차지향 설계의 차이점, 그리고 실제로 어떻게 적용되는지에 대해 설명합니다. 이 답변을 통해 선배 개발자들이 절차지향을 선택했던 이유와 그 배경에 대한 통찰을 얻을 수 있을 것입니다.
  2. JPA를 사용하는 경우 퍼시스턴스 처리에 대해

    • 여기에서는 데이터베이스 설계와 도메인 모델에 관한 논의가 포함되어 있으며, 절차지향 설계와 객체지향 설계의 비교와 그 장단점에 대한 이야기가 포함되어 있습니다.

조영호 강사님의 설명에 따르면, 많은 선배 개발자들이 절차지향 프로그램을 선택했던 이유는 데이터 중심의 설계 방식이 과거의 시스템 구조에서 더 적합했기 때문입니다. 또한, 초기의 프로그래밍 언어와 도구들이 절차지향에 맞춰져 있었기 때문에 많은 개발자들이 자연스럽게 그 방식을 채택하게 되었습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.