TIL (Today I Learned)
Spring Boot 면접 대비 개념 정리❕
기만나🐸
2025. 6. 19. 17:30
1. Spring Boot
Spring Boot의 등장 이유
- 기존 Spring은 설정 XML 또는 Java Config 작성량이 많아 진입 장벽이 높았음
- Spring Boot는 "관례에 의한 설정"(Convention over Configuration)을 도입하여
설정 자동화와 생산성 향상을 목표로 등장
Spring Boot의 자동 구성
- Spring Boot는 `@SpringBootApplication` 애노테이션을 통해 자동 설정(AutoConfiguration)을 활성화
- `@SpringBootConfiguration`, `@EnableAutoConfiguration`, `@ComponentScan`이 합쳐진 복합 애노테이션
- 스프링 부트는 명시적인 설정을 줄이고 관례에 따른 자동 구성으로 개발 생산성을 높인다.
Starter의 개념과 장점
- 의존성 묶음 제공:
spring-boot-starter-data-jpa
,spring-boot-starter-security
등 - 어떤 기능을 쓰고 싶은지만 정하면 세부 라이브러리를 일일이 설정할 필요 없음
내장 톰캣
- Tomcat 웹 서버를 프로젝트 내부에 포함하고 있어서, 별도로 서버(WAS)를 설치하지 않아도 바로 실행 가능
java -jar
로 실행 가능한 구조 제공- 장점
- 서버 환경 설정이 간단해짐
- 로컬에서 바로 실행 가능 -> 테스트와 개발에 유리
- 별로 인프라 없이도 컨테이너(Docker) 배포에 유리
2. 의존성 주입(DI) 핵심 개념
의존성 주입
- 내가 직접 객체를 만들지 않고, 스프링이 대신 만들어서 넣어주는 것
IoC 컨테이너란?
- IoC (Inversion of Control)
- 객체 생성과 생명주기 관리를 개발자가 아닌 컨테이너(Spring)가 책임지는 구조
@Component, @Service, @Repository
- 스프링이 자동으로 객체를 만들어서 IoC 컨테이너에 등록해 줄 수 있도록 하는 애노테이션들
- `@Component`: 모든 스프링 빈의 기본형
- `@Service`: 비즈니스 로직 계층 표현용 (역할 구분)
- `@Repository`: DB 접근 계층에 사용, 예외 변환(AOP) 자동 적용
@Autowired / 생성자 주입
- `@Autowired`는 생성자, 필드, 세터 등 여러 방식에 쓸 수 있음
- 생성자 주입이 가장 안정적이고 테스트나 불변성 유지에 유리
- Lombok의 `@RequiredArgsConstructor`를 쓰면 생성자 자동 주입
- 필드 주입은 테스트나 확장성에 불리 -> 지양
3. @Controller vs @RestController
항목 | @Controller | @RestController |
반환 대상 | 뷰(View) | 데이터(JSON) |
주요 용도 | 웹 페이지(HTML) 렌더링 | REST API 응답 처리 |
내부 동작 | return값 → ViewResolver가 뷰 이름으로 해석 | `@ResponseBody`가 적용되어 객체를 JSON으로 변환 |
@ResponseBody | `@ResponseBody`를 별도로 붙여야 JSON 응답 가능 | 자동으로 `@ResponseBody` 포함됨 |
4. AOP 개념과 적용 예시
핵심 개념
- AOP (Aspect-Oriented Programming) = 관점 지향 프로그래밍
- 공통 기능(로깅, 보안, 트랜잭션 등)을 핵심 비즈니스 로직과 분리해서 깔끔하게 관리하는 방법
구성요소
용어 | 설명 | 예시 |
Aspect | 공통 기능을 모아둔 클래스 | 로깅 모듈 |
Advice | 실제로 실행될 공통 로직 코드 | @Before, @After, @Around 등 |
Join Point | Advice를 적용할 수 있는 지점 (보통 메서드 실행 시점) |
서비스 메서드 실행 |
Pointcut | 어떤 Join Point에 Advice를 적용할지 조건을 지정 | `com.example.service.*.*(..)` |
Weaving | Advice를 실제 코드에 끼워넣는 작업 | 런타임 시 프록시 생성 |
적용 예
- 로깅, 트랜잭션 감시, 실행 시간 측정, 인증 체크 등
5. 트랜잭션 관리
@Transactional
- 메서드 단위 또는 클래스 단위 트랜잭션 적용
- Spring AOP 기반으로 프록시가 메서드 호출 감싸서 트랜잭션 처리
- [프록시] → 트랜잭션 시작 → 실제 메서드 실행 → 커밋 or 롤백
- 프록시 외부에서 내부 메서드를 호출할 경우 트랜잭션이 적용되지 않을 수 있음
6. 스프링에서 비동기 처리
@Async
- 비동기 메서드 실행을 위해 @EnableAsync 필요
- 별도 쓰레드풀에서 비동기 실행
Executor 설정
- ThreadPoolTaskExecutor Bean 등록을 통해 동시성 및 큐 용량 조절 가능