[Spring] Java 프레임워크로 Spring을 사용하는 이유

Kim Hyen Su·2024년 6월 12일
0

Spring

목록 보기
9/13
post-thumbnail

🌿 Spring


개요

자바 개발자를 위한 온라인 리소스 및 교육 플랫폼 중 "Baeldung" 내에서 제공하는 Spring 관련 Tutorial에 대해 학습해보는 시간을 갖겠습니다.

해당 내용은 전적으로 Baeldung에 기재된 내용을 바탕으로 서술되어 있으며, 관련 내용 중 필자가 부족한 개념은 추가로 포스팅할 예정입니다.

📜 참고 포스팅

이번 포스팅에서는 가장 인기 있는 Java 프레임워크 중 하나인 Spring을 사용하는 이유들에 대해서 살펴보겠습니다.

기존에는 당연하게 사용해왔던 Spring 프레임워크를 "왜 사용할까" 라는 관점에서 한번 접근해보겠습니다.

Framework를 사용하는 이유

굳이 Framework를 사용하지 않더라도 개발은 가능하지만, 사용함으로써 얻는 이점이 상대적으로 크기 때문에 사용하게 됩니다.

Framework를 사용하면 좋은 이점은 다음과 같습니다.

  • 핵심 작업에 집중하여 개발이 가능합니다.
  • 현재까지 쌓아온 다양한 디자인 패턴을 통해 내부적으로 구현되어 있어 효율적입니다.
  • 업계 및 규제 관련 표준을 준수하는데 도움이 됩니다.
  • 애플리케이션 소유 비용을 절감합니다.

몇 가지 단점으로는 다음과 같습니다.

  • 특정 방식으로 애플리케이션을 작성하도록 강요합니다.
  • 특정 버전의 언어 및 라이브러리에 바인딩 됩니다.(버전이 다르면 오류 발생)

Spring 생태계 관련 개요

Spring은 Java Enterprise Edition이 빠르게 발전하였습니다.

Spring은 처음 Java용 IOC 컨테이너로 시작되었습니다. 현재까지도 Spring을 프로젝트의 핵심을 구성하는데 주로 사용합니다.

Spring Framework

Spring Framework는 모듈 단위로 나누어져 있어 모든 애플리케이션에서 사용할 기능을 쉽게 선택하고 사용할 수 있습니다.

  • Core : DI, AOP와 같은 핵심 기능을 제공합니다.
  • Data Access : JTA, JPA, JDBC를 통한 저장소 접근 지원합니다.
  • Web : Servlet API(Spring MVC)와 최근 Reactive API(Spring WebFlux)를 모두 지원하며 추가적으로 WebScokets, STOMP, WebClient를 지원합니다.
  • Integration : MS(Java Message Service), JMX(Java Management Extension), RMI(Remote Method Invocation)을 통해 Enterprise Java와의 통합을 지원합니다.
  • Test : 모의 객체, 테스트 설비, 컨텍스트 관리 및 캐싱을 통해 단위 및 통합 테스트에 대한 폭넓은 지원을 해줍니다.

Spring Project

Spring이 강력한 것은 수 년에 걸쳐 Spring을 중심으로 성장하고 활발하게 발전하는 강력한 생태계 덕분입니다. 생태계는 Spring Project로 구성되어 있으며, 이는 Spring Framework를 기반으로 개발됩니다.

  • Boot : Spring을 기반으로 다양한 프로젝트를 생성할 수 있도록 독창적이고 확장 가능한 템플릿 세트를 제공합니다. Tomcat이나 유사 컨테이너가 내장된 독립형 Spring 애플리케이션 생성을 쉽게 제공합니다.
  • Cloud : Service Discovery, CircuitBreaker, API Gateway와 같은 일반적인 분산 시스템 패턴 중에서 일부를 쉽게 개발할 수 있도록 지원을 제공합니다. 이는 로컬, 원격 또는 관리형 플랫폼에 이러한 보일러플레이트 패턴을 배포하려는 노력을 줄이는데 도움이 됩니다.
  • Security : Spring 기반의 프로젝트에서 사용자 정의 방식으로 인증/인가 개발을 하기위한 강력한 메커니즘을 제공합니다. 최소한의 선언적 지원을 통해 세션 고정, 클릭 재킹, CSRF와 같은 공격들로 부터 보호할 수 있도록 해줍니다.
  • Mobile : 장치를 감지하고 이에 따라 애플리케이션 동작을 조정하는 기능을 제공합니다. 또한 최적의 사용자 경험을 위한 장치 인식 보기 관리, 사이트 기본 설정 관리 및 사이트 전환기를 지원합니다.
  • Batch : 데이터 보관과 같은 엔터프라이즈 시스템용 배치 애플리케이션을 개발하기 위한 경량 프레임워크를 제공합니다. 예약, 다시 시작, 건너뛰기, 지표 수집 및 로깅을 직관적으로 지원합니다. 또한 최적화 및 파티셔닝을 통해 대용량 작업에 대한 확장을 지원합니다.

Spring in Action

스프링을 활용하여 hello-wrold 라는 프로젝트를 생성해보겠습니다.

  • 기본적인 CRUD 동작
  • RESTful APIS
  • in-memory DB 연동
  • 기본적인 인증 처리
  • 단위 테스트

위 과정을 통해서 프로젝트를 생성하고 테스트까지 완성해보겠습니다.

1. Project Set-up

기본적으로 Spring 프로젝트 생성 시, Spring Initializr 를 활용하여 생성해줍니다. Spring Initilaizr는 여러 종속성을 가지고 새로운 Spring 프로젝트를 생성하기 위한 간편 온라인 도구 입니다.

우선, 기본적으로 Spring Web, Spring data JPA, H2, Spring Security를 추가하여 프로젝트를 생성해줍니다.

2. 도메인 모델과 영속성

간단한 JPA 엔티티로 Employee 라는 클래스를 정의하겠습니다.

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private String firstName;
    @NotNull
    private String lastName;
    // Standard constructor, getters and setters
}

그 다음으로 JPA 레포지토리를 정의합니다.

public interface EmployeeRepository extends CrudRepository<Employee, Long> {
    List<Employee> findAll();
}

3. Controller

웹 애플리케이션으로 들어오는 요청을 라우팅하고 처리하기 위해서 Controller를 정의해줍니다.

@RestController
public class EmployeeController {

    @Autowired
    private EmployeeRepository repository;

    @GetMapping("/employees")
    public List<Employee> getAll() {
        return repository.findAll();
    }
}

위처럼 개발자가 하는 일은 클래스에 어노테이션을 추가해주고 각 핸들러 메서드와 함께 라우팅 메타 정보를 정의하는 것뿐입니다.

4. Security

웹 애플리케이션을 동작하기 위한 코드들을 정의했습니다. 그 다음으로 직원 생성과 삭제 및 인증 과정을 처리하기 위해서는 Spring Security 프로젝트를 활용하면 쉽게 구현이 가능합니다.

@EnableWebSecurity
public class WebSecurityConfig {
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                .requestMatchers(new AntPathRequestMatcher("/employees", "GET")).permitAll()
                .anyRequest().authenticated()
        ).httpBasic(basic->basic.realmName("My Realm")
                .authenticationEntryPoint((request, response, authException) -> {
                    System.out.println("인증 실패");
                })
        );
        return http.build();
}

위처럼 정의하면, "employees" 경로로 GET 작업을 요청한 경우에만 인증 없이 허용 가능하도록 하는 선언적 방식의 코드입니다.

5. Test

모든 작업을 수행했습니다. 이를 테스트 하기 위해서는 Spring에서 제공하는 REST controller에 대한 단위 테스트를 진행하면 됩니다.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class EmployeeControllerTests {
    @Autowired
    private MockMvc mvc;
    @Test
    @WithMockUser()
    public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception {
        mvc.perform(get("/employees").content(
                                new ObjectMapper().writeValueAsString(new Employee("First", "Last")))
                        .contentType(MediaType.APPLICATION_JSON)
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status()
                        .isOk());
//                .andExpect((ResultMatcher) jsonPath("$.firstName", is("First")))
//                .andExpect((ResultMatcher) jsonPath("$.lastName", is("Last")));
    }
    // other tests as necessary
}

Spring에서는 위처럼 간단한 단위 또는 통합 테스트 작성 시 필요한 인프라(JUnit)를 기본적으로 제공합니다.

마지막으로, Spring 애플리케이션의 실행을 보면, Spring Boot에서는 Tomcat 서버가 내장되어 있습니다. 이는 Bootstrap의 일부이며, 미리 생성된 클래스와 임베디드 서버를 사용하여 애플리케이션을 시작하는데 필요한 모든 세부 정보를 포함합니다.

Spring을 선택해야 하는 이유

유용성

Spring은 다양한 구성 옵션과 규칙을 통해 개발자가 필요한 것을 정확하게 구성하기가 쉽습니다. 또한, 복잡한 Spring 프로젝트의 생성을 간단하게 만들었습니다.

모듈성

Spring은 필요에 따라서 선택적으로 하나 이상의 Spring 프로젝트로 구성할 수 있습니다.

적합성

Spring은 Jakarta EE에서 제공하는 모든 기술을 지원하며 필요한 경우에 표준 사양에 대한 지원을 향상 시켜줍니다.

테스트 가능성

Spring은 핵심 기능의 테스트 관련 모듈을 지원하며, 단위 테스트를 상대적으로 간단하게 수행할 수 있습니다. 복잡한 MVC 시나리오를 위해 Mock 객체를 지원합니다.

커뮤니티 지원

오랜 역사를 통해서 일반적인 문제에 대한 기본 솔루션을 제공해주며, 대규모 조직 및 개인 개발자 간의 커뮤니티가 활성화 되어 있습니다.

결론

위와 같은 이유에서 Spring 프레임워크를 사용하는 것이 Java 웹 애플리케이션 개발 시 유용하다는 것을 알 수 있습니다.

profile
백엔드 서버 엔지니어

0개의 댓글