[면접] Spring -1

반응형

오랜만에 면접 공부를 진행하자.
이 내용은 스파르타에서 진행했던 내용들을 토대로 정리한 내용이다.

1. @Component, @Service, @Repository, @Controller 차이

이 네 가지는 모두 스프링 컨테이너에 빈으로 등록되도록 도와주는 컴포넌트 스캔의 대상 어노테이션입니다.
하지만 역할 구분과 내부 동작이 다릅니다.

어노테이션설명
@Component 가장 일반적인 컴포넌트 등록용 어노테이션
@Service 비즈니스 로직을 담는 클래스에 사용. AOP 적용 시 의미 있는 대상
@Repository DAO 계층에 사용. 스프링이 JDBC 예외를 DataAccessException으로 변환
@Controller 웹 요청을 처리하는 컨트롤러 클래스에 사용
기존에 생각했을때 확인 목적으로 사용이 된다고 생각헀었다. 그렇게 알고 있었는데 아니었다. 그러니까 역할 구분만 한다고 생각헀다.
여기에는 생각보다 기술적인 내용들이 많이 내포가 되는 느낌이다.
 
여기서 더 생각할 수 있는 부분은 Spring의 동작 방식에 대해 생각을 할 수 있을거다.
요런식으로 그릴 수 있을 거 같다.
생각해보면 Controller에서 ResponseEntity같은걸 쓰는 이유가 단순하게 생각했을때 다른곳(Service,Repository)에서 사용하는것을 본적이 없었는데 왜그리 생각했을까?

 

 

✅ 역할 구분 외에도, 각 어노테이션은 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, 비동기 알림 등에 유용하게 활용됩니다.

마지막 질문이다. 

댓글

Designed by JB FACTORY