>Java >java지도 시간 >디자인 패턴 시리즈 — 구조적 장: 프록시 패턴

디자인 패턴 시리즈 — 구조적 장: 프록시 패턴

Linda Hamilton
Linda Hamilton원래의
2025-01-21 04:06:16731검색

디자인 패턴: 일반적인 소프트웨어 개발 문제를 위한 효율적인 솔루션. 이러한 사전 구축된 솔루션은 "바퀴 재발명"을 방지하여 자주 반복되는 문제에 대한 답변을 제공합니다. 그러나 모든 경우에 적용할 수 있는 것은 아닙니다. 개발자는 특정 프로젝트 요구 사항에 맞게 패턴을 조정해야 합니다.

디자인 패턴은 창작, 구조, 행동의 세 그룹으로 분류되며 각각 고유한 특성을 가지고 있습니다. 이 기사에서는 널리 사용되는 구조 패턴인 프록시 패턴에 중점을 둡니다.

프록시 패턴 이해

프록시 패턴을 파악하려면 다음 시나리오를 고려하세요. 사용자 데이터에 액세스하려면 먼저 별도의 서비스를 통해 JWT(JSON 웹 토큰)를 얻어야 합니다.

문제

프록시 패턴이 없으면 각 사용자 데이터 요청에 JWT 요청이 필요하므로 특히 JWT 서비스가 느리거나 토큰 만료 시간이 효율적으로 관리되지 않는 경우 성능 병목 현상이 발생합니다. 이러한 비효율적인 접근 방식은 다음과 같습니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

이렇게 반복되는 JWT 가져오기로 인해 데이터 검색 속도가 느려집니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

해법은 프록시 패턴에 있습니다.

솔루션

프록시 패턴은 클라이언트와 실제 객체(JWT 서비스) 사이에 중간 계층인 프록시를 도입합니다. 이 중개자는 캐싱이나 보안 검사와 같은 기능을 추가하여 액세스를 관리합니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

이렇게 하면 JWT를 캐싱하여 JWT 서비스에 대한 호출을 줄여 효율성이 향상됩니다. 프록시 패턴을 사용하여 개선된 아키텍처는 다음과 같습니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

클래스 다이어그램은 구현을 보여줍니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

클래스 다이어그램은 다음을 보여줍니다.

  • 제목(JWTService): 프록시와 실제 JWT 서비스 모두에서 구현되는 공통 인터페이스입니다. requestJWT() 메서드를 정의합니다.
  • 실제 주제(JWTServiceImpl): JWTService을 구현하고 실제 JWT 생성 기능을 제공합니다.
  • 프록시(JWTServiceProxy): JWTServiceImpl에 대한 액세스를 제어합니다. 캐싱 및 유효성 검사 논리를 추가합니다.

JWT 생성을 위한 프록시 패턴 구현

전체 코드 예제는 프록시 패턴 저장소에서 확인할 수 있습니다. 다음은 주요 구성 요소입니다.

JWT 객체

JWT 클래스(Java 16 레코드 사용)는 JWT 데이터(토큰, 만료 시간, 생성 시간)를 저장하고 유효성을 확인하기 위한 validateJWT() 메서드를 포함합니다.

<code class="language-java">public record JWT(String token, long expirationTime, long creationTime) {
    public boolean validateJWT(){
        long currentTimeInSeconds = System.currentTimeMillis() / 1000;
        return currentTimeInSeconds < creationTime + expirationTime;
    }
}</code>

주제(인터페이스)

JWTService 인터페이스는 requestJWT() 메소드를 선언합니다.

<code class="language-java">public interface JWTService {
    JWT requestJWT();
}</code>

실제 주제

JWTServiceImplJWTService을 구현하여 모의 JWT를 생성합니다.

<code class="language-java">public class JWTServiceImpl implements JWTService {
    @Override
    public JWT requestJWT() {
        return new JWT(generateToken(), 5, System.currentTimeMillis() / 1000);
    }

    // ... generateToken() method (simplified for this example) ...
}</code>

프록시

JWTServiceProxy JWT를 캐시하고 검증합니다.

<code class="language-java">public class JWTServiceProxy implements JWTService {
    private final JWTService jwtService;
    private JWT jwt;

    public JWTServiceProxy() {
        this.jwtService = new JWTServiceImpl();
    }

    @Override
    public JWT requestJWT() {
        if (jwt == null || !jwt.validateJWT()) {
            jwt = jwtService.requestJWT();
        }
        return jwt;
    }
}</code>

프록시 패턴 테스트

간단한 테스트로 프록시의 캐싱 동작을 보여줍니다.

<code class="language-java">// ... (Main class with logging and Thread.sleep(5000) to simulate token expiration) ...</code>

출력에서는 처음에 하나의 JWT만 생성되고 첫 번째 JWT가 만료된 후에만 새 JWT가 생성되어 프록시의 캐싱 및 유효성 검사 기능을 보여줍니다.

Design Patterns Serie — Structural Chapter: Proxy Pattern

결론

프록시 패턴은 소프트웨어 효율성과 보안을 강화합니다. 개발자는 시스템 아키텍처와 잠재적인 병목 현상을 신중하게 고려하여 이 패턴을 활용하여 더욱 강력하고 유지 관리가 가능한 애플리케이션을 만들 수 있습니다. 특정 요구 사항에 맞게 패턴을 조정하는 것을 잊지 마십시오. 즐거운 코딩하세요! ❤️

위 내용은 디자인 패턴 시리즈 — 구조적 장: 프록시 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.