반응형

스프링 표준 코딩 작성 방법

  1. 적절한 패키징 스타일
    • 적절한 패키징은 코드와 애플리케이션의 흐름을 쉽게 이해하는 데 도움이 됩니다.
    • 의미 있는 패키징으로 애플리케이션을 구조화할 수 있습니다.
    • 컨트롤러를 별도의 패키지에, 서비스를 별도의 패키지에, 유틸 클래스를 별도의 패키지에 포함시킬 수 있습니다... 등. 이 스타일은 소규모 마이크로서비스에서 매우 편리합니다.
    • 거대한 코드 베이스에서 작업하는 경우, 기능 기반 접근 방식을 사용할 수 있습니다. 요구사항에 따라 결정할 수 있습니다.
  2. 디자인 패턴 사용
    • 어디에 사용할지는 파악해야합니다.
  3. 스프링 부트 스타터 사용
    • 단일 종속성을 하나하나 추가하지 않고 매우 쉽게 스타터 종속성을 사용할 수 있습니다. 이러한 스타터 종속성은 이미 필요한 종속성과 함께 번들로 제공됩니다. 예를 들어, spring-boot-starter-web 종속성을 추가하면 기본적으로 jackson, spring-core, spring-mvc 및 spring-boot-starter-tomcat 종속성이 번들로 제공됩니다. 따라서 우리는 별도로 종속성을 추가할 필요가 없습니다. 또한 버전 불일치를 피하는 데 도움이 됩니다.
  4. 적절한 라이브러리 버전 사용
    • 언제나 최신 안정적인 GA(General Availability) 버전을 사용하는 것이 권장됩니다. 때때로 이는 Java 버전, 서버 버전, 애플리케이션의 유형 등에 따라 달라질 수 있습니다. 동일한 패키지의 다른 버전을 사용하지 않고 여러 종속성이 있는 경우 항상 <properties>를 사용하여 버전을 지정하십시오.
  5. Lombok 사용
    • Lombok은 자바 라이브러리로, 해당 어노테이션을 사용하여 코드를 줄이고 깔끔한 코드를 작성할 수 있도록 도와줍니다. 예를 들어, 엔티티, 요청/응답 객체, DTO 등과 같은 몇 가지 클래스에서는 getter와 setter를 위해 많은 줄을 작성해야 하는데 Lombok을 사용시 한 줄로 처리될 수 있습니다. 필요에 따라 @Data, @Getter 또는 @Setter를 사용할 수 있습니다. 또한 롬복 로거 어노테이션을 사용할 수도 있습니다. @Slf4j를 권장합니다.
  6. Lombok을 이용한 생성자 주입
    • 의존성 주입(Dependency Injection)에서 생성자 주입을 강력히 권장하는데, Lombok의 @RequiredArgsConstructor 어노테이션을 사용하여 생성자 주입을 할 수 있습니다.
    • import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequiredArgsConstructor public class SampleController { private final SampleService sampleService; @GetMapping("/hello") public String sayHello() { return sampleService.getGreeting(); } }
  7. slf4j logging를 사용
    • System.out.print()를 사용하지 마세요.
    • Spring Boot의 기본 로깅 프레임워크인 logback과 함께 사용하기 위해 Slf4j를 권장합니다. 항상 slf4j {}를 사용하고, 로거 메시지에 문자열 보간법(String interpolation)을 사용하지 않도록 해야 합니다. 왜냐하면 문자열 보간법은 더 많은 메모리를 사용하기 때문입니다. Lombok의 @Slf4j 어노테이션을 사용하면 로거를 매우 쉽게 생성할 수 있습니다.
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.stereotype.Service;
      
      @Service
      @Slf4j
      public class SampleService {
          public void performTask() {
              log.debug("Debug message");
              log.info("Info message");
              log.warn("Warning message");
              log.error("Error message");
          }
      }
      
    • ** String interpolation: ${변수명}처럼 변수명을 사용하여 문자를 출력하는 것을 말합니다.
    • 마이크로서비스 환경에서는 ELK 스택을 사용할 수 있습니다.
  8. 컨트롤러는 라우팅으로만 사용
    • 컨트롤러는 상태를 가지지 않으며 싱글톤입니다.
    • 비즈니스 로직은 컨트롤러에 위치해서는 안 됩니다.
  9. 서비스에서 비즈니스 로직 구현
    • 서비스는 싱글톤입니다.
    • 비즈니스 로직은 여기에 포함되며, 유효성 검사, 캐싱 등이 이루어집니다.
    • 서비스는 영속성 계층과 통신하고 결과를 받아옵니다.
  10. NullPointerException 피하기
    • java.util 패키지의 Optional, Apache Commons StringUtils을 사용하여 NullPointerException을 피할 수 있습니다.
    • toString() 대신 valueOf()를 사용하세요.
    • IDE 기반의 @NotNull 및 @Nullable 어노테이션을 사용하세요.
  11. 컬렉션 프레임워크에 대한 모범 사례
    • 데이터 세트에 적합한 컬렉션을 사용하세요.
    • Java 8의 기능을 활용하여 forEach를 사용하고, 레거시 for 루프는 피하세요.
    • 구현 대신 인터페이스 유형을 사용하세요.
    • 가독성을 위해 size() 대신 isEmpty()를 사용하세요.
    • null 값을 반환하지 마세요. 대신 빈 컬렉션을 반환할 수 있습니다.
    • 해시 기반 컬렉션에 저장될 데이터로 객체를 사용하는 경우, equals()와 hashCode() 메서드를 오버라이드해야 합니다.
  12. pagination 사용
    • pagination을 사용하면 애플리케이션의 성능이 향상됩니다.
    • Spring Data JPA를 사용하는 경우, PagingAndSortingRepository를 사용하면 페이지네이션을 매우 쉽게 사용할 수 있고 노력도 적게 듭니다.
  13. 캐싱 사용
    • Spring Boot는 기본적으로 ConcurrentHashMap을 사용하여 캐싱을 제공하며, @EnableCaching 어노테이션을 통해 이를 구현할 수 있습니다.
    • 기본 캐싱에 만족하지 못하는 경우 Redis, Hazelcast 또는 기타 분산 캐싱 구현체를 사용할 수 있습니다. Redis와 Hazelcast는 메모리 내 캐싱 방법입니다. 또한 데이터베이스 캐시 구현체를 사용할 수도 있습니다.
  14. 전역 예외 처리를 위해 사용자 정의 예외 처리기를 전역 예외 처리와 같이 사용
    • 일반적인 예외 외에도 특정한 오류 상황을 식별해야 할 수 있습니다. @ControllerAdvice를 사용하여 예외 어드바이저를 만들고 의미 있는 세부 정보를 갖는 별도의 예외를 생성할 수 있습니다.
    • import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 예외 처리 로직 작성 // 클라이언트에게 적절한 응답을 반환하거나 로깅 등을 수행할 수 있습니다. // 예시로 500 Internal Server Error를 반환합니다. return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } }
  15. 사용자 정의 응답 객체 사용
    • 사용자 정의 응답 객체를 사용하면 HTTP 상태 코드, API 코드, 메시지 등과 같은 특정 데이터를 가진 객체를 반환할 수 있습니다.
    • 빌더 디자인 패턴을 사용하여 사용자 정의 속성이 있는 응답 객체를 생성할 수 있습니다.
  16. 불필요한 코드, 변수, 메서드 및 클래스 제거
    • 사용되지 않는 변수 선언은 일부 메모리를 차지합니다. 사용되지 않는 메서드, 클래스 등을 제거하세요.
    • 중첩된 반복문을 피하려고 노력하세요. 대신 맵을 사용할 수 있습니다.
  17. 주석 사용
    • 주석은 남용하지 않는 한 좋은 관행입니다. 모든 것에 주석을 달지 마세요. 대신 클래스, 함수, 메서드, 변수 등에 의미 있는 단어를 사용하여 설명적인 코드를 작성할 수 있습니다.
    • 주석을 사용하여 경고 및 처음 보는 사람에게 이해하기 어려운 내용을 설명할 수 있습니다.
  18. 클래스, 메서드, 함수, 변수 및 기타 속성에 의미 있는 단어 사용
    • 적절하고 의미 있는 이름 규칙을 사용하고 적절한 케이스를 사용하세요.
    • 일반적으로 클래스, 변수 및 상수를 선언할 때는 명사 또는 짧은 구문을 사용합니다. 예: String firstName, const isValid
    • 함수와 메서드에는 동사와 형용사와 함께 짧은 구문을 사용할 수 있습니다. 예: readFile(), sendData()
    • 변수 이름을 약어로 사용하거나 의도를 드러내는 이름을 사용하는 것을 피하세요. 예: int i; String getExUsr;
  19. 선언에 적절한 케이스 사용
    • 다양한 케이스(UPPERCASE, lowercase, camelCase, PascalCase, snake_case, SCREAMING_SNAKE_CASE, kebab-case 등)가 있습니다. 각 변수에 어떤 케이스를 사용해야 할지를 파악해야 합니다.methods & variables — camelCaseDB-related fields — snake_case
    • constants — SCREAMING_SNAKE_CASE
    • classes — PascalCase
  20. 단순
    • 항상 간단하고 가독성이 좋은 코드를 작성하려 노력하세요. 동일한 간단한 논리를 다른 방식으로 구현할 수 있지만, 가독성이나 이해하기 어렵다면 어려울 수 있습니다. 때로는 복잡한 논리가 더 많은 메모리를 사용합니다. 코드를 작성할 때 KISS, DRY 및 SOLID 원칙을 사용하려 노력하세요. 이에 대해 나중에 기사로 설명하도록 하겠습니다.
  21. 공통적인 코드 포맷 스타일 사용
    • 코딩 스타일은 개발자마다 다양할 수 있습니다. 코딩 스타일 변경은 변경 사항으로 간주되며, 코드 병합을 어렵게 만들 수 있습니다. 이를 피하기 위해 팀은 공통된 코딩 포맷을 가질 수 있습니다.
  22. SonarLint 사용
    • SonarLint는 코드 품질과 유지 관리성을 개선하는 데 도움이 되는 강력한 코드 분석 도구입니다. 이 도구는 업계 모범 사례와 코딩 표준을 기반으로 실시간 피드백과 제안을 제공합니다. SonarLint를 개발 환경에 통합하면 버그, 취약점, 코드 품질 문제 등을 사전에 식별하고 해결할 수 있습니다.

 

 

Reference

반응형

'SpringBoot' 카테고리의 다른 글

[error]Spring-docs + WebSecurityConfig  (0) 2023.06.11
[error]Sequence "MEMBER_SEQ" not found; SQL statement:  (0) 2023.06.04
반응형

반응형

Spring-docs + WebSecurityConfig

Spring-docs를 사용할려고 추가하고 나서 실행해보니 Failed to load remote configuration.이 발생했습니다.

 

해결

WebSecurityConfig에 WebSecurityCustomizer에서 설정을 해주면 됩니다.

@Bean
public WebSecurityCustomizer ignoringCustomizer() {
	return (web) -> web.ignoring().antMatchers("/swagger-ui/**", "/v3/api-docs/**");
}
반응형

'SpringBoot' 카테고리의 다른 글

스프링 표준 코딩 작성 방법  (0) 2023.07.05
[error]Sequence "MEMBER_SEQ" not found; SQL statement:  (0) 2023.06.04
반응형
반응형

Sequence "MEMBER_SEQ" not found; SQL statement:

 

문제

새로 생성한 함수가 잘 작동하는지 확인하기 위해 @Test를 실행해 봤는데  Sequence "MEMBER_SEQ" not found; SQL statement:

에러가 발생했습니다.

 

원인

명확한 이유는 잘모르겠습니다. vscode를 껏다가 다시 켜서 같은 환경에서 실행했던니 에러 없이 잘 진행되는걸로 보아 설정해둔 것이 실행되지 않아 발생했던거 같습니다.

 

원인 이유로 예상되는거는 아래와 같습니다.

1. Member entity 설정 에러

 

해결

vscode를 껏다가 다시 켠 후 entity를 확인해봅니다.

 

반응형

'SpringBoot' 카테고리의 다른 글

스프링 표준 코딩 작성 방법  (0) 2023.07.05
[error]Spring-docs + WebSecurityConfig  (0) 2023.06.11

+ Recent posts