모나리자몽
95
2020-10-30 15:38:30
6
417

자바에서 setter를 안쓰는 이유?


안녕하세요 스프링부트를 공부하며 어플리케이션을 만들고 있는 초보 개발자입니다.

책을 보는데 책에서 예를들면 이런코드가 있습니다.

.


@Builder
public class User {
    @Id
    @GeneratedValue
    private final Long Id;
    private final String alias;
    . . . 
}


엔티티의 모든 속성을 final 로 설정하고

어떤 속성을 서비스 코드에서 설정해 주어야 할 때 setter를 호출하지 않고 새로운 user객체를 만들고

빌더로 하나하나 넣어주고 그 새로만들어진 객체를 반환하는 ... 그런 방식으로 로직을 처리하는데


그냥 setter를 만들고 set을 하는게 훨씬 편하지 않나요? 

정말 실무에서 이런 방식을 사용하는지 궁금합니다.

0
  • 답변 6

  • kiroki
    716
    2020-10-30 15:55:49 작성 2020-10-30 15:56:46 수정됨

    다수의 필드를 가지는 경우 생성자 대신 빌더 패턴을 사용하죠

    생성자에 매개변수가 많을 경우 가독성도 그렇고 코드작성할 때도 힘들거든요

    빌더 패턴과 생성자 어느것을 사용하는지가 비교 대상이구요


    빌더와 setter는 비교 대상이 아닙니다.

    setter는 위에서는 필요없어요 final인데 set을 할 수 가 없죠


    현업에서도 매개변수가 많은 경우에는 종종 빌더패턴을 사용합니다.

  • 딩규
    176
    2020-10-30 16:22:31

    불변객체에 대해서 찾아보시면 될것같습니다

  • 코딩딩중
    67
    2020-10-30 16:42:43 작성 2020-10-30 16:44:51 수정됨

    예를 들어서 회원가입을 받을때 (이름,생년월일,주소) 3가지 정보를 받는 model이 있었는데 핸드폰번호라는 정보 1개가 추가되었다고 하면 유지보수가 들어가야하는데 여기서 회원가입과 회원에 대한 정보 수정이라는 유지보수가 생기게됩니다.

    현재 예시가 간단하게 설명하느라 2개로 설명이 되는데 현업에서 예를들어 쿠폰이라는 정보가 추가되어지면 쿠폰이 사용되는 곳, 적립되는 곳, 취소되는 곳, 발급되는 곳 등등 엄청나게 많아지겠죠?

    그런 유지보수를 setter를 사용해서 하게되면 개발자가 일일히 다 기억하고 있거나 테스트를 엄청 해가면서 찾아내야합니다. 근데 작성자님처럼 build패턴이나 생성자 패턴을 사용하게되면 entity자체에서 유지보수를 진행할 수 있고 entity에 매개변수가 변경되었으니 개발툴이 알아서 오류를 뱉어줄거고 거기에 맞는 데이터를 찾아서 끼워주기만 하면 됩니다. 유지보수가 엄청 간편해지죠?

    그리고 또 setter보다 좋은 점이라면 entity에서 service 로직을 구현해놨으니 service 자체에 user.setXXX(); 라는 코드가 다 사라지고 method처럼 한줄로 표현되니까 가독성에서도 좋고요.이 외에도 장점이 많았는데 생각나는게 이거뿐이네요... 더 좋은 가독성을 가진 코드와 유지보수성을 생각한다면 생성자 패턴이나 build패턴 등 공부하시면 좋을거에요!

  • ghjgre
    1k
    2020-10-30 17:42:53

    setter를 안쓰는게 아니고 빌더패턴에서는 setter를 사용하지 않는것 입니다.

    빌더패턴의 장점으론 명시적 선언과 불변성을 가지고 있고

    자바빈 패턴같은 경우에는 setter를 사용하여 값을 주입해서 불변을 보장하지 못하지만 

    자바빈 또한 불변성을 보장시킬순 있습니다. 

  • 빨간오이
    139
    2020-10-30 19:10:18

    setter 가 없는 것은 불변객체라는 것이고, 불변객체를 만들 때는 보통 Builder 패턴을 사용합니다. 생성자는 멤버변수를 선택적으로 입력하기 힘들죠.

    불변객체를 쓰는 이유는 보통 data 공유입니다. 불변객체는 생성 이후 변경되지 않았다는 사실이 보장되기 때문에, 캐싱하기 좋고 여러 쓰레드가 공유할 때 신뢰할 수 있습니다. hash 함수와 equals 를 정의해서 동일성 비교하기에도 좋죠.

    최근에 불변 객체나 불변 컬렉션 사용이 늘어나는 것은 하나의 트랜드입니다. 하스켈, 클로져 같은 함수형 프로그래밍에서 불변자료형이 동시성 처리에 좋다는 장점이 부각되도 있기 때문입니다.

    컴퓨팅 타임이 값싼 요즘 시대에는 파라미터 하나를 바꾸기 위해 전체를 복사하더라도, 여러 쓰레드가 안전하게 수십번씩 액세스할 수 있으면 이득이니까요.

  • 모나리자몽
    95
    2020-10-31 00:13:48 작성 2020-10-31 00:16:13 수정됨

    답변감사드립니다 예시를 들어주시니 왜 빌더패턴이 더 좋은지에 대해 와닿는것 같아요 정말감사드립니다. 조금 늦게봐서 한분한분 답변해드리기 힘들지만 댓글들 덕분에 어떤키워드로 공부해야할 지 감이 잡혔네요 ㅎㅎ

  • 로그인을 하시면 답변 을 등록할 수 있습니다.