0. 이 글을 쓰게된 이유
우테코에서 사다리 미션을 하며 객체의 생성자에 있는 private method를 public api로 열어서 활용하는 것이 어떠냐는 피드백을 받았다. 개인적으로는 그 객체가 그 메소드가 호출되지 않는다면 의미가 없는 객체라고 생각해서 반박(?)을 했는데 다시 리뷰어가 public method로 열어둠으로써 얻는 이점과 private을 했을 때의 단점에 대해 설명 해주셨고 완벽하게 설득 당했다. 그 내용을 공유해보면 다음과 같다.
비즈니스 로직을 파악하기 쉽다.
보통 api 사용자들은 private mathod로 정의 해놓으면 필요하지 않는 이상(오류가 나지 않는 이상) 그 메소드를 잘 읽지 않는다. 하지만 public method는 그 메소드를 사용하려면 (적어도 메소드 명이라도) 읽을 수 밖에 없다. 만약 생성자에 private method로 비즈니스 로직이 들어있다고 하자. 그것을 그냥 읽는 사람이 있을까? 하지만 public method로 해두면 그것이 비즈니스 로직이구나, 이런 기능이 있구나를 파악하기에 용이하다.생성자에서 private method를 사용하면 그것이 잘못된 모듈화일 가능성이 크다.
생성자에서 비즈니스 로직까지 들어있다면 그것은 보통 잘못된 모듈화일 가능성이 크다. 생성자는 그야말로 생성에 관련된 것들만 들어있어야하는데, 거기에 비즈니스 로직이 들어있다면 다른 역할까지 한번에 모듈화를 한 것일 가능성이 높다.재사용이 쉽다.
당연히 private으로 되어있다면 재사용은 거의 불가능하다.테스트 하기 쉽다.
public api로 적절하게 모듈화가 되어있다면 그에 대한 테스트를 작성하는 것은 쉽다. 하지만 다양한 비즈니스 로직이 하나의 메소드 및 생성자에 들어가있다면 테스트하기가 굉장히 까다로워 질 수 있다.
이 모든 것은 결국 private method를 이용해서 생성자 및 api에 잘못된 모듈화가 되어있어서 생기는 문제들이다.
그렇다면 public api는 어떤 기준으로 생성하는 것이 좋을까? 그에 대한 나의 생각을 정리하려고 쓰는 글이다.
1. public api 생성 기준
private과 public의 기준은 어떻게 세우는 것이 좋을까? 내 생각에는 기능 별로 생성하되 호출 되는 순서가 바뀌어도 상관 없는 기준으로 생성하는 것이 좋다고 생각한다.
다음과 같은 객체를 만드려고 한다. 사다리를 생성하고 -> 사다리에 층을 받아서 추가하고 -> 각 층에 라인을 만들어서 -> 사다리를 탄다.
객체와 객체는 메세지를 주고받듯이 통신을 해야한다. 특정 값을 주면 객체는 특정 일만 해서 돌려준다. 이렇게 되면 객체가 무슨 일을 하는지 구체적으로 알 수 있고 각 테스트를 짜기도 쉬워진다.
만약에 호출되는 순서에 제약 사항이 있다면 어떨까? 예를 들어, 숟가락을 생성하는 api을 호출 되어야 -> 밥을 먹는 api를 호출 가능하다라는 흐름이 있다면 그것은 public api로서 적절하지 않다고 생각한다. 각 public 메소드는 순서에 상관 없이 독립적으로 사용할 수 있어야된다고 생각한다.
2. public api는 무엇을 전달하는 것이 좋을까?
당연히 public api는 사용자가 필요로 하는 것을 전달해야한다. 그러므로 그 api를 호출하는 사람이 원하는 것을 돌려주어야한다. 그리고 그것은 그 자체로 의미 있는 값을 돌려주어야한다. (ex -> 빈 사다리여도 그 자체로 의미를 가질 수 있게) 그렇지 않다면 그냥 void로 하는 편이 나을 수도 있다. 그리고 만약 문제가 있다면 예외를 전달해줘야한다.
그리고 사용자에게 꼭 전달해야되는 것이 있을 수 있다. 그렇다면 그것이 public api를 생성해야하는 포인트일 가능성이 높다.
3. 정리
public api를 생성할 때 이 로직이 api 사용자가 알아야하는 내용인가에 대해서 잘 생각해봐야한다. 만약 이 부분은 사용자가 알아야해서 메세지를 보내줘야한다라고 생각하면 그 포인트가 public api 포인트인 것 같다.
이번 미션을 하며 그 경계에 대해 깊게 생각해본 나의 생각을 정리해봤는데 사실 정답은 없다. 본인이 생각하는 원칙대로 사용하면 된다. 하지만 변하지 않는 것은 public api를 사용하는 사람이 의미를 바로 파악해서 쉽게 사용할 수 있어야하고 테스트하기 쉬워야한다. 항상 이 두가지 생각을 하면서 코드를 짜야한다.
'JAVA' 카테고리의 다른 글
[JAVA] TDD란? (0) | 2023.04.09 |
---|---|
[JAVA] 불변 클래스 (0) | 2023.03.24 |
[Java] 객체 지향 vs 성능 (0) | 2023.03.09 |
[JAVA] Reflection (1) | 2022.10.06 |
[JAVA] equals와 hashcode (0) | 2022.09.28 |