[java] 롬복을 사용하여 자바 데이터 캐싱을 어떻게 구현하고 사용할 수 있나요?

캐시는 데이터를 메모리에 임시로 저장하여 응답 시간과 성능을 향상시키는 데 사용됩니다. 자바 개발에서는 종종 캐시를 구현하여 데이터베이스나 외부 서비스 호출 횟수를 줄이고, 매번 동일한 작업을 반복하지 않도록 합니다. 롬복은 getter, setter, 생성자 등을 자동으로 생성해주는 라이브러리로, 캐싱과 관련된 코드를 간단하고 간결하게 작성할 수 있도록 도와줍니다.

롬복 설치

롬복을 사용하기 위해서는 먼저 프로젝트에 롬복을 추가해야 합니다. 일반적으로 Maven이나 Gradle을 사용하여 의존성을 추가할 수 있습니다. 아래는 Maven을 사용한 예시입니다.

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

롬복을 설치하고 의존성을 추가한 후에는 프로젝트를 동기화하여 롬복이 사용 가능한 상태인지 확인해야 합니다.

캐싱 클래스 작성하기

롬복을 사용하여 캐싱과 관련된 클래스를 작성해보겠습니다. 예를 들어, UserCache 클래스를 작성하여 사용자 정보를 캐싱하는 기능을 구현해보겠습니다.

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Getter
@Setter
public class UserCache {
    private Map<String, User> cache;

    public UserCache() {
        this.cache = new ConcurrentHashMap<>();
    }

    public User getUser(String username) {
        User user = cache.get(username);
        if (user == null) {
            // 캐시에 없는 경우, 데이터베이스에서 조회 후 캐싱
            user = fetchUserFromDatabase(username);
            cache.put(username, user);
            log.info("Fetched user from database and cached: {}", user);
        } else {
            log.info("Retrieved user from cache: {}", user);
        }
        return user;
    }

    private User fetchUserFromDatabase(String username) {
        // 데이터베이스에서 사용자 정보 조회하는 로직
    }
}

@Getter
@Setter
public class User {
    private String username;
    private String email;
    // 추가적인 필드들...
}

위의 예제 코드에서는 UserCache 클래스가 캐시를 관리하는 역할을 담당합니다. cache 필드는 캐시된 사용자 정보를 담기 위한 ConcurrentHashMap입니다. getUser() 메서드는 입력받은 사용자명을 기반으로 캐시에서 사용자 정보를 조회하고, 캐시에 없을 경우 데이터베이스에서 조회한 후 캐싱합니다.

또한 User 클래스는 롬복을 사용하여 Getter/Setter 메서드를 자동으로 생성하도록 선언되어 있습니다.

캐시 사용하기

이제 UserCache 클래스를 사용하여 캐시를 활용하는 방법을 알아보겠습니다. 다음은 예시 코드입니다.

public class Main {
    public static void main(String[] args) {
        UserCache userCache = new UserCache();

        User user1 = userCache.getUser("john");
        User user2 = userCache.getUser("mary");
        User user3 = userCache.getUser("john");

        // 캐시된 사용자 정보 출력
        System.out.println(user1.getUsername() + ": " + user1.getEmail());
        System.out.println(user2.getUsername() + ": " + user2.getEmail());
        System.out.println(user3.getUsername() + ": " + user3.getEmail());
    }
}

위의 코드에서는 UserCache 객체를 생성한 후 getUser() 메서드를 호출하여 사용자 정보를 가져옵니다. 첫 번째와 두 번째 호출에서는 데이터베이스에서 사용자 정보를 조회하고 캐시에 저장하며, 세 번째 호출에서는 캐시에서 사용자 정보를 가져옵니다. 결과적으로 첫 번째와 세 번째 호출은 동일한 사용자 정보를 반환하는 것을 확인할 수 있습니다.

이제 롬복을 사용하여 자바 데이터 캐싱을 구현하는 방법에 대해 알아보았습니다. 롬복은 코드를 간결하게 작성할 수 있도록 도와주므로, 개발자가 효율적으로 캐싱 기능을 구현할 수 있게 해줍니다.

참고 자료