백엔드

[자바/JAVA] 스프링 기술 면접 질문 및 답변 정리

Newbie Developer 2025. 2. 1. 18:53

안녕하세요. 새내기 개발자입니다. 공부하면서 정리하는 글로 틀린 부분은 언제나 댓글로 환영입니다!

 

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이라고 합니다. 스프링 빈의 생명 주기는 다음과 같습니다.

  1. 객체 생성: 빈 인스턴스가 생성됨 (@Component, @Service, @Repository 등 사용)
  2. 의존성 주입: @Autowired를 통해 필요한 의존성 주입
  3. 초기화: @PostConstruct 또는 InitializingBean.afterPropertiesSet() 메서드 실행
  4. 사용
  5. 소멸: @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 패턴을 기반으로 동작합니다.

  1. 클라이언트 요청 -> DispatcherServlet 수신
  2. HandlerMapping을 통해 해당 요청을 처리할 컨트롤러 결정
  3. 컨트롤러(@Controller)에서 요청 처리 후 ModelAndView 반환
  4. ViewResolver가 알맞은 뷰 찾음
  5. 최종적으로 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 문제라고 합니다.

해결 방법

  1. Fetch Join 사용 (@Query 활용)
  2. EntityGraph 사용
  3. 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 연동 등의 기술도 면접에서 자주 등장합니다. 면접을 대비해서 다같이 화이팅합시다!