static of 메서드 + Builder + @JsonInclude

ssongyi·2025년 4월 3일
0

Java/Spring TIL

목록 보기
6/11

static ~ of() 메서드 사용 이유

  1. 객체 생성을 더 명확하고 읽기 쉽게 하기 위해
  2. Builder 는 유연하지만 쓰기 번거로움 --> of()Builder감싸는 편의 메서드 역할을 함
  • static: 클래스 레벨에서 접근할 수 있게 함 (new 없이 사용 가능)
  • of(): 명확한 의미 전달 + Builder 감싸기
  • 장점: 가독성 향상 + 재사용성 증가 + 실수 방지 + 일관성 있는 생성

왜 new 생성자를 안 쓰고 of() 를 쓸까?

언제 static of() 를 쓰면 좋을까?

  • 클래스가 DTO(데이터 전송 객체)일 때

  • Builder가 있지만 자주 쓰는 형태로 간편하게 만들고 싶을 때

  • 다양한 초기화 방식(예: 일부 필드만 설정하는 경우)이 필요할 때

  • 불변 객체(immutable)를 만들고 싶을 때, 생성자를 막고 팩토리 메서드만 제공하는 전략으로도 사용됨


Builder ?

Lombok 라이브러리에서 제공하는 어노테이션
복잡한 객체 생성 로직을 '더 읽기 쉬운 방식'으로 바꿔주는 패턴

일반적인 생성자 방식

User user = new User("홍길동", 25, "seoul@gmail.com");
  • 어떤 값이 어떤 필드에 들어가는지 헷갈림

  • 순서를 바꾸면 큰 문제가 생김

  • 선택적인 필드를 넣기 어려움

Builder 방식

User user = User.builder()
                .name("홍길동")
                .age(25)
                .email("seoul@gmail.com")
                .build();
  • 가독성 🆙, 실수 🆖, 유지보수 👍

Builder = 자동 생성자 + 자동 setter + 안전한 객체 생성 도우미

주의할 점

  • Builder 를 쓰면 기본 생성자(@NoArgsConstructor) 가 자동 생성되지 않음
    --> 필요 시 별도로 선언해야 함
  • 내부적으로 생성자와 빌더 클래스가 자동 생성되기 때문에, 생성자를 안 써도 됨

@JsonInclude

@JsonInclude

  • Jackson 라이브러리의 어노테이션
  • Json 직렬화(Serialize) 시 어떤 필드를 포함시킬지 제어

@JsonInclude(JsonInclude.Include.NON_NULL)

  • null 인 필드는 JSON 결과에 포함시키지 X
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
    private String name;
    private String email;
    private String phone; // null일 수 있음
}
User user = new User();
user.setName("홍길동");
user.setEmail("hong@test.com");
user.setPhone(null);  // null 설정

JSON 결과

{
  "name": "홍길동",
  "email": "hong@test.com"
  // "phone"은 null이라서 아예 빠짐!
}

Jackson ?

자바 진영에서 객체(Object) 와 JSON 간 변환(직렬화/역직렬화) 을 처리할 수 있게 해주는 대표적인 라이브러리

즉, 자바 객체 --> JSON or JSON --> 자바객체 로 바꿔주는 도구

1. 자바 개체 --> JSON 문자열(직렬화, Serialization)

ObjectMapper mapper = new ObjectMapper();

User user = new User("홍길동", 25, "hong@test.com");

String json = mapper.writeValueAsString(user);

결과:

{
  "name": "홍길동",
  "age": 25,
  "email": "hong@test.com"
}

2. JSON 문자열 → 자바 객체 (역직렬화, Deserialization)

String json = "{\"name\":\"홍길동\",\"age\":25,\"email\":\"hong@test.com\"}";

User user = mapper.readValue(json, User.class);

결과:

user.getName();  // "홍길동"
user.getAge();   // 25

Jackson 이 제공하는 핵심 클래스

Jackson 이 인기 있는 이유

실무에서는 대부분 Jackson을 씀
Spring Boot가 기본 내장하고 있어서 설정이 간단하다

0개의 댓글