네임스페이스란 무엇인가요?

김상욱·2024년 11월 18일

네임스페이스란 무엇인가요?

네임스페이스(namespace)는 프로그램 내에서 식별자(변수, 함수, 클래스 이름 등)가 충돌하지 않도록 구분짓는 논리적 영역입니다. 네임스페이스를 사용하면 동일한 이름의 식별자가 다른 네임스페이스에 존재하더라도 충돌 없이 사용할 수 있습니다.

-> 대규모 프로그램에서는 변수, 함수, 클래스 이름 등이 많아지기 때문에 이름 충돌이 발생할 가능성이 높아짐 -> 서로 다른 콛에서 동일한 이름을 사용하더라도 각기 다른 영역에서 독립적으로 동작하도록 할 수 있음.

작동 방식 : 식별자를 특정 범위로 제한

Java에서는 패키지와 클래스가 네임스페이스 역할. 다른 패키지에서 동일한 이름의 클래스를 사용할 때, 패키지 경로를 통해 구분

package com.example.namespaceA;
public class MyClass {
    public void printMessage() {
        System.out.println("Hello from NamespaceA");
    }
}

package com.example.namespaceB;
public class MyClass {
    public void printMessage() {
        System.out.println("Hello from NamespaceB");
    }
}

// 사용 시
import com.example.namespaceA.MyClass;

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        obj.printMessage();
    }
}

같이 이름의 식별자를 사용 가능하기 때문에 코드 관리가 용이하고, 코드를 네임스페이스로 구분하기 때문에 재사용성과 유지보수성이 높다.
또한 대규모 프로젝트에서는 이런 충돌문제를 해결하기 쉽다.


네임스페이스 개념과 활용은 Java와 Spring 백엔드 개발에서도 유용하게 적용됩니다. 이를 기반으로 신입 백엔드 개발자가 실습할 만한 주제를 아래에 정리해보았습니다.


1. Java 패키지 및 클래스 구조 실습

목표:

  • Java에서 네임스페이스 역할을 하는 패키지 구조클래스 관리를 익히기.

실습 내용:

  • 서로 다른 패키지에서 동일한 클래스 이름을 사용하고, 이를 import로 구분하여 호출하기.
  • 여러 패키지에서 유틸리티 클래스 관리 (예: com.utils, com.services).
// 패키지 A
package com.example.serviceA;

public class UserService {
    public void printUser() {
        System.out.println("ServiceA User");
    }
}

// 패키지 B
package com.example.serviceB;

public class UserService {
    public void printUser() {
        System.out.println("ServiceB User");
    }
}

// Main 클래스
import com.example.serviceA.UserService as UserServiceA;
import com.example.serviceB.UserService as UserServiceB;

public class Main {
    public static void main(String[] args) {
        UserServiceA serviceA = new UserServiceA();
        UserServiceB serviceB = new UserServiceB();

        serviceA.printUser();
        serviceB.printUser();
    }
}

2. Spring Component와 Bean 네임스페이스 실습

목표:

  • Spring에서 네임스페이스 충돌을 방지하며 @Component@Bean을 사용해보기.

실습 내용:

  • 동일한 이름의 Bean을 서로 다른 패키지에서 생성하고 @Qualifier로 주입하기.
// 패키지 A
package com.example.repositoryA;

import org.springframework.stereotype.Component;

@Component("userRepository")
public class UserRepositoryA {
    public String getData() {
        return "Repository A Data";
    }
}

// 패키지 B
package com.example.repositoryB;

import org.springframework.stereotype.Component;

@Component("userRepository")
public class UserRepositoryB {
    public String getData() {
        return "Repository B Data";
    }
}

// Main Service
package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    @Autowired
    @Qualifier("userRepository") // 충돌 해결
    private UserRepositoryA repositoryA;

    @Autowired
    @Qualifier("userRepository") // 충돌 해결
    private UserRepositoryB repositoryB;

    public void printRepositories() {
        System.out.println(repositoryA.getData());
        System.out.println(repositoryB.getData());
    }
}

3. REST API 네임스페이스 실습

목표:

  • REST API 개발 시, URL 경로를 네임스페이스처럼 설계하여 리소스 관리 익히기.

실습 내용:

  • 사용자와 관리자의 리소스 API를 각각 분리하여 네임스페이스처럼 설계.
  • 예를 들어 /api/v1/users/api/v1/admins를 분리하여 관리.
@RestController
@RequestMapping("/api/v1/users")
public class UserController {

    @GetMapping
    public String getUsers() {
        return "All Users";
    }

    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id) {
        return "User: " + id;
    }
}

@RestController
@RequestMapping("/api/v1/admins")
public class AdminController {

    @GetMapping
    public String getAdmins() {
        return "All Admins";
    }

    @GetMapping("/{id}")
    public String getAdmin(@PathVariable Long id) {
        return "Admin: " + id;
    }
}

4. 네임스페이스와 데이터베이스 테이블 관리

목표:

  • 데이터베이스에서 네임스페이스를 사용하는 것처럼 스키마(Schema)를 활용해보기.

실습 내용:

  • 사용자와 관리자를 각각 다른 스키마에 저장하고, SQL로 각 스키마의 데이터를 관리.
  • application.properties에서 데이터베이스 연결을 환경에 따라 분리.
-- Schema: user_schema
CREATE SCHEMA user_schema;

CREATE TABLE user_schema.users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- Schema: admin_schema
CREATE SCHEMA admin_schema;

CREATE TABLE admin_schema.admins (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

5. 실습 아이디어 프로젝트

  1. 멀티모듈 프로젝트:

    • 네임스페이스 개념을 활용해 도메인별(예: 유저 관리, 주문 관리)로 모듈을 분리한 프로젝트 생성.
    • Spring Boot 멀티모듈 예제를 참고.
  2. API 버전 관리:

    • REST API 네임스페이스를 활용해 /v1/v2 경로로 다른 기능을 제공.
    • 예: /v1/products는 간단한 JSON 반환, /v2/products는 필터와 정렬 기능 추가.
  3. 서비스 분리 연습:

    • 각 기능을 별도 패키지(혹은 별도 서비스)로 분리하여 관리.
    • 예: 사용자 인증 패키지, 상품 관리 패키지 등.

6. 실습을 확장하기 위한 학습 주제

  • Spring Profiles: 환경별 네임스페이스 설정 (개발/운영).
  • Cloud 네임스페이스: AWS S3 버킷이나 Kubernetes 네임스페이스 활용.
  • Domain-Driven Design(DDD): 도메인 기반 네임스페이스 설계.

위 실습과 학습 주제를 통해 네임스페이스의 개념을 실제 프로젝트와 백엔드 설계에 적용할 수 있습니다. 😊

0개의 댓글