안녕하세요. 새내기 개발자입니다. 공부하면서 정리하는 글로 틀린 부분은 언제나 댓글로 환영입니다!
Spring 프레임워크는 자바 백엔드 개발에서 가장 많이 사용되는 프레임워크 중 하나로, 기술 면접에서도 자주 출제됩니다. 이번 글에서는 스프링 기본 개념, Spring Boot, Spring MVC, Spring Security, Spring Data JPA, 트랜잭션 관리 등 주요 기술 면접 질문과 답변을 정리해보겠습니다.
1. Spring 프레임워크란?
✅ 답변:
Spring은 자바 기반의 엔터프라이즈 애플리케이션을 개발하기 위한 경량 프레임워크입니다. **의존성 주입(Dependency Injection, DI)**과 제어의 역전(Inversion of Control, IoC) 개념을 기반으로 애플리케이션을 구성하며, 주요 모듈은 다음과 같습니다.
- Spring Core: DI 및 IoC 기능 제공
- Spring MVC: 웹 애플리케이션 개발 지원
- Spring Boot: 설정을 최소화한 독립 실행형 애플리케이션 개발 가능
- Spring Security: 인증 및 인가 처리 제공
- Spring Data JPA: 데이터 액세스 계층 간소화
2. IoC (Inversion of Control)와 DI (Dependency Injection)의 차이점은?
✅ 답변:
- IoC (제어의 역전): 객체의 생성 및 생명 주기를 개발자가 직접 관리하지 않고, **컨테이너(Spring IoC Container)**가 관리하는 방식입니다.
- DI (의존성 주입): 객체 간의 의존성을 외부에서 주입해주는 방식으로, IoC의 구체적인 구현 방법 중 하나입니다.
예제 코드 (DI 사용)
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired // DI 적용
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
3. Spring Bean이란? Bean의 생명 주기는?
✅ 답변:
Spring 컨테이너에서 관리되는 객체를 Spring Bean이라고 합니다. 스프링 빈의 생명 주기는 다음과 같습니다.
- 객체 생성: 빈 인스턴스가 생성됨 (@Component, @Service, @Repository 등 사용)
- 의존성 주입: @Autowired를 통해 필요한 의존성 주입
- 초기화: @PostConstruct 또는 InitializingBean.afterPropertiesSet() 메서드 실행
- 사용
- 소멸: @PreDestroy 또는 DisposableBean.destroy() 실행 후 삭제
예제 코드 (Bean 생명주기)
@Component
public class ExampleBean {
@PostConstruct
public void init() {
System.out.println("Bean이 초기화됩니다.");
}
@PreDestroy
public void destroy() {
System.out.println("Bean이 소멸됩니다.");
}
}
4. Spring Boot와 Spring의 차이점은?
✅ 답변:
Spring FrameworkSpring Boot
설정이 많음 | 자동 설정(Auto Configuration) 지원 |
web.xml 필요 | 내장 웹 서버(Tomcat 등) 제공 |
수동으로 Dependency 관리 | spring-boot-starter-*로 간편한 의존성 관리 |
애플리케이션 실행을 위해 WAR 배포 필요 | JAR 파일 하나로 실행 가능 (java -jar app.jar) |
5. Spring MVC의 주요 동작 과정
✅ 답변:
Spring MVC는 요청을 처리하는 구조를 Front Controller 패턴을 기반으로 동작합니다.
- 클라이언트 요청 -> DispatcherServlet 수신
- HandlerMapping을 통해 해당 요청을 처리할 컨트롤러 결정
- 컨트롤러(@Controller)에서 요청 처리 후 ModelAndView 반환
- ViewResolver가 알맞은 뷰 찾음
- 최종적으로 HTML, JSON 등의 응답을 클라이언트에 반환
6. Spring AOP란?
✅ 답변:
Spring AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 핵심 비즈니스 로직과 부가적인 관심사(로깅, 트랜잭션, 보안)를 분리하는 기법입니다.
AOP 주요 용어
- Advice: 실행될 부가 기능 (ex: @Before, @After, @Around)
- Join Point: Advice가 적용될 수 있는 지점 (ex: 메서드 실행)
- Pointcut: 특정 Join Point를 선택하는 표현식
- Aspect: 여러 Advice와 Pointcut을 모아둔 객체
예제 코드 (AOP 적용)
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("메서드 실행: " + joinPoint.getSignature().getName());
}
}
7. Spring Security의 인증(Authentication)과 인가(Authorization)의 차이점
✅ 답변:
- 인증(Authentication): 사용자의 신원을 확인하는 과정 (로그인, JWT, OAuth)
- 인가(Authorization): 인증된 사용자가 특정 리소스에 접근할 수 있는지 권한을 부여하는 과정 (RBAC, ACL)
예제 코드 (Spring Security 설정)
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
}
8. Spring 트랜잭션 관리 (@Transactional)
✅ 답변:
Spring에서 데이터베이스 트랜잭션을 관리하기 위해 @Transactional을 사용합니다.
트랜잭션 전파(Propagation) 옵션
- REQUIRED: 기본값, 기존 트랜잭션이 있으면 참여, 없으면 새로 생성
- REQUIRES_NEW: 항상 새로운 트랜잭션 생성
- MANDATORY: 기존 트랜잭션이 없으면 예외 발생
- NESTED: 중첩 트랜잭션 사용
예제 코드 (트랜잭션 적용)
@Service
public class OrderService {
@Transactional
public void placeOrder(Long userId, Long productId) {
// 주문 생성
// 재고 차감
}
}
9. Spring Data JPA에서 N+1 문제란?
✅ 답변:
JPA에서 연관된 엔티티를 조회할 때 발생하는 불필요한 추가 쿼리 문제를 N+1 문제라고 합니다.
해결 방법
- Fetch Join 사용 (@Query 활용)
- EntityGraph 사용
- Batch Size 설정
예제 코드 (Fetch Join 사용)
@Query("SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :id")
User findUserWithOrders(@Param("id") Long id);
10. RESTful API 설계 원칙과 Spring에서의 구현
✅ 답변:
RESTful API의 주요 원칙은 자원(Resource), HTTP 메서드, 상태 코드 활용입니다.
HTTP 메서드용도
GET | 데이터 조회 |
POST | 데이터 생성 |
PUT | 전체 데이터 수정 |
PATCH | 부분 데이터 수정 |
DELETE | 데이터 삭제 |
Spring REST API 예제
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
}
이 외에도 Spring Cloud, Redis, Kafka 연동 등의 기술도 면접에서 자주 등장합니다. 면접을 대비해서 다같이 화이팅합시다!
'백엔드' 카테고리의 다른 글
[DB] 관계형(RDB) vs 비관계형(NoSQL) 데이터베이스 비교 (1) | 2025.02.10 |
---|---|
[자바/JAVA] Null Pointer Exception (NPE) (1) | 2025.02.08 |
[자바/JAVA] 자바 스프링 AOP(Aspect-Oriented Programming) 이해하기 (0) | 2025.02.08 |
[자바/JAVA] JPA N+1 문제란? (1) | 2025.02.05 |
[자바/JAVA] JPA(Java Persistence API) 개념 정리🚀 (2) | 2025.02.02 |