TECH/웹개발

[Java] 메서드 체이닝(Method Chaining) 완벽 가이드: 원리부터 실무 활용까지

런코리치 2026. 2. 10. 08:00

[Java] "점(.)으로 연결하는 코드의 마법" - 메서드 체이닝(Method Chaining) 완벽 가이드

자바 코드를 작성하다 보면 list.stream().filter().map().collect()처럼 여러 메서드가 사슬처럼 엮여 있는 모습을 보게 됩니다. 이를 메서드 체이닝(Method Chaining)이라 부릅니다. 단순히 코드를 한 줄로 줄이는 기술을 넘어, 왜 현대 자바에서 이 방식이 표준이 되었는지 파헤쳐 보겠습니다.


1. 메서드 체이닝이란?

메서드 호출 후 반환된 결과 객체를 이용해 다시 다른 메서드를 호출하는 프로그래밍 패턴입니다. 각 메서드가 연쇄적으로 이어지며 데이터의 상태를 변화시키는 모습이 마치 사슬(Chain)과 같다고 해서 붙여진 이름입니다.


2. 내부 구현의 핵심: return this;

메서드 체이닝이 가능하려면 딱 한 가지만 기억하면 됩니다. 메서드가 종료될 때 수정된 자기 자신(this)을 반환하는 것입니다.

[전통적인 방식]

각 단계마다 변수를 새로 참조해야 하므로 코드가 끊어집니다.

Java
User user = new User();
user.setName("Gemini");
user.setAge(20);
user.setJob("AI Consultant");

[메서드 체이닝 방식 구현]

Java
public class User {
    private String name;
    private int age;
    private String job;

    // 반환 타입을 자기 자신(User)으로 설정
    public User setName(String name) {
        this.name = name;
        return this; // 핵심: 자기 자신을 반환하여 다음 메서드 호출을 가능하게 함
    }

    public User setAge(int age) {
        this.age = age;
        return this;
    }

    public User setJob(String job) {
        this.job = job;
        return this;
    }
}

// 실전 사용
User user = new User().setName("Gemini").setAge(20).setJob("AI Consultant");

3. 실무 활용 시나리오

A. 유창한 인터페이스 (Fluent Interface) 구현

메서드 체이닝은 코드를 마치 영어 문장처럼 읽히게 만듭니다. 이를 Fluent Interface라고 하며, 대표적으로 테스트 코드(Assertion)나 쿼리 빌더에서 쓰입니다.

Java
// AssertJ 라이브러리 예시: 문장처럼 읽힘
assertThat(user.getName())
    .isNotNull()
    .startsWith("Gem")
    .contains("mini");

B. 빌더 패턴 (Builder Pattern)

객체 생성 시 인자가 너무 많을 때, 생성자 대신 체이닝을 사용해 가독성을 높입니다. (Lombok의 @Builder가 이 구조를 자동으로 생성해 줍니다.)

Java
Order order = Order.builder()
    .productId(101L)
    .quantity(5)
    .address("Seoul, Korea")
    .isFastDelivery(true)
    .build(); // 최종 결과물을 반환하며 체인 종료

4. 체이닝을 쓸 때 주의할 점 (Anti-Patterns)

  1. 디버깅의 어려움: 한 줄에 너무 많은 메서드가 몰려 있으면, 에러가 발생했을 때 정확히 어떤 메서드에서 문제가 터졌는지 확인하기 어렵습니다.
    • Tip: 실무에서는 한 줄에 하나씩 줄바꿈을 하는 것이 컨벤션입니다.
  2. 디자인 위반: 메서드 체이닝이 남발되면 객체의 내부 구조가 외부로 너무 많이 노출될 위험이 있습니다 (데메테르의 법칙).
  3. Null 안전성: 체이닝 중간에 null이 반환되면 즉시 NullPointerException이 발생합니다. 이를 방지하기 위해 앞서 다룬 Optional과 함께 사용하는 것이 좋습니다.

5. 요약: 왜 써야 할까?

  • 가독성: 불필요한 지역 변수 선언을 줄여 코드가 간결해집니다.
  • 의도 명확화: 데이터가 어떤 과정을 거쳐 가공되는지 흐름(Pipeline)을 한눈에 볼 수 있습니다.
  • 유지보수: 설정이나 변환 과정이 명확하여 로직 수정이 쉽습니다.