Home > CS > 2024 > πŸ’Ύ [CS] ν”„λ‘μ‹œ νŒ¨ν„΄κ³Ό ν”„λ‘μ‹œ μ„œλ²„ - 2

πŸ’Ύ [CS] ν”„λ‘μ‹œ νŒ¨ν„΄κ³Ό ν”„λ‘μ‹œ μ„œλ²„ - 2
CS

πŸ’Ύ [CS] ν”„λ‘μ‹œ νŒ¨ν„΄κ³Ό ν”„λ‘μ‹œ μ„œλ²„ - 2

1️⃣ ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern).

  • ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ, μ–΄λ–€ 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ κ·Έ 객체의 λŒ€λ¦¬μΈ 역할을 ν•˜λŠ” λ³„λ„μ˜ 객체(ν”„λ‘μ‹œ, Proxy)λ₯Ό μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.
    • 이 νŒ¨ν„΄μ„ 톡해 ν΄λΌμ΄μ–ΈνŠΈλŠ” μ›λž˜μ˜ 객체 λŒ€μ‹  ν”„λ‘μ‹œ 객체λ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μ›λž˜μ˜ 객체에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ μ£Όμš” λͺ©μ .

  • 1. μ ‘κ·Ό μ œμ–΄ : ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹€μ œ 객체에 직접 μ ‘κ·Όν•˜λŠ” 것을 μ œν•œν•˜κ±°λ‚˜ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. 지연 μ΄ˆκΈ°ν™”(Lazy Initialization) : μ‹€μ œ 객체의 생성과 μ΄ˆκΈ°ν™”λ₯Ό ν•„μš”ν•  λ•ŒκΉŒμ§€ λ―Έλ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, λ©”λͺ¨λ¦¬λ‚˜ λ¦¬μ†ŒμŠ€ μ†Œλͺ¨κ°€ 큰 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. 보호(Protection) : νŠΉμ • μ‘°κ±΄μ—μ„œλ§Œ μ‹€μ œ 객체에 μ ‘κ·Όν•  수 μžˆλ„λ‘ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 4. 원격 μ ‘κ·Ό : 원격 객체에 둜컬 객체처럼 μ ‘κ·Όν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

2️⃣ ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ μœ ν˜•.

  • 1. 가상 ν”„λ‘μ‹œ(Virtual Proxy)
    • μ‹€μ œ 객체의 생성을 μ§€μ—°μ‹œμΌœ μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, 이미지 λ‘œλ”©μ„ μ§€μ—°μ‹œμΌœ ν•„μš”ν•  λ•Œλ§Œ λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. 보호 ν”„λ‘μ‹œ(Protection Proxy)
    • μ ‘κ·Ό κΆŒν•œμ΄ μ—†λŠ” μ‚¬μš©μžλ‚˜ ν΄λΌμ΄μ–ΈνŠΈκ°€ 객체에 μ ‘κ·Όν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, νŠΉμ • μ‚¬μš©μžλ§Œ 큭정 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ„λ‘ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. 원격 ν”„λ‘μ‹œ(Remote Proxy)
    • 원격 μ„œλ²„μ— μœ„μΉ˜ν•œ 객체λ₯Ό λ‘œμ»¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 ν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ 원격 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 4. 슀마트 μ°Έμ‘° ν”„λ‘μ‹œ(Smart Reference Proxy)
    • μ‹€μ œ 객체에 λŒ€ν•œ 좔가적인 행동을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, μ°Έμ‘° 횟수λ₯Ό κΈ°λ‘ν•˜κ±°λ‚˜, 객체에 μ ‘κ·Όν•  λ•Œλ§ˆλ‹€ 둜그λ₯Ό 남길 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ ꡬ쑰.

  • ν”„λ‘μ‹œ νŒ¨ν„΄μ€ λ‹€μŒκ³Ό 같은 ꡬ성 μš”μ†Œλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.
    • Subject(주제) : ν”„λ‘μ‹œμ™€ μ‹€μ œ 객체가 κ΅¬ν˜„ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ, κ³΅ν†΅λœ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
    • RealSubject(μ‹€μ œ 주제) : μ‹€μ œλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›λž˜ μ ‘κ·Όν•˜κ³ μž ν•˜λŠ” λŒ€μƒμž…λ‹ˆλ‹€.
    • Proxy(ν”„λ‘μ‹œ) : RealSubject에 λŒ€ν•œ μ°Έμ‘°λ₯Ό 가지고 있으며, RealSubject의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ 접근을 μ œμ–΄ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

4️⃣ 예제.

  • 예λ₯Ό λ“€μ–΄, 이미지λ₯Ό λ‘œλ”©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.
  • 이미지λ₯Ό λ‘œλ“œν•˜λŠ” μž‘μ—…μ€ μ‹œκ°„μ΄ 였래 걸릴 수 μžˆμœΌλ―€λ‘œ, 이미지가 μ‹€μ œλ‘œ ν•„μš”ν•  λ•ŒκΉŒμ§€ λ‘œλ”©μ„ μ§€μ—°μ‹œν‚€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.
    • μ΄λ•Œ 가상 ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
interface Image {
    void display();
}

class RealImage implements Image {
    private String filename;
    
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }
    
    private void loadFromDisk() {
        System.out.println("Loading " + filename);
    }
    
    @Override
    public void display() {
        System.out.println("Displaying " + filename);
    }
}

class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;
    
    public ProxyImage(String filename) {
        this.filename = filename;
    }
    
    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

public class ProxyPatternExample {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");
        
        // μ‹€μ œλ‘œ 이미지가 ν•„μš”ν•  λ•Œλ§Œ λ‘œλ“œν•©λ‹ˆλ‹€.
        image.display(); // Loading test.jpg, Displaying test.jpg
        image.display(); // Displaying test.jpg (이미 λ‘œλ“œλ˜μ—ˆμœΌλ―€λ‘œ λ‹€μ‹œ λ‘œλ“œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    }
}
  • μœ„ μ½”λ“œμ—μ„œ ProxyImageλŠ” RealImage에 λŒ€ν•œ ν”„λ‘μ‹œ 역할을 ν•©λ‹ˆλ‹€.
    • ProxyImageλ₯Ό 톡해 이미지λ₯Ό λ‘œλ“œν•  λ•Œ, 이미지λ₯Ό μ‹€μ œλ‘œ ν•„μš”ν•  λ•Œλ§Œ λ‘œλ“œν•˜λ„λ‘ μ§€μ—°μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 두 번째 display() ν˜ΈμΆœμ—μ„œλŠ” 이미 λ‘œλ“œλœ 이미지가 있기 λ•Œλ¬Έμ— λ‹€μ‹œ λ‘œλ“œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ ν”„λ‘μ‹œ νŒ¨ν„΄μ€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ½”λ“œ λ³€κ²½ 없이 μ‹€μ œ 객체의 μ ‘κ·Ό λ°©μ‹μ΄λ‚˜ λ™μž‘μ„ λ³€κ²½ν•˜κ±°λ‚˜ ν™•μž₯ν•˜λŠ” 데 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ Javaμ—μ„œμ˜ ν”„λ‘μ‹œ νŒ¨ν„΄.

  • ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)은 Javaμ—μ„œλ„ 맀우 자주 μ‚¬μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
    • ν”„λ‘μ‹œ νŒ¨ν„΄μ€ μ–΄λ–€ 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜κΈ° μœ„ν•΄ κ·Έ 객체의 λŒ€λ¦¬μΈ 역할을 ν•˜λŠ” λ³„λ„μ˜ 객체(ν”„λ‘μ‹œ 객체)λ₯Ό μ œκ³΅ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.
  • Javaμ—μ„œ ν”„λ‘μ‹œ νŒ¨ν„΄μ€ λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μ‚¬μš©λ  수 있으며, λŒ€ν‘œμ μΈ μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    • 1. 가상 ν”„λ‘μ‹œ(Virtual Proxy)
      • μ‹€μ œ 객체의 생성을 μ§€μ—°μ‹œν‚€κ³ , ν•„μš”ν•  λ•Œμ—λ§Œ 객체λ₯Ό μƒμ„±ν•˜λ„λ‘ν•©λ‹ˆλ‹€.
        • 예λ₯Ό λ“€μ–΄, λ©”λͺ¨λ¦¬λ‚˜ λ¦¬μ†ŒμŠ€κ°€ 큰 객체의 생성을 μ§€μ—°μ‹œμΌœ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 2. λ³΄μ•ˆ ν”„λ‘μ‹œ(Protectioon Proxy)
      • 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜μ—¬, νŠΉμ • μ‚¬μš©μžλ‚˜ 쑰건에 따라 μ ‘κ·Ό κΆŒν•œμ„ λΆ€μ—¬ν•˜κ±°λ‚˜ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
        • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μž 인증이 ν•„μš”ν•œ μ‹œμŠ€ν…œμ—μ„œ νŠΉμ • μ„œλΉ„μŠ€λ‚˜ μžμ›μ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 3. 원격 ν”„λ‘μ‹œ(Remote Proxy)
      • 원격 μ„œλ²„μ— μœ„μΉ˜ν•œ 객체λ₯Ό λ‘œμ»¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.
        • Java RMI(Remote Method Invocation)κ°€ λŒ€ν‘œμ μΈ μ˜ˆμž…λ‹ˆλ‹€.
    • 4. 캐싱 ν”„λ‘μ‹œ(Caching Proxy)
      • 반볡적으둜 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œλ‚˜ 객체의 κ²°κ³Όλ₯Ό μΊμ‹±ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.

6️⃣ Javaμ—μ„œ ν”„λ‘μ‹œ νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” 방법.

  • ν”„λ‘μ‹œ 클래슀λ₯Ό 직접 κ΅¬ν˜„
    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν”„λ‘μ‹œ 클래슀λ₯Ό μƒμ„±ν•˜μ—¬, μ‹€μ œ 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•©λ‹ˆλ‹€.
  • Java Dynamic Proxy
    • Java의 java.lang.reflect.Proxy 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ ν”„λ‘μ‹œ 객체λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
      • 이 방법은 μΈν„°νŽ˜μ΄μŠ€ 기반의 ν”„λ‘μ‹œ 생성에 μœ μš©ν•©λ‹ˆλ‹€.
  • CGLIB
    • μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†λŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλ„ ν”„λ‘μ‹œλ₯Ό 생성할 수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
      • Spring ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” 주둜 AOP(Aspect-Oriented Programming) κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•Œ CGLIB을 ν™œμš©ν•©λ‹ˆλ‹€.
  • ν”„λ‘μ‹œ νŒ¨ν„΄μ€ 특히 Spring ν”„λ ˆμž„μ›Œν¬μ—μ„œ AOPλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜, νŠΈλžœμž­μ…˜ 관리와 같은 ν¬λ‘œμŠ€μ»·νŒ…(Cross-cutting) 관심사λ₯Ό μ²˜λ¦¬ν•  λ•Œ 널리 μ‚¬μš©λ©λ‹ˆλ‹€.

2️⃣ ν”„λ‘μ‹œ μ„œλ²„(Proxy Server).

  • ν”„λ‘μ‹œ μ„œλ²„(Proxy Server)λŠ” 컴퓨터 λ„€νŠΈμ›Œν¬μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ μ€‘κ³„μž 역할을 ν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€.
  • ν”„λ‘μ‹œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ λ¦¬μ†ŒμŠ€(μ›ΉνŽ˜μ΄μ§€, 파일 λ“±)λ₯Ό λŒ€μ‹  λ°›μ•„μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•˜κ±°λ‚˜, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ‹€λ₯Έ μ„œλ²„λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ—¬λŸ¬ 가지 μ€‘μš”ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ ν”„λ‘μ‹œ μ„œλ²„μ˜ μ£Όμš” κΈ°λŠ₯.

  • 1. 읡λͺ…μ„± 제곡 : ν΄λΌμ΄μ–ΈνŠΈμ˜ IP μ£Όμ†Œλ₯Ό 숨기고, λŒ€μ‹  ν”„λ‘μ‹œ μ„œλ²„μ˜ IP μ£Όμ†Œλ‘œ μ„œλ²„μ— μ ‘κ·Όν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈλŠ” 읡λͺ…성을 μœ μ§€ν•  수 있으며, μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μ‹€μ œ IP μ£Όμ†Œλ₯Ό μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.
  • 2. λ³΄μ•ˆ κ°•ν™” : ν”„λ‘μ‹œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ νŠΈλž˜ν”½μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³  μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λΆˆν•„μš”ν•œ μš”μ²­μ„ μ°¨λ‹¨ν•˜κ±°λ‚˜, νŠΉμ • μ›Ήμ‚¬μ΄νŠΈ 접근을 μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ•…μ„± νŠΈλž˜ν”½μ„ ν•„ν„°λ§ν•˜μ—¬ λ„€νŠΈμ›Œν¬ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. 캐싱(Caching) : ν”„λ‘μ‹œ μ„œλ²„λŠ” 자주 μš”μ²­λ˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό μΊμ‹±ν•˜μ—¬ μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄이고, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λΉ λ₯΄κ²Œ 응닡할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ™μΌν•œ μ›ΉνŽ˜μ΄μ§€κ°€ μ—¬λŸ¬ 번 μš”μ²­λ˜λŠ” 경우, ν”„λ‘μ‹œ μ„œλ²„λŠ” 이 νŽ˜μ΄μ§€λ₯Ό μΊμ‹œμ— μ €μž₯ν•΄ 두고, 이후 μš”μ²­μ— λŒ€ν•΄ μΊμ‹œμ—μ„œ 직접 μ‘λ‹΅ν•©λ‹ˆλ‹€.
  • 4. μ½˜ν…μΈ  필터링 : ν”„λ‘μ‹œ μ„œλ²„λŠ” νŠΉμ • μ½˜ν…μΈ μ— λŒ€ν•œ 접근을 μ œν•œν•˜κ±°λ‚˜ 차단할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 학ꡐ, κΈ°μ—… λ˜λŠ” κ°€μ •μ—μ„œ νŠΉμ • μ›Ήμ‚¬μ΄νŠΈλ‚˜ μ½˜ν…μΈ μ— λŒ€ν•œ 접근을 μ œμ–΄ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.
  • 5. λ‘œλ“œ λ°ΈλŸ°μ‹± : ν”„λ‘μ‹œ μ„œλ²„λŠ” μ—¬λŸ¬ μ„œλ²„μ— 걸쳐 νŠΈλž˜ν”½μ„ λΆ„μ‚°μ‹œμΌœ λ‘œλ“œ λ°ΈλŸ°μ‹±μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό κ· λ“±ν•˜κ²Œ λ‚˜λˆ„κ³ , μ‹œμŠ€ν…œμ˜ μ„±λŠ₯κ³Ό μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 6. 데이터 μ••μΆ• : ν”„λ‘μ‹œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 μ£Όκ³ λ°›λŠ” 데이터λ₯Ό μ••μΆ•ν•˜μ—¬ λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ„ 쀄이고, 응닡 속도λ₯Ό ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ ν”„λ‘μ‹œ μ„œλ²„μ˜ μœ ν˜•.

  • 1. μ •λ°©ν–₯ ν”„λ‘μ‹œ(Forward Proxy)
    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λŒ€μ‹  μ„œλ²„λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
    • 주둜 ν΄λΌμ΄μ–ΈνŠΈκ°€ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 μ™ΈλΆ€ λ„€νŠΈμ›Œν¬μ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, μ›Ή λΈŒλΌμš°μ € μ„€μ •μ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ €μž₯ν•˜λ©΄, λͺ¨λ“  μ›Ή νŠΈλž˜ν”½μ΄ 이 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 μ „λ‹¬λ©λ‹ˆλ‹€.
  • 2. λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ(Reverse Proxy)
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄μ—μ„œ μ„œλ²„λ₯Ό λŒ€μ‹ ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • 주둜 μ›Ή μ„œλ²„ μ•žλ‹¨μ— μœ„μΉ˜ν•˜μ—¬ μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄이고, λ³΄μ•ˆμ„ κ°•ν™”ν•˜λ©°, λ‘œλ“œ λ°ΈλŸ°μ‹±μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹€μ œ μ„œλ²„μ˜ μœ„μΉ˜λ₯Ό μ•Œμ§€ λͺ»ν•˜κ²Œ ν•˜μ—¬ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. μ›Ή ν”„λ‘μ‹œ(Web Proxy)
    • μ›Ή λΈŒλΌμš°μ €λ₯Ό 톡해 νŠΉμ • μ›Ήμ‚¬μ΄νŠΈμ— μ ‘κ·Όν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν”„λ‘μ‹œ μ„œλ²„μž…λ‹ˆλ‹€.
    • μ‚¬μš©μžλŠ” μ›Ή ν”„λ‘μ‹œ μ‚¬μ΄νŠΈλ₯Ό 톡해 μ°¨λ‹¨λœ μ›Ήμ‚¬μ΄νŠΈμ— μ ‘κ·Όν•˜κ±°λ‚˜, 읡λͺ…μœΌλ‘œ 웹을 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 4. νŠΈλžœμŠ€νŽ˜μ–΄λŸ°νŠΈ ν”„λ‘μ‹œ(Transparent Proxy)
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” 사싀을 λͺ¨λ₯΄κ²Œ ν•˜λ©΄μ„œ νŠΈλž˜ν”½μ„ μ€‘κ³„ν•˜λŠ” ν”„λ‘μ‹œ μ„œλ²„μž…λ‹ˆλ‹€.
    • 주둜 ISP(인터넷 μ„œλΉ„μŠ€ 제곡자)λ‚˜ κΈ°μ—… λ„€νŠΈμ›Œν¬μ—μ„œ νŠΈλ ˆν”½μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ±°λ‚˜ ν•„ν„°λ§ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

3️⃣ ν”„λ‘μ‹œ μ„œλ²„μ˜ 예.

  • νšŒμ‚¬ λ„€νŠΈμ›Œν¬μ—μ„œμ˜ ν”„λ‘μ‹œ μ„œλ²„
    • νšŒμ‚¬λŠ” 직원듀이 인터넷에 μ ‘κ·Όν•  λ•Œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 μ ‘κ·Όν•˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이 ν”„λ‘μ‹œ μ„œλ²„λŠ” 직원듀이 μ–΄λ–€ μ›Ήμ‚¬μ΄νŠΈμ— μ ‘κ·Όν•˜λŠ”μ§€ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , ν•„μš”μ— 따라 νŠΉμ • μ‚¬μ΄νŠΈμ— λŒ€ν•œ 접근을 차단할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 곡곡 Wi-Fi의 ν”„λ‘μ‹œ μ„œλ²„
    • 곡곡 Wi-Fi λ„€νŠΈμ›Œν¬λŠ” ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 μ‚¬μš©μž νŠΈλž˜ν”½μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ•…μ„± μ‚¬μ΄νŠΈμ— λŒ€ν•œ 접근을 μ°¨λ‹¨ν•˜κ±°λ‚˜, λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μ „μ†‘λ˜λŠ” 데이터λ₯Ό μ•”ν˜Έν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν”„λ‘μ‹œ μ„œλ²„λŠ” λ„€νŠΈμ›Œν¬μ˜ μ„±λŠ₯, λ³΄μ•ˆ, 그리고 μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•˜κΈ° μœ„ν•œ κ°•λ ₯ν•œ λ„κ΅¬λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

4️⃣ Javaμ—μ„œμ˜ ν”„λ‘μ‹œ μ„œλ²„(Proxy Server) μ‚¬μš© 사둀.

  • ν”„λ‘μ‹œ μ„œλ²„λŠ” λ„€νŠΈμ›Œν¬ ν™˜κ²½μ—μ„œ ν΄λΌμ΄ν„΄νŠΈμ™€ μ„œλ²„ κ°„μ˜ μ€‘κ³„μž 역할을 ν•˜λŠ” μ„œλ²„μž…λ‹ˆλ‹€.
    • Javaμ—μ„œλŠ” λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•  수 있으며, κ·Έ ν™œμš© 방법도 맀우 λ‹€μ–‘ν•©λ‹ˆλ‹€.
  • 1. HTTP/HTTPS ν”„λ‘μ‹œ
    • Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ™ΈλΆ€ λ„€νŠΈμ›Œν¬μ— μš”μ²­μ„ 보내야 ν•  λ•Œ, ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 νŠΈλž˜ν”½μ„ 쀑계할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λ³΄μ•ˆ, λ‘œκΉ…, 캐싱, IP λ§ˆμŠ€ν‚Ή 등을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      System.setProperty("http.proxyHost", "proxy.example.com");
      System.setProperty("http.proxyPort", "8080");
      System.setProperty("https.proxyHost", "proxy.example.com");
      System.setProperty("https.proxyPort", "8080");
      
  • μœ„μ™€ 같이 μ‹œμŠ€ν…œ ν”„λ‘œνΌν‹°λ₯Ό μ„€μ •ν•˜μ—¬ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ HTTP 및 HTTPS μš”μ²­μ„ 보낼 λ•Œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 2. SOCKS ν”„λ‘μ‹œ
    • Javaμ—μ„œλŠ” SOCKS ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ TCP/IP 기반의 λͺ¨λ“  연결을 ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 쀑계할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • SOCKS ν”„λ‘μ‹œλŠ” HTTP/HTTPS ν”„λ‘μ‹œλ³΄λ‹€ 더 일반적인 νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      System.setProperty("socksProxyHost", "proxy.example.com");
      System.setProperty("socksProxyPort", "1080");
      
  • μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ TCP/IP 연결을 μ‹œλ„ν•  λ•Œ SOCKS ν”„λ‘μ‹œ μ„œλ²„λ₯Ό 톡해 연결을 μ‹œλ„ν•©λ‹ˆλ‹€.

  • 3. RMI(Remote Method Invocation) ν”„λ‘μ‹œ
    • Java RMIλŠ” λΆ„μ‚° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 원격 λ©”μ„œλ“œ ν˜ΈμΆœμ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.
    • RMIμ—μ„œ ν”„λ‘μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 원격 객체에 μ ‘κ·Όν•  λ•Œ 둜컬 객체처럼 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • 4. Spring Clould Gateway
    • λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ—μ„œ Java둜 개발된 μ„œλΉ„μŠ€λ“€μ„ μ—°κ²°ν•˜κ³  API κ²Œμ΄νŠΈμ›¨μ΄ 역할을 μˆ˜ν–‰ν•˜λŠ” 데 Spring Clould Gateway와 같은 ν”„λ‘μ‹œ μ„œλ²„ 역할을 ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„μ˜ 톡신을 κ΄€λ¦¬ν•˜κ³ , λ³΄μ•ˆ, λ‘œκΉ…, 인증/인가λ₯Ό λ‹΄λ‹Ήν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 5. Reverse Proxy
    • Java μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„ λ’€μ—μ„œ 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, Nginxλ‚˜ Apache HTTP Serverλ₯Ό ν”„λ‘μ‹œλ‘œ μ„€μ •ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ Java μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ ν”„λ‘μ‹œ μ„œλ²„ μ‚¬μš©μ˜ μž₯점.

  • λ³΄μ•ˆ κ°•ν™”
    • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ˜ νŠΈλž˜ν”½μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , νŠΉμ • μš”μ²­μ„ μ°¨λ‹¨ν•˜κ±°λ‚˜ ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 캐싱
    • ν”„λ‘μ‹œ μ„œλ²„λŠ” 자주 μš”μ²­λ˜λŠ” 데이터λ₯Ό μΊμ‹œν•˜μ—¬ μ„œλ²„ λΆ€ν•˜λ₯Ό 쀄이고 응닡 속도λ₯Ό ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŠΈλž˜ν”½ 관리
    • ν”„λ‘μ‹œ μ„œλ²„λŠ” λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ„ κ΄€λ¦¬ν•˜κ³ , λ‘œλ“œ λ°ΈλŸ°μ‹±κ³Ό 같은 κΈ°λŠ₯을 톡해 μ‹œμŠ€ν…œμ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • IP λ§ˆμŠ€ν‚Ή
    • ν΄λΌμ΄μ–ΈνŠΈμ˜ IP μ£Όμ†Œλ₯Ό 숨기고, ν”„λ‘μ‹œ μ„œλ²„μ˜ IP μ£Όμ†Œλ₯Ό λŒ€μ‹  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 λ„€νŠΈμ›Œν¬ ν™˜κ²½μ„ μ œμ–΄ν•˜κ³  λ³΄μ•ˆμ„ κ°•ν™”ν•˜λ©° μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ”λ° 맀우 μœ μš©ν•©λ‹ˆλ‹€.