
자바나 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 설계 원칙에서 권장하는 표준 규칙입니다.
😶 핵심 원칙
- 클래스는 단수 - 객체 하나의 설계도이기 때문
- 컬렉션 변수는 복수 - 여러 객체를 담기 때문
- 테이블은 복수 - 여러 레코드의 집합이기 때문
- URL은 복수 - RESTful 설계 원칙
이 원칙만 기억하면 명명 규칙에 대한 혼란을 크게 줄일 수 있습니다.
🦉 마치며
저처럼 영어를 잘 못해도 괜찮습니다. 중요한 것은 일관성 있는 규칙을 따르는 것입니다.
이 글에서 정리한 규칙은 Spring Boot 커뮤니티에서 널리 사용되는 표준 관례입니다. 이를 따르면 다른 개발자와 협업할 때도
코드를 쉽게 이해하고 유지보수할 수 있습니다.
🦉 Remember!
- 하나면 단수 (Post post)
- 여러 개면 복수 (List<Post> posts)
- 클래스는 단수, 테이블과 URL은 복수!
'BackEnd > Spring' 카테고리의 다른 글
| 썸네일 이미지 생성 및 업로드 Thumbnailator (0) | 2025.11.18 |
|---|---|
| [ ERROR ] 🔥🔥 cannot find symbol 🔥🔥 (0) | 2025.10.30 |