스프링 부트 백엔드 개발 강좌, 스프링과 스프링 부트

서론

현대 웹 애플리케이션의 발전과 더불어, 백엔드 개발의 중요성은 날로 커지고 있습니다.
자바 기반의 스프링 프레임워크는 많은 개발자들에게 널리 사용되는 백엔드 기술 중 하나입니다.
특히 스프링 부트(Spring Boot)는 효율적인 개발을 가능하게 해주는 도구로 부각되고 있습니다.
이번 강좌에서는 스프링 프레임워크의 기본 개념과 스프링 부트의 특징 및 장점에 대해 깊이 있게 살펴보겠습니다.

스프링 프레임워크 개요

스프링 프레임워크는 자바 플랫폼을 위한 애플리케이션 프레임워크로,
엔터프라이즈 급 애플리케이션 개발을 편리하게 도와주는 여러 기능을 제공합니다.
스프링은 크게 다음과 같은 모듈로 구성되어 있습니다.

  • 스프링 코어: 스프링의 기본 기능을 제공하며, IoC(제어의 역전)와 DI(의존성 주입) 기능을 포함합니다.
  • 스프링 MVC: 웹 애플리케이션 개발을 위한 MVC 아키텍처를 지원합니다.
  • 스프링 데이터: 다양한 데이터베이스와의 통합을 지원합니다.
  • 스프링 시큐리티: 애플리케이션 보안을 위한 강력한 인증 및 권한 부여 기능을 제공합니다.

스프링과 스프링 부트의 차이점

스프링 프레임워크는 전통적으로 애플리케이션 구성과 관리에 유연성을 제공해왔습니다.
그러나 이로 인해 복잡한 설정과 초기화 과정이 필요하게 되었습니다.
반면, 스프링 부트는 이러한 문제를 해결하기 위해 개발된 도구입니다.
다음은 두 프레임워크 간의 주요 차이점입니다.

  1. 설정 방식: 스프링 부트는 ‘관 convention over configuration(관례가 설정을 대신하는 원칙)’을 규칙으로 하여, 최소한의 설정으로 애플리케이션을 시작할 수 있습니다.
  2. 내장 서버: 스프링 부트는 톰캣(Tomcat), 제티(Jetty)와 같은 내장 웹 서버를 지원하여, 별도로 서버를 설정할 필요 없이 애플리케이션을 실행할 수 있습니다.
  3. 스타터 의존성: 스프링 부트는 다양한 의존성을 쉽게 관리할 수 있도록 ‘스타터’라는 모듈을 제공합니다. 이를 통해 개발자는 필요한 기능을 쉽게 추가할 수 있습니다.
  4. 액추에이터: 스프링 부트는 애플리케이션의 상태를 모니터링하고, 관리하기 위한 여러 기능을 제공하는 액추에이터 모듈을 포함하고 있습니다.

스프링 부트 설치 및 설정

스프링 부트를 사용해 백엔드 개발을 시작하려면 먼저 개발 환경을 설정해야 합니다.
다음 단계에 따라 스프링 부트를 설치하고, 간단한 프로젝트를 생성해보겠습니다.

1. 개발 환경 준비

스프링 부트를 사용하기 위해 필요한 도구는 다음과 같습니다.

  • Java Development Kit (JDK): 자바 8 이상이 필요합니다.
  • IDE: IntelliJ IDEA, Eclipse 등 자바 개발이 가능한 통합 개발 환경(IDE)을 선택합니다.
  • Maven/Gradle: 의존성 관리를 위해 Maven 또는 Gradle을 선택합니다.

2. 스프링 부트 프로젝트 생성

스프링 부트 프로젝트는 다양한 방법으로 생성할 수 있지만,
가장 간단한 방법은 Spring Initializr를 사용하는 것입니다.
웹사이트에 접속해 필요한 설정을 입력하면 자동으로 초기 프로젝트 구조를 생성할 수 있습니다.

  • Spring Initializr 웹사이트
  • 프로젝트 메타 정보 입력: Group, Artifact, Name, Description, Package name 등을 설정합니다.
  • 필요한 의존성 추가: Spring Web, Spring Data JPA, H2 Database 등을 선택하여 추가합니다.
  • 생성된 프로젝트 다운로드 후 IDE에서 열기.

스프링 부트 애플리케이션 구조

생성된 스프링 부트 프로젝트는 다음과 같은 구조를 가집니다.

        └── src
            └── main
                ├── java
                │   └── com
                │       └── example
                │           └── demo
                │               ├── DemoApplication.java
                │               └── controller
                │                   └── HelloController.java
                └── resources
                    ├── application.properties
                    └── static
    

첫 번째 웹 애플리케이션 만들기

간단한 RESTful 웹 서비스를 만들어 보겠습니다.
먼저, 컨트롤러를 생성하여 HTTP 요청을 처리해보겠습니다.

1. HelloController 클래스 생성

HelloController 클래스는 웹 요청을 처리하는 가장 기본적인 클래스이며,
다음과 같이 작성할 수 있습니다.

        package com.example.demo.controller;

        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RestController;

        @RestController
        public class HelloController {
            @GetMapping("/hello")
            public String hello() {
                return "Hello, Spring Boot!";
            }
        }
    

2. 애플리케이션 실행

IDE에서 DemoApplication 클래스를 실행하면, 내장 서버가 시작되고,
http://localhost:8080/hello에 접속했을 때
“Hello, Spring Boot!”라는 메시지를 확인할 수 있습니다.

데이터베이스 연동

스프링 부트는 다양한 데이터베이스와의 연동을 지원합니다.
이번 섹션에서는 H2 데이터베이스를 이용한 간단한 CRUD 애플리케이션을 구축해보겠습니다.

1. 의존성 추가

pom.xml 파일에 H2 데이터베이스와 JPA 관련 의존성을 추가합니다.

        
            
            
                org.springframework.boot
                spring-boot-starter-data-jpa
            
            
            
                com.h2database
                h2
                runtime
            
        
    

2. 데이터베이스 설정

간단한 설정을 application.properties 파일에 추가합니다.

        spring.h2.console.enabled=true
        spring.datasource.url=jdbc:h2:mem:testdb
        spring.datasource.driverClassName=org.h2.Driver
        spring.datasource.username=sa
        spring.datasource.password=
    

3. 엔티티 클래스 생성

데이터베이스에 저장할 엔티티 클래스를 만들어 보겠습니다.
사용자 정보를 저장할 User 클래스를 생성합니다.

        package com.example.demo.entity;

        import javax.persistence.Entity;
        import javax.persistence.GeneratedValue;
        import javax.persistence.GenerationType;
        import javax.persistence.Id;

        @Entity
        public class User {
            @Id
            @GeneratedValue(strategy = GenerationType.AUTO)
            private Long id;
            private String name;
            private String email;

            // Getters and Setters
        }
    

4. 레포지토리 인터페이스 생성

데이터베이스와 상호작용을 위한 레포지토리 인터페이스를 생성합니다.

        package com.example.demo.repository;

        import com.example.demo.entity.User;
        import org.springframework.data.jpa.repository.JpaRepository;

        public interface UserRepository extends JpaRepository {
        }
    

5. 컨트롤러 업데이트

CRUD 작업을 처리하는 API 엔드포인트를 추가하기 위해
UserController를 생성하고, 요청 매핑을 추가합니다.

        package com.example.demo.controller;

        import com.example.demo.entity.User;
        import com.example.demo.repository.UserRepository;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.web.bind.annotation.*;

        import java.util.List;

        @RestController
        @RequestMapping("/users")
        public class UserController {
            @Autowired
            private UserRepository userRepository;

            @GetMapping
            public List getAllUsers() {
                return userRepository.findAll();
            }

            @PostMapping
            public User createUser(@RequestBody User user) {
                return userRepository.save(user);
            }
        }
    

6. 애플리케이션 실행 및 테스트

애플리케이션을 다시 실행하고, Postman과 같은 도구를 사용하여
GET /usersPOST /users 엔드포인트를 테스트합니다.

스프링 시큐리티로 보안 설정하기

백엔드 애플리케이션은 보안이 매우 중요합니다.
스프링 시큐리티를 통해 액세스 제어 및 인증을 추가해 보겠습니다.

1. 의존성 추가

pom.xml 파일에 스프링 시큐리티 의존성을 추가합니다.

        
            org.springframework.boot
            spring-boot-starter-security
        
    

2. 시큐리티 설정 클래스 생성

스프링 시큐리티를 사용하기 위한 설정 클래스를 생성합니다.

        package com.example.demo.config;

        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.security.config.annotation.web.builders.HttpSecurity;
        import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
        import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

        @Configuration
        @EnableWebSecurity
        public class SecurityConfig extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http
                    .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .httpBasic();
            }
        }
    

3. 테스트 및 확인

다시 애플리케이션을 실행하고 API 테스트는 HTTP Basic 인증을 통해 연결해볼 수 있습니다.

결론

이번 강좌에서는 스프링 프레임워크의 기초부터 스프링 부트를 이용한
백엔드 애플리케이션 개발 과정을 다루어 보았습니다.
스프링 부트의 접근성이 높아지면서 더 많은 개발자들이
쉽게 백엔드 애플리케이션을 개발할 수 있게 되었습니다.
앞으로도 다양한 기능을 추가하거나 필요한 도구들을 통합하여
더욱 견고한 애플리케이션을 만들어보시기를 권장합니다.

참고 자료