개발공부/받은 질문들

받았던 질문 : getter를 쓰는 것을 지양하라는 이유는 무엇일까?

장아장 2023. 3. 30. 12:33

어제부터 '객체지향의 사실과 오해' 에 관해 동기들끼리 스터디를 하기로 했다. 

그 전에 잡담을 하면서 서로의 코드를 리뷰해보고 있었는데( 이거 말고도 보통의 남자들끼리 모이면 하는 그런 이야기도 많이 한다.)

로그인을 위한 validate로직을 보면서, 왜 이렇게 만들었으며 더 나아가 getter를 지양하는게 어떤 방향인지 이야기하게 되어 정리해보려고  한다. 

물론 내 코드도 정답은 아니고, 어쩌면 오답에 더 가까운 코드일 수 있다. 하지만, 그런 부분을 짚어주면서 보는 사람이 있다면 나는 이 글을 통해 더 공부하는 거니까 

제발좀 갑시다 여러분! 태클도 걸고! 댓글도 달고!

정확한 당시 동기의 코드를 가져오진 않았지만, 당시에 기억나는 대로 똑같이 작성해보았다. 

이게 내가 작성한 코드
이게 동기가 작성한(것으로 기억되는) 코드

이 부분에 대해서 더 많은 예시와 설명을 위해 대략 20~30분 정도를 사용했던 것 같다. 사실 그럴 만큼 객체지향이라는 개념과 연관이 있는 질문이었다. 

 

두 번째 사진에 대해서 생각을 해보면, 모든 값들을 get~~으로 불러와 값을 비교하고, 이를 이용한 구현을 한다. 

이렇게 했을 때, 모든 로직을 해당 레이어에서 만들어 사용하며, 생산적 측면에서는 더욱 간단하게 만들어 사용할 수 있다. 

(필요하다 생각될 때 만들면 되니까, 그리고 생각이 나면 바로 만들어 사용하면 되니까)

 

하지만, 필요할 때 마다 만든다는 것은, 여러 곳에서 필요하다면 여러 곳에서 만들어 둬야 한다는 뜻이다. 

또한, 객체는 놀고있다.

Member를 생각해보면, 하는 일이라고는 인스턴스를 가지고 있다가, 인스턴스를 뱉어줄 뿐이다. 

인스턴스 먹고 뱉는..그야말로 백수다!

어떤 객체가 일을 해야 할까를 생각해보자. 

비밀번호를 누가 가지고 있을까? Member다. 

그러면 Member가 자기 비밀번호를 입력받은 비밀번호와 비교해서 같은지 다른지, boolean타입으로 반환해주면 되는 것이다. 

 

객체지향의 최종적인 목표, 그리고 이를 통해 얻는 과정에 대해서는 위에 언급된 책이 가장 정석적일 것이라고 생각된다. 

나는 나의 이해방식대로 글을 작성한다. 

나에게 객체지향을 통해 결국적으로 얻어야 하는 것은, 자동사냥이 되게 하는 것이다.

간단하게 아이템을 사주고, 스킬정도만 찍어주면 알아서 레벨업하고, 알아서 스텟도 찍어주고, 알아서 사냥도 해주는 그런 식으로 이루어져야 한다고 생각한다. 

그러기 위해서는, 사전에 객체들이 할 일이 무엇인지 잘 알려주어야 한다고 생각한다. 

 

추가적으로, 엔티티를 더 작은 도메인들로 나누어 처리했을 때, 단순한 getter는

member.getUsername().getName()의 방식으로 불필요한 체인이 생기게 된다. 

 

궁극적으로 getter를 지양하라고 다들 이야기하는 이유는,

조금 더 객체지향적이고, 더 깔끔하며, 생산적인 코드를 만드는 방법을 생각해보라는 것 같다. 

나도 노력해봐야겠다.