본문 바로가기

개발

Java bean이란 무엇일까?

Java bean은 그냥 규약입니다.

우리가 평상시에 사용하는 클래스들이 몇 가지 약속만 지키면 그게 바로 Java bean이에요.

  1. 모든 property들은 private 접근지정자를 가져야 한다.
    여기서 말하는 property란, XXX_TYPE getXXX(), void setXXX()처럼 getter / setter 메서드로 인식할 수 있는 이름을 말합니다. 더 자세한 내용은 stackoverflow 3가지의 경우 참고
    (https://stackoverflow.com/questions/10773993/javabeans-whats-the-difference-between-an-attribute-and-a-property)

  2. public 접근지정자와 어떠한 인자도 받지 않는 생성자를 가져야 한다.

  3. Serializable 인터페이스를 구현해야 한다.
    Serializable한 객체는 데이터를 stream, file, DB 등 모든 곳으로 보내거나 받을 수 있기 때문이다.
    (https://devlog-wjdrbs96.tistory.com/268)

Java Bean을 사용하는 이유는

  • 컴포넌트 재사용을 통해 DRY 원칙을 지켜나갈 수 있다
  • 캡슐화를 통해 OOP를 지킬 수 있다.
  • client-side, server-side로 각각 나눠 실행/개발 할 수 있다.

라고 해요.

 

그러나 한 가지 의문점이 들었어요. 마틴 파울러의 소트웍스 앤솔로지에서는 "getter, setter를 사용하지 말자" 라고 말하기 때문인데요.

왜 그럴까? 그 이유를 생각해보니 알아낼 수 있었어요.

 

getter와 setter는 사실 캡슐화를 깨기 때문이에요. 객체는 서로 메세지를 주고 받으며 협력하면서 그에 따른 결과를 얻어야 하는데요. getter, setter는 사실상 객체의 상태 값을 밖으로 꺼내서 외부에서 해당 값을 변경할 여지를 주기 때문이에요.

 

자바의 정석 7장에서도 캡슐화에 대해 다뤘던 예시 중에 나오기도 했으니까요. 또, Tell, Don't Ask 에 대해서 짧게 다루기도 했었죠.

그럼 Lombok을 통한 @Getter, @Setter 어노테이션을 사용하면 해당 문제를 해결할 수 있을까? 라는 생각이 들었는데요. 다시 고민해보니, 제 생각으로는 Lombok 역시 결과적으로는 getter, setter를 사용하기에 마틴 파울러의 말을 지킬 수 없다고 생각해요.
(https://stackoverflow.com/questions/58467296/does-project-lombok-contradict-the-data-encapsulation-of-using-a-getter-and-sett)

 

그러나 stackoverflow 답변에서 마틴 파울러가 말한 이유에 대한 힌트를 얻게 되었어요. 답변자는 비즈니스 로직을 처리하지 않고, 그저 데이터 컨테이너 역할만 하는 객체라면, @getter, @setter를 사용하는 건 괜찮다고 했어요.

 

그에 반해, VO 혹은 도메인 객체에서 섣부르게 @setter를 사용하는 건 외부의 개입 때문에 객체의 상태 값이 변경되어 비즈니스 로직에 영향이 갈 수 있으므로 자제하라고 했어요. 이걸 잘 고민해보면, 마틴 파울러는 비즈니스 로직이 담긴 도메인과 같은 객체에서는 캡슐화, 객체지향을 위해 이를 지켜야 하지만, DTO나 Spring에서 프로세스 처리를 하는 @Controller, @Service 빈에서는 이를 엄격하게 지키지 않아도 된다고 말하는 것이 아닐까 싶어요.
(https://limdingdong.tistory.com/15)

 

+) 우테코 블로그에서 비슷한 내용을 찾아서 추가해요.
(https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/)

 


 

 

Java bean property 규약 · Issue #22 · Java-Chip4/StudyingRecord

Java bean이란? Java bean과 Spring bean의 차이점 Java bean property 규약이란? 스스로 조금 찾아보고 코멘트 남기겠습니다. 이후에 이번 주차 리더 분께서 확인하신 후, 부족한 내용이 있으면 추가 부탁드려

github.com