1.3.8 Spring 최적화와 모범 사례

개선된 Spring 애플리케이션 성능과 뛰어난 코드 품질 유지는 개발 과정에 깊이 통합되어야 합니다. 여기에는 몇 가지 실용적인 예시를 포함하여 상세히 설명합니다.

애플리케이션 성능 최적화

데이터베이스 접근 최적화 예시

N+1 쿼리 문제 해결: Spring Data JPA에서 @EntityGraph를 사용하여 연관된 엔티티를 미리 로드함으로써 N+1 문제를 해결할 수 있습니다.

@EntityGraph(attributePaths = {"author", "publisher"})
List<Book> findAll();

이 코드는 Book 엔티티를 조회할 때 authorpublisher를 조인하여 한 번의 쿼리로 가져옵니다.

HTTP 요청 최적화 예시

HTTP 캐싱 활용: Spring MVC에서는 WebContentInterceptor를 사용하여 정적 리소스에 대한 HTTP 캐싱 헤더를 설정할 수 있습니다.

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        WebContentInterceptor webContentInterceptor = new WebContentInterceptor();
        webContentInterceptor.setCacheSeconds(31556926); // 1년
        registry.addInterceptor(webContentInterceptor);
    }
}

이 설정은 브라우저가 정적 리소스를 캐시하도록 하여, 불필요한 네트워크 요청을 줄입니다.

코드 품질과 유지 관리

단위 테스트 예시

Repository 단위 테스트: Spring Boot에서는 @DataJpaTest를 사용하여 Repository의 단위 테스트를 손쉽게 작성할 수 있습니다.

@DataJpaTest
public class UserRepositoryTest {
    
    @Autowired
    private UserRepository userRepository;
    
    @Test
    public void testFindByUsername() {
        User user = new User("username", "password");
        userRepository.save(user);
        
        Optional<User> found = userRepository.findByUsername("username");
        assertTrue(found.isPresent());
        assertEquals("username", found.get().getUsername());
    }
}

이 예시는 UserRepositoryfindByUsername 메소드가 예상대로 동작하는지 검증합니다.

지속적 통합(CI) 예시

GitHub Actions를 사용한 CI 설정: GitHub Actions를 활용하여 Maven 기반 Spring Boot 애플리케이션의 빌드 및 테스트를 자동화할 수 있습니다.

name: Java CI

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
    - name: Build with Maven
      run: mvn clean install

이 YAML 파일은 GitHub 리포지토리에 푸시될 때마다 자바 11을 사용하여 Maven 빌드를 실행합니다.

성능 최적화와 코드 품질 관리는 Spring 애플리케이션의 성공적인 개발 및 유지 보수를 위해 중요합니다. 위의 예시들은 이러한 측면을 개선하는 구체적인 방법을 보여줍니다.

source: DevOps/1.Programming_Languages_&_Frameworks/1.3.Spring/1.3.8.md