본문 바로가기
IT

[Spring Boot] Spring Boot 핵심 개념 10가지

by 유나니나노 2025. 2. 24.
반응형

Spring Boot 핵심 개념 (10가지)

  1. Spring Boot 자동 설정 (Auto Configuration)
  2. DI(의존성 주입)와 IoC 컨테이너
  3. Spring Boot Starter
  4. Spring Boot 주요 어노테이션
  5. Spring MVC (Controller, Service, Repository)
  6. Spring Boot JPA & MyBatis (데이터 접근)
  7. Spring Boot AOP (관점 지향 프로그래밍)
  8. Spring Security & JWT (인증 및 인가)
  9. Spring Boot Actuator (모니터링 및 관리)
  10. Spring Boot 배포 및 운영 (프로파일, 로그, 설정)

1. Spring Boot 자동 설정 (Auto Configuration)

Spring Boot는 자동 설정 기능을 제공해서 설정을 최소화하고 바로 실행할 수 있도록 도와줌

 

  • 자동 설정?
    • 기본적으로 Spring 은 XML 설정 파일을 사용하거나 Java Config 클래스를 작성해야 하지만, Spring Boot는 @SpringBootApplication을 사용하면 자동으로 필요한 빈(Bean)들을 등록해 줌
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • 내부적으로 @EnableAutoConfiguration을 포함하고 있어서 Spring Boot가 자동 설정을 수행
  • Spring-boot-starter-web을 추가하면 자동으로 Tomcat과 DispatcherServlet이 설정됨
  • 관련 어노테이션
    • @EnableAutoConfiguration: 자동 설정 활성화
    • @ComponentScan: 지정된 패키지를 스캔하여 빈 자동 등록
    • @SpringBootApplication: 위 두 가지를 포함한 어노테이션

2. DI(의존성 주입)와 IoC 컨테이너

  • IoC(Inversion of Control, 제어의 역전)는 객체 생성과 생명 주기를 Spring이 관리하도록 하는 개념
  • DI(Dependency Injection, 의존성 주입)는 객체를 직접 생성하지 않고 필요한 객체를 주입받는 방식

 

  • DI를 사용하지 않는 경우
public class Car {
    private Engine engine = new Engine();  // 직접 객체 생성
}
  • DI를 적용한 경우
@Component
public class Engine { }

@Component
public class Car {
    private final Engine engine;
    
    @Autowired
    public Car(Engine engine) {  // 생성자를 통한 의존성 주입
        this.engine = engine;
    }
}
  • @Component와 @Autowired를 이용해 Spring이 관리하도록 변경
  • Car는 Engine을 직접 생성하지 않고 Spring이 주입
  • 장점: 유지보수성이 좋아지고, Mock을 활용한 테스트가 가능해짐

3. Spring Boot Starter

Starter는 특정 기능을 쉽게 추가할 수 있도록 도와주는 패키지 묶음

예를 들어, Spring Boot에서 웹 개발을 하려면 spring-boot-starter-web을 추가하면 됨

 

Starter 예제

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • spring-boot-starter-web: Tomcat, Spring MVC 자동 설정
  • spring-boot-starter-data-jpa: Hibernate, JPA 자동 설정
  • spring-boot-starter-security: Spring Security 기본 설정

Starter를 활용하면 필요한 라이브러리를 쉽게 추가하고 설정을 최소화할 수 있음

 


4. Spring Boot 주요 어노테이션

어노테이션 설명
@RestController REST API 컨트롤러 선언
@Service 비즈니스 로직을 처리하는 클래스 선언
@Repository 데이터 접근 계층(DAO) 클래스 선언
@Component 스프링 빈으로 등록
@Autowired 의존성 주입
@Transactional 트랜잭션 처리
@Configuration 설정 클래스 선언

 


5. Spring MVC (Controller, Service, Repository)

  • MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴
  • 애플리케이션의 각 영역을 Model, View, Controller로 구분하여 각 역할에 맞게 코드를 작성하는 개발 방식
  • UI영역과 도메인(비즈니스 로직) 영역으로 구분되어 서로에게 영향을 주지 않으면서 개발과 유지보수가 가능
  • Model은 애플리케이션의 정보(데이터)를 나타내고, View는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소, Controller는 데이터와 비즈니스 로직 사이의 상호동작을 관리

3계층 구조

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;
    
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}
@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUserById(Long id) {
        return userRepository.findById(id).orElseThrow();
    }
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> { }
  • Controller -> Service -> Repository 순으로 동작
  • Service에서 비즈니스 로직을 처리하고, Repository에서 데이터베이스와 연결

6. Spring Boot JPA & MyBatis (데이터 접근)

JPA 예제

@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> { }
  • 장점: SQL을 직접 작성하지 않고 객체 지향적으로 데이터 접근 가능
  • 단점: 복잡한 쿼리는 성능 문제가 발생할 수 있음

MyBatis 예제

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(Long id);
}
  • 장점: 복잡한 SQL을 직접 작성 가능
  • 단점: JPA보다 코드량이 많아질 수 있음

7. Spring Boot AOP (관점 지향 프로그래밍)

AOP는 공통 기능(로깅, 트랜잭션 관리 등)을 분리해서 코드 중복을 줄여주는 개념

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("메서드 실행: " + joinPoint.getSignature());
    }
}
  • 공통 로직(로그 기록)을 분리해서 관리할 수 있음

8. Spring Security & JWT (인증 및 인가)

  • Spring Security를 사용하면 인증 및 권한 관리를 쉽게 구현할 수 있음
  • JWT(JSON Web Token)를 사용하면 토큰 기반 인증이 가능
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
        )
        .formLogin();
    return http.build();
}
  • 기본적으로 인증/인가 처리를 자동으로 해줌

9. Spring Boot Actuator (모니터링 및 관리)

  • Actuator는 애플리케이션 상태를 모니터링하고 관리할 수 있도록 도와주는 기능
  • /actuator 엔드포인트를 통해 애플리케이션의 상태를 확인 가능

Actuator 설정 및 사용

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

management:
  endpoints:
    web:
      exposure:
        include: health, info, metrics

 

주요 엔드포인트

엔드포인트 설명
/actuator/health 애플리케이션 상태 확인(정상, 다운 등)
/actuator/info 애플리케이션 정보 제공
/actuator/metrics CPU, 메모리 사용량, GC 상태 등 확인
/actuator/loggers 로그 레벨 변경 가능
/actuator/env 환경 변수 확인
  • 운영 환경에서 애플리케이션 상태를 확인하고, 필요하면 경고 알람을 설정할 수 있음
  • Prometheus, Grafana와 연동해서 모니터링 대시보드를 만들 수도 있음

10. Spring Boot 배포 및 운영(프로파일, 로그, 설정 관리)

배포 및 운영을 위해 중요한 개념들에는 환경별 설정, 로깅, 배포 방법이 포함됨

 

1) Spring Boot 프로파일(Profiles)

프로파일을 사용하면 개발, 테스트, 운영 환경에 따라 설정을 다르게 적용 가능

  • application.yaml
spring:
  profiles:
    active: dev  # 기본 프로파일(dev) 설정
  • application-dev.yaml
server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db
    username: dev_user
    password: dev_password
  • application-prod.yaml
server:
  port: 9090

spring:
  datasource:
    url: jdbc:mysql://prod-db:3306/prod_db
    username: prod_user
    password: prod_password
  • 배포할 때 -Dspring.profiles.active=prod 옵션을 주면 운영 환경으로 실행됨

2) Spring Boot 로깅(Logging)

  • Spring Boot는 기본적으로 SLF4J + Logback을 사용해 로그를 관리
  • 로그 설정 파일(logback-spring.xml)을 사용해서 로그 형식과 레벨 조정 가능
  • 기본 로그 설정(application.yaml)
logging:
  level:
    root: INFO
    com.example: DEBUG
  file:
    name: logs/app.log
  • 코드에서 로그 남기기
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    public void doSomething() {
        logger.info("INFO 로그 메시지");
        logger.debug("DEBUG 로그 메시지");
        logger.error("ERROR 로그 메시지");
    }
}
  • 운영 환경에서는 보통 INFO 레벨 이상을 사용하고, 디버깅이 필요할 때 DEBUG로 변경

3) Spring Boot 배포 방법

  • JAR 파일 실행(독립 실행형 배포)
    • 장점: 간단하고 빠르게 실행 가능
    • 단점: 서버 관리가 필요
mvn package
java -jar target/myapp.jar
  • Docker를 사용한 배포
    • 장점: 환경에 구애받지 않고 어디서나 실행 가능
    • 단점: Docker 설정 및 이미지 관리 필요
FROM openjdk:17
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
  • Kubernetes를 사용한 배포
    • 장점: 자동 스케일링, 롤링 업데이트 가능
    • 단점: Kubernetes 환경을 구축해야 함
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:latest
          ports:
            - containerPort: 8080

 


최종 정리

개념 설명
1. 자동 설정 @SpringBootApplication으로 자동 설정
2. DI & IoC 객체 생성 및 생명주기를 Spring이 관리(의존성 주입)
3. Starter 필요한 기능을 쉽게 추가(spring-boot-starter-web)
4. 주요 어노테이션 @RestController, @Service, @Repository
5. Spring MVC Controller -> Service -> Repository 계층 구조
6. JPA & MyBatis 데이터베이스 접근(JPA: 객체 중심, MyBatis:SQL 기반)
7. AOP 공통 기능을 분리(@Aspect)
8. Security & JWT 인증 & 인가 (Spring Security, JWT)
9. Actuator 애플리케이션 모니터링 (/actuator/helath)
10.배포 및 운영 프로파일 관리, 로깅, Docker/Kubernetes 배포

 

반응형