SW 개발 일반/클린 코드

빈약한 객체 (Anemic Object)

growdai1y 2025. 3. 7. 01:00

소프트웨어 개발에서 객체는 데이터를 단순히 보관하는 역할이 아니라, 의미 있는 행동을 수행하는 주체가 되어야 합니다. 하지만 많은 코드베이스에서 여전히 속성(getters/setters)만을 노출하는 빈약한 객체(Anemic Object)를 발견할 수 있습니다. 이러한 객체는 절차적 코드 스타일을 유발하고 유지보수를 어렵게 만듭니다. 이번 글에서는 빈약한 객체를 풍부한 객체(Rich Object)로 변환하는 방법을 소개합니다.


빈약한 객체의 문제점

빈약한 객체는 보통 다음과 같은 특징을 가집니다:

  • 데이터만 포함하고 행동이 없음: 속성 값을 설정하고 가져오는 기능만 제공합니다.
  • 절차적 코드 유발: 비즈니스 로직이 객체 외부에 존재하면서 코드의 응집도가 떨어집니다.
  • 변경에 취약: 객체가 단순한 데이터 보관소로 작동하므로 변경 사항이 전체 코드베이스에 쉽게 영향을 미칩니다.

예제: 빈약한 객체

public class Song {
    private String name;
    private String author;
    private String album;

    public Song(String name, String author, String album) {
        this.name = name;
        this.author = author;
        this.album = album;
    }

    public String getName() { return name; }
    public String getAuthor() { return author; }
    public String getAlbum() { return album; }
}

public class SomeClass {
    public void doSomethingWithSong(Song song) {
        if (song.album == null || song.album.trim().isEmpty()) {
            throw new IllegalArgumentException("Album name cannot be empty");
        }
        ...
    }
}

이러한 객체는 데이터를 노출할 뿐, 자신이 수행해야 할 책임을 가지고 있지 않습니다.


빈약한 객체를 풍부한 객체로 변환하기

객체는 자신의 데이터를 보호하고, 적절한 행동을 제공하는 책임을 가져야 합니다. 따라서 객체의 속성을 직접 접근하는 대신, 적절한 메서드를 통해 행동을 수행하도록 변경해야 합니다.

예제: 풍부한 객체

public class Song {
    private String name;
    private Artist author;
    private Album album;

    public Song(String name, Artist author, Album album) {
        this.name = name;
        this.author = author;
        this.album = album;
    }

    public String getAlbumName() {
        return album.getName();
    }
}

public class Album {
    private String name;

    public Album(String name) {
        validateName(name);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private void validateName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("Album name cannot be empty");
        }
    }
}

이제 Song 객체는 단순한 문자열 데이터를 반환하는 것이 아니라, Album 객체와 협력하여 필요한 정보를 제공하는 역할을 합니다. 또한 Album 클래스 내부에 이름을 검증하는 로직을 추가하여 데이터 무결성을 유지할 수 있도록 했습니다.


풍부한 객체의 장점

(1) 캡슐화 강화

객체의 내부 상태를 보호하고, 불필요한 접근을 차단하여 데이터 무결성을 유지할 수 있습니다.

(2) 비즈니스 로직의 응집도 증가

객체가 자신의 행동을 직접 수행하므로, 관련된 코드가 한곳에 모여 있어 유지보수가 쉬워집니다.

(3) 변경 영향 최소화

외부 코드에서 객체의 내부 구현을 알 필요가 없어, 객체의 속성 변경이 전체 코드에 미치는 영향을 줄일 수 있습니다.


결론

빈약한 객체를 풍부한 객체로 변환하는 것은 소프트웨어의 유지보수성과 확장성을 높이는 중요한 방법입니다. 객체가 데이터를 단순히 저장하는 것이 아니라, 자신의 역할을 수행하도록 설계해야 합니다. 이를 통해 코드의 응집도를 높이고 변경에 강한 소프트웨어를 만들 수 있습니다.

 

 

반응형

'SW 개발 일반 > 클린 코드' 카테고리의 다른 글

디미터 법칙 (Law of Demeter)  (0) 2025.03.21
클린 코드: MAPPER 원칙  (0) 2025.02.05