반응형
Spring Boot 핵심 개념 (10가지)
- Spring Boot 자동 설정 (Auto Configuration)
- DI(의존성 주입)와 IoC 컨테이너
- Spring Boot Starter
- Spring Boot 주요 어노테이션
- Spring MVC (Controller, Service, Repository)
- Spring Boot JPA & MyBatis (데이터 접근)
- Spring Boot AOP (관점 지향 프로그래밍)
- Spring Security & JWT (인증 및 인가)
- Spring Boot Actuator (모니터링 및 관리)
- 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 배포 |
반응형
'IT' 카테고리의 다른 글
[DB 트랜잭션] @Transactional 속성(전파 방식 Propagation) (0) | 2025.02.27 |
---|---|
[DB] 데이터베이스 기본 개념 (0) | 2025.02.25 |
[Auth] Spring Security AuthenticationException 처리 (1) | 2025.01.20 |
[정렬(Sort)] List, Array, Map 정렬 코드(Java) (0) | 2025.01.13 |
[Test] Mock을 활용한 테스트 코드 작성(Java) (0) | 2024.12.03 |