🔬 Java/Spring Boot 변수 명명 규칙: 단수 vs 복수 정리

자바나 PHP의 명명법(Naming Convention)을 검색하면 수많은 자료가 나옵니다. 하지만 정작 중요한 건

"내가 변수명을 올바르게 쓰고 있는가?" 입니다.

이 글에서는 Post(게시글)를 예시로, 실무에서 혼란스러울 수 있는 단수형과 복수형 사용 규칙을 명확하게 정리해보겠습니다.

제가 겪은 혼란 처음에는 모든 것을 posts로 통일했습니다.

// ❌ 초기 버전 - 모두 복수형
변수명: posts
클래스명: Posts
Entity: Posts
DTO: Posts
테이블명: posts

하지만 이렇게 작성하니 코드를 읽을 때 혼란스러웠습니다

Posts posts = new Posts();  // "게시글들" 객체? 하나인데 왜 복수형?

 

🗂️ 올바른 명명 규칙

여러 레퍼런스를 찾아보고, 실무 코드를 분석한 결과 다음과 같은 규칙을 정리했습니다.

1. 단수형을 사용하는 경우

"하나의 객체"를 표현할 때는 단수형을 사용합니다.

// 변수명 (객체 하나)
Post post = new Post();

// 클래스명
public class Post { }

// Entity
@Entity
public class Post { }

// DTO
public class PostRequest { }
public class PostResponse { }

// Service
public class PostService { }

// Repository
public interface PostRepository extends JpaRepository<Post, Long> { }

// Controller
public class PostController { }

🤷‍♂️ 이유:

  • 클래스는 객체의 설계도입니다. 하나의 게시글을 나타내는 설계도이므로 단수형이 자연스럽습니다.
  • Post post = new Post();는 "게시글 객체 하나를 생성한다"는 의미로 명확합니다.

2. 복수형을 사용하는 경우

"여러 개의 객체"를 담는 컬렉션에는 복수형을 사용합니다.

// 리스트 변수 (여러 개)
List<Post> posts = postRepository.findAll();

// 배열
Post[] posts = new Post[10];

// Map의 value가 여러 개일 때
Map<Long, List<Post>> userPosts = new HashMap<>();

🤷‍♂️ 이유:

  • List<Post> posts는 "여러 게시글들을 담는 리스트"라는 의미가 명확합니다.
  • 변수명만 봐도 단수인지 복수인지 구분이 됩니다.

3.  데이터베이스 테이블명 🗂️

테이블명은 복수형을 사용합니다.

@Entity
@Table(name = "posts")  // 테이블은 복수형
public class Post {      // Entity는 단수형
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    private String content;
}
CREATE TABLE posts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

🤷‍♂️ 이유:

  • 테이블은 여러 레코드(행)의 집합입니다.
  • posts 테이블에는 여러 개의 게시글이 저장되므로 복수형이 자연스럽습니다.
  • 데이터베이스 명명 관례상 테이블명은 복수형을 사용하는 것이 일반적입니다.

4. REST API URL

REST API URL은 복수형을 사용합니다.

 

@RestController
@RequestMapping("/posts")  // 복수형
public class PostController {
    
    @GetMapping("/posts")              // GET /posts (목록 조회)
    public List<PostResponse> getPosts() { }
    
    @GetMapping("/posts/{id}")         // GET /posts/1 (단일 조회)
    public PostResponse getPost(@PathVariable Long id) { }
    
    @PostMapping("/posts")             // POST /posts (생성)
    public PostResponse createPost(@RequestBody PostRequest.Create request) { }
    
    @PutMapping("/posts/{id}")         // PUT /posts/1 (수정)
    public PostResponse updatePost(
            @PathVariable Long id,
            @RequestBody PostRequest.Update request) { }
    
    @DeleteMapping("/posts/{id}")      // DELETE /posts/1 (삭제)
    public void deletePost(@PathVariable Long id) { }
}

 

🤷‍♂️ 이유:

  • REST API에서 URL은 리소스의 컬렉션을 나타냅니다.
  • /posts는 "게시글들의 집합"을 의미하고, /posts/1은 "그 중 1번 게시글"을 의미합니다.
  • RESTful API 설계 원칙에서 권장하는 표준 규칙입니다.

😶 핵심 원칙

  1. 클래스는 단수 - 객체 하나의 설계도이기 때문
  2. 컬렉션 변수는 복수 - 여러 객체를 담기 때문
  3. 테이블은 복수 - 여러 레코드의 집합이기 때문
  4. URL은 복수 - RESTful 설계 원칙

이 원칙만 기억하면 명명 규칙에 대한 혼란을 크게 줄일 수 있습니다.

 

🦉 마치며

저처럼 영어를 잘 못해도 괜찮습니다. 중요한 것은 일관성 있는 규칙을 따르는 것입니다.

 

이 글에서 정리한 규칙은 Spring Boot 커뮤니티에서 널리 사용되는 표준 관례입니다. 이를 따르면 다른 개발자와 협업할 때도

코드를 쉽게 이해하고 유지보수할 수 있습니다.

 

🦉 Remember!

  • 하나면 단수 (Post post)
  • 여러 개면 복수 (List<Post> posts)
  • 클래스는 단수, 테이블과 URL은 복수!