이상적인 자바 스프링(Spring) 프로젝트 구조

 이상적인 자바 스프링(Spring) 프로젝트의 코딩 스타일 가이드는 읽기 쉽고 유지보수가 용이한 코드를 작성하도록 돕는 원칙과 규칙을 포함합니다. 아래는 자바 스프링 프로젝트에서 권장되는 코딩 스타일 가이드입니다.


1. 코드 포맷팅

  1. 들여쓰기: 4칸 스페이스를 사용합니다. (탭 대신 스페이스 권장)
  2. 라인 길이: 한 줄에 120자를 넘지 않도록 제한합니다.
  3. 중괄호 스타일: 항상 열고 닫는 중괄호를 사용합니다.
    if (condition) { // do something }
  4. 빈 줄 사용: 적절한 위치에 빈 줄을 추가해 가독성을 높입니다. 예: 메서드 사이, import와 클래스 선언 사이.

2. 네이밍 규칙

  1. 패키지명: 모두 소문자, 점(.)으로 구분.
    com.example.project.controller
  2. 클래스명: 파스칼 케이스(PascalCase), 명사를 사용.
    public class UserService {}
  3. 메서드명: 카멜 케이스(camelCase), 동사 또는 동사구를 사용.
    public void saveUser() {}
  4. 상수명: 모두 대문자, 단어 사이에 밑줄(_).
    public static final int MAX_USERS = 100;
  5. 변수명: 카멜 케이스(camelCase), 간결하고 의미 있는 이름.
    String userName;

3. 주석 작성

  1. 클래스 및 메서드 주석: Javadoc 스타일 사용.
    /** * 유저 데이터를 저장하는 메서드입니다. * * @param user 저장할 유저 객체 * @return 저장된 유저 객체 */ public User saveUser(User user) { // implementation }
  2. 필요한 곳에만 주석: 명확한 코드에는 불필요한 주석을 피하고, 복잡한 로직에는 설명을 추가합니다.

4. 프로젝트 구조

  1. 레이어 분리: 다음과 같이 각 레이어를 분리합니다.
    • Controller: HTTP 요청/응답 처리.
    • Service: 비즈니스 로직.
    • Repository: 데이터베이스 처리.
    • Domain/Model: 엔티티 및 데이터 모델 정의.
  2. 패키지 구조 예시:
    com.example.project ├── controller ├── service ├── repository ├── domain ├── dto └── config

5. Spring 어노테이션 사용

  1. 필수 어노테이션만 사용: 불필요한 어노테이션은 피합니다.
    • @RestController 대신 @Controller와 @ResponseBody 조합 사용 지양.
    • @Transactional은 필요한 메서드에만 사용.
  2. 의존성 주입: 필드 주입 대신 생성자 주입 권장.
    @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }

6. 예외 처리

  1. Custom Exception: 비즈니스 로직에 맞는 커스텀 예외를 정의.
    public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); } }
  2. Global Exception Handler: @ControllerAdvice를 활용해 전역 예외 처리.
    @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage()); } }

7. 테스트

  1. JUnit5: 최신 테스트 프레임워크를 활용.
  2. 테스트 클래스 네이밍{테스트 대상 클래스명}Test.
    public class UserServiceTest {}
  3. 테스트 메서드 네이밍: 메서드 동작을 설명하는 이름 사용.
    @Test void shouldSaveUserSuccessfully() { // 테스트 코드 }

8. 기타 권장 사항

  1. Lombok 사용: @Getter, @Setter, @Builder, @AllArgsConstructor 등 활용.
  2. DTO와 엔티티 분리: API 요청/응답에는 DTO(Data Transfer Object)를 사용하고, 엔티티는 비즈니스 로직에서만 사용.
  3. 스프링 설정 파일:
    • application.yml 또는 application.properties로 환경 변수 관리.
    • 설정값은 의미 있는 키를 사용.
      yaml

      server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: password

댓글 쓰기

다음 이전