[면접] Spring -1
- 면접/spring
- 2025. 5. 13. 00:06
오랜만에 면접 공부를 진행하자.
이 내용은 스파르타에서 진행했던 내용들을 토대로 정리한 내용이다.
1. @Component, @Service, @Repository, @Controller 차이
이 네 가지는 모두 스프링 컨테이너에 빈으로 등록되도록 도와주는 컴포넌트 스캔의 대상 어노테이션입니다.
하지만 역할 구분과 내부 동작이 다릅니다.
@Component | 가장 일반적인 컴포넌트 등록용 어노테이션 |
@Service | 비즈니스 로직을 담는 클래스에 사용. AOP 적용 시 의미 있는 대상 |
@Repository | DAO 계층에 사용. 스프링이 JDBC 예외를 DataAccessException으로 변환 |
@Controller | 웹 요청을 처리하는 컨트롤러 클래스에 사용 |
여기에는 생각보다 기술적인 내용들이 많이 내포가 되는 느낌이다.

✅ 역할 구분 외에도, 각 어노테이션은 AOP, 예외 변환, 요청 처리 등 내부 기능에도 영향을 줍니다.
2. 프록시 구현 방식: JDK vs CGLIB
스프링은 AOP 기능을 프록시 패턴으로 구현합니다. 대표적인 두 가지 방식이 있습니다.
- JDK 동적 프록시
- 인터페이스 기반
- 자바 표준 라이브러리에서 제공
- CGLIB 프록시
- 구현체(클래스) 기반
- 바이트코드를 조작해 상속 방식으로 프록시 생성
🔍 대상 클래스가 인터페이스를 구현하고 있으면 JDK 프록시가 사용되며, 없으면 CGLIB이 사용됩니다.
3. @Transactional(readOnly = true)는 쓰기 쿼리를 막을까?
막지 않습니다.
이 설정은 데이터베이스에 읽기 전용 트랜잭션 힌트를 제공하고, 하이버네이트는 이를 통해 더티 체킹을 생략하는 최적화를 합니다.
⚠️ 단, 실제로 insert/update 쿼리를 호출하면 실행은 됩니다. 하지만 이 설정의 목적은 성능 최적화와 의도 명시입니다.
4. 스프링 빈 스코프 종류와 특징
스프링은 여러 가지 빈 스코프를 제공합니다. 각 스코프는 빈의 생성/관리를 어떤 시점에 할지를 결정합니다.
singleton | 컨테이너당 1개 인스턴스 (기본값) |
prototype | 요청할 때마다 새 인스턴스 생성 |
request | HTTP 요청마다 인스턴스 생성 |
session | HTTP 세션마다 인스턴스 생성 |
application | 서블릿 컨텍스트당 1개 인스턴스 생성 |
🧠 웹 환경에서는 request, session, application을 많이 사용합니다.
5. @Conditional 어노테이션
@Conditional은 특정 조건에 따라 빈을 등록할지 말지 결정할 수 있는 어노테이션입니다.
- Condition 인터페이스를 구현한 클래스가 조건을 판단
- 예: 특정 클래스가 클래스패스에 존재할 때만 빈 등록
@Conditional(MyCondition.class) @Bean public MyService myService() { return new MyServiceImpl(); }
✅ 스프링 부트의 자동 설정(AutoConfiguration) 에서 많이 사용됩니다.
찾아보니 자동주입을 하기 위해 Conditional을 사용한다. 뭐랄까 직접 사용은 하지는 않아서 뭔지 모르는 경우가 대다수일거 같다.
그래서 이거에 대해 잘 모르는 경우가 많다고는 생각한다. 하지만 알면 스프링 부트에서 어떠한 문제가 발생했을때 쉽게 해결할 수 있을 거 같다.
대표적인 예는 다음과 같다.
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
public class DataSourceAutoConfiguration {
// ...
}
6. 스프링 이벤트와 옵저버 패턴
스프링은 내부적으로 옵저버 패턴을 기반으로 이벤트를 처리합니다.
- 이벤트 발행: ApplicationEventPublisher.publishEvent()
- 이벤트 리스너: @EventListener 사용
✅ 하나의 이벤트가 여러 리스너로 전달될 수 있으며, 동기/비동기 모두 지원합니다.
이는 도메인 이벤트 설계, decoupling, 비동기 알림 등에 유용하게 활용됩니다.
마지막 질문이다.