ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Builder 패턴을 사용해야 하는 이유를 알아보자
    legacy/Spring 2023. 11. 5. 02:11

     

    사건의 발달

    게시판에 글을 작성하였을 때, 등록된 시간이 Timestamp 값을 사용하기 때문에 다음과 같이 출력되었습니다.

     

    MySQL에서 등록일(created_date) 필드를 TimeStamp 타입을 사용하였고, 자바에서도 TimeStamp 타입을 사용하여 값을 받았습니다.

     

    MySQL

    MySQL DDL

    Board Class

    Board 클래스

    게시판 글 조회

    게시판 글 조회

     

    문제 해결

    저는 "2023년 11월 04일 22시 08분"으로 출력을 원했기에 다음과 같이 코드를 수정하였습니다.

    Board Class

    Board

    TimeStamp -> String 타입으로 포맷팅을 하기 위해 SimpleDateFormat 클래스를 사용하였습니다. 

    또한 생성자로 필드 값을 먼저 설정한 후, 추가적으로 포맷팅 된 값을 저장해야 하기 때문에 Setter가 필요하게 된 상황이 되었습니다.

    게시판 글 조회

    게시판 글 조회

     

    또 다른 문제

    게시판 글 조회하는 코드를 보면 클린하다는 느낌을 받지 못했습니다. 이럴 때는 어떻게 해야 할지 감이 잡히지 않아 바로 물어봤습니다.

    질문에 대한 답

    즉, 생성자Setter는 가급적 사용해서는 안된다. 이럴때는 Builder 패턴을 사용하자 였습니다. Setter 사용을 가급적 지양해야 하는 것을 알고 있었으나 Builder 패턴은 처음 들어봤습니다.

    Setter 사용을 지양해야하는 이유는, 수많은 파일 중에서 Setter를 통해 값을 수정해 버렸을 때 디버깅을 통해 값을 추적할 수가 없기 때문입니다.

     

    Builder 패턴

    이러한 문제를 해결하기 위해서는 Builder 패턴을 사용해야 합니다. 생성자의 인자가 많아 하나하나 위치를 확인해야 하는 불편함과 Setter를 사용하게 됨으로써 불변성을 보장할 수 없는 문제를 해결해 줍니다.

     

    생성자

    저는 항상 인텔리J의 도움을 받아 생성자에 필요한 값들을 확인하고 있었습니다 ㅋㅋ... 이 불편함을 해결해 줄 뿐만 아니라, 같은 타입의 인자를 전달받을 때 값을 잘못 넘기는 문제도 방지할 수 있습니다.

    ex. String title, String name 순서대로 인자를 받는다 -> 실수로 name값을 title에, title값을 name에 넣는 문제가 발생할 수 있다.

     

    생성자에 @Builder 사용

    Builder 패턴을 사용하기 위해, 생성자에 @Builder 애너테이션을 사용합니다.

    게시판 글 조회

     Builder 패턴을 사용하여 인자들을 명확하게 구분하며 값을 저장하였습니다. 생성자의 인자 위치 하나하나 확인할 필요 없이, 필드를 명확하게 구분하여 값을 저장할 수 있게 되었습니다.

     

    SingleTon 패턴

    게시판 글을 조회하는 메서드를 보면 SimpleDateFormat 클래스를 사용하고 있습니다. 즉, 메서드를 호출할 때마다 SimpleDateFomrat 객체를 생성하기 때문에 메모리를 잡아먹는 문제가 발생합니다. 이를 해결하기 위해 싱글톤 객체로 생성하여 해결할 수 있습니다.

    SingleTon 패턴
    게시판 글 조회

Designed by Tistory.