🚌 2024년 11월 25일~ 2024년 12월 1일까지의 주제는 스프링이다.
💡 공통으로 준비한 질문
1️⃣ 첫번째 접은 글은 내 말로 풀어쓴 정답
2️⃣ 두번째 접은 글은 해석 또는 공부한 내용 또는 추가적으로 궁금한 내용
1. IoC(Inversion of Control, 제어의 역전)이 무엇인지 설명해주세요.
더보기
- IOC란?
- 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미합니다. 또는 제어 권한을 자신이 아닌 다른 대상에게 위임하는 것입니다.
- 대부분의 프레임워크에서 사용하는 방법으로, 개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 개발하고 실행합니다.
- 이렇게 조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라 프레임워크 내부에서 결정된 대로 이뤄지게 됩니다.
- Spring에서의 IOC
- Spring 프레임워크에서 지원하는 IOC Container는 우리들이 흔히 개발하고 사용해왔던 일반 POJO의 생명 주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공합니다.
- 라이브러리와 프레임워크의 차이
- IOC의 개념이 적용되었나의 차이이며, 라이브러리는 애플리케이션 코드가 흐름을 직접 제어하지만, 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용됩니다.
2. DI(Dependency Injection, 의존관계 주입)가 무엇인지 설명해주세요.
더보기
- DI(Dependency Injection)란?
- Spring 프레임워크에서 지원하는 IOC의 형태이다.
- 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것을 말한다. 개발자들은 제어를 담당할 필요없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다.
- 컨테이너가 실행 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해주는 것
- 의존성
- 현재 객체가 다른 객체와 상호작용(참조)하고 있다면 다른 객체들을 현재 객체의 의존이라 한다.
- 의존성이 위험한 이유
- 하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경되어야 한다.
- 테스트 가능한 어플을 만들 때 의존성이 있으면 유닛 테스트 작성이 어렵다.
- 유닛테스트의 목적 자체가 다른 모듈로부터 독립적으로 테스트하는 것을 요구한다.
- 특징
- 'new'를 사용해 모듈 내에서 다른 모듈을 초기화하지 않으려면 객체 생성은 다른 곳에서 하고, 생성된 객체를 참조하면 된다.
- 의존성 주입은 Inversion of Control 개념을 바탕으로 한다. 클래스가 외부로부터 의존성을 가져야 한다.
- 필요한 이유
- 클래스를 재사용할 가능성을 높이고, 다른 클래스와 독립적으로 클래스를 테스트를 할 수 있다.
- 비즈니스 로직의 특정 구현이 아닌 클래스를 생성하는데 매우 효과적
- 세 가지 방법
- Contructor Injection : 생성자 삽입
- Method(Setter) Injection : 메소드 매개 변수 삽입
- Field Injection : 멤버 변수 삽입
3. Bean 객체와 Bean 생명주기에 대해 설명해주세요.
더보기
- Bean이란?
- Bean 생명 주기
- Bean 초기화 방법 3가지
- 빈 초기화 메소드에 @PostConstruct 사용
- 빈 정의 xml에 <context:annotation-config></context:annotation-config> 추가
- InitializingBean 인터페이스의 afterPropertiesSet() 메소드 오버라이드
- 커스텀 init() 메소드 정의
- 빈 정의 xml에 init-method 속성으로 메소드 이름 지정
- 또는 빈 초기화 메소드에 @Bean(init-method="init") 지정
- 빈 초기화 메소드에 @PostConstruct 사용
- Bean 소멸 방법 3가지
- 빈 소멸 메소드에 @PreDestroy 사용
- 빈 정의 xml에 <context:annotation-config></context:annotation-config> 추가
- DisposableBean 인터페이스의 destroy() 메소드 오버라이드
- 커스텀 destroy() 메소드 정의
- 빈 정의 xml에 destroy-method 속성으로 메소드 이름 지정
- 빈 소멸 메소드에 @PreDestroy 사용
- 권장하는 방법
- 1번 방법 (권장)
- 사용 방법이 간결하며 코드에서 초기화 메소드가 존재함을 쉽게 파악 가능하여 xml 설정 방법보다 직관적
- 2번 방법 (지양)
- 빈 코드에 스프링 인터페이스가 노출되어 권장하지 않으며 간결하지 않은 방법
- 3번 방법
- 빈 코드에 스프링 인터페이스는 노출되지 않지만, 코드만으로 초기화 메소드 호출 여부를 알 수 없는 단점
- 1번 방법 (권장)
- Bean Scope
- singleton (default)
- 애플리케이션에서 Bean 등록 시 singleton scope로 등록
- Spring IoC 컨테이너 당 한 개의 인스턴스만 생성
- 컨테이너가 Bean 가져다 주입할 때 항상 같은 객체 사용
- 메모리나 성능 최적화에 유리
- prototype
- 컨테이너에서 Bean 가져다 쓸 때 항상 다른 인스턴스 사용
- 모든 요청에서 새로운 객체 생성
- gc에 의해 Bean 제거
- request
- Bean 등록 시 하나의 HTTP request 생명주기 안에 단 하나의 Bean만 존재
- 각각의 HTTP 요청은 고유 Bean 객체 보유
- Spring MVC Web Application에서 사용
- session
- 하나의 HTTP Session 생명주기 안에 단 하나의 Bean만 존재
- Spring MVC Web Application에서 사용
- global session
- 하나의 global HTTP Session 생명주기 안에 한 개의 Bean 지정
- Spring MVC Web Application에서 사용
- application
- ServletContext 생명주기 안에 한 개의 Bean 지정
- Spring MVC Web Application에서 사용
- singleton (default)
4. AOP에 대해 설명해주세요.
더보기
- AOP(Aspect Oriented Programming)이란?
- 관점 지향 프로그래밍이란 뜻이며, 어떤 로직을 기준으로 핵심 관점과 부가 관점을 나누고, 관점을 기준으로 모듈화하는 것이다.
- 핵심 관점은 주로 핵심 비즈니스 로직이며, 부가 관점은 핵심 로직을 실행하기 위한 데이터베이스 연결, 로깅, 파일 입출력 등을 뜻한다.
- 목적은?
- 소스코드에서 여러 번 반복해서 쓰는 코드(Concer, 흩어진 관심사)를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용한다.
- 개발자가 핵심 로직에 집중할 수 있게 하기 위함이다.
- 주로 부가 기능을 모듈화한다.
- AOP 주요 용어
- Aspect
- 흩어진 관심사를 모듈화 한 것
- Advice + PointCut
- Target
- Aspect를 적용하는 곳(클래스, 메소드 등)
- Advice
- 실질적으로 수행해야 하는 기능을 담은 구현체
- JoinPoint
- Advice가 적용될 위치
- 끼어들 수 있는 지점
- ex. 메소드 진입 시, 생성자 호출 시, 필드에서 값 꺼낼 때 등
- PointCut
- JoinPoint의 상세 스펙 정의
- 더욱 구체적으로 Advice가 실행될 지점 지정
- Weaving
- PointCut에 의해 결정된 Target의 JoinPoint에 Advice를 삽입하는 과정
- Aspect
- AOP 적용 방법
- 컴파일 시 적용
- AspectJ가 사용하는 방법
- 자바 파일을 클래스 파일로 만들 때 Advice 소스가 추가되어 조작된 바이트 코드 생성하는 방법
- 로드 시 적용
- AspectJ가 사용하는 방법
- 컴파일 후 컴파일 된 클래스를 로딩하는 시점에 Advice 소스를 끼워넣는 방법
- 런타임 시 적용
- Spring AOP가 사용하는 방법
- 스프링은 런타임 시 Bean 생성
- A라는 Bean 만들 때 A라는 타입의 프록시 Bean도 생성하고, 프록시 Bean이 A의 메소드 호출 직전에 Advice 소스를 호출한 후 A의 메소드 호출Spring
- 컴파일 시 적용
- Spring AOP 특징
- 프록시 패턴 기반의 AOP 구현체
- Target 객체에 대한 프록시를 만들어 제공
- Target을 감싸는 프록시는 런타임 시 생성
- 접근 제어 및 부가 기능 추가를 위해 프록시 객체 사용
- 프록시가 Target 객체의 호출을 가로채 Advice 수행 전/후 핵심 로직 호출
- 스프링 Bean에만 AOP 적용 가능
- 메소드 조인 포인트만 지원하여 메소드가 호출되는 런타임 시점에만 Advice 적용 가능
- 모든 AOP기능을 제공하지는 않으며 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션의 각종 문제(중복 코드, 프록시 클래스 작성의 번거로움, 객체 간 관계 복잡도 증가)에 대한 해결책 지원 목적
- 프록시 패턴 기반의 AOP 구현체
❔ 개인으로 준비한 질문
1. Container에 대해 설명해 주세요.
2. Spring, Spring MVC, Spring Boot이 차이에 대해 설명해 주세요.
3. POJO에 대해 설명해 주세요.
4. DAO와 DTO의 차이에 대해서 설명해 주세요.
'개인 공부 > TIL' 카테고리의 다른 글
[ TIL - CS ] 면접을 위한 CS 공부 10편 - 자바 - (0) | 2024.11.28 |
---|---|
[ TIL - CS ] 면접을 위한 CS 공부 9편 - 자바 - (0) | 2024.11.25 |
[ TIL - CS ] 면접을 위한 CS 공부 8편 - 네트워크 - (0) | 2024.11.22 |
[ TIL - 면접 ] 자소서 질문 대비 공부 4편 - JWT 편 - (0) | 2024.11.20 |
[ TIL - CS ] 면접을 위한 CS 공부 7편 - 네트워크 - (0) | 2024.11.18 |