네임스페이스(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 백엔드 개발에서도 유용하게 적용됩니다. 이를 기반으로 신입 백엔드 개발자가 실습할 만한 주제를 아래에 정리해보았습니다.
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();
}
}
@Component와 @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());
}
}
/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;
}
}
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)
);
멀티모듈 프로젝트:
API 버전 관리:
/v1과 /v2 경로로 다른 기능을 제공./v1/products는 간단한 JSON 반환, /v2/products는 필터와 정렬 기능 추가.서비스 분리 연습:
위 실습과 학습 주제를 통해 네임스페이스의 개념을 실제 프로젝트와 백엔드 설계에 적용할 수 있습니다. 😊