1. IOC
- 제어의 역전
- 개발자가 직접 객체를 관리하지 않고 스프링 컨테이너에서 직접 객체를 생성하여 해당 객체에 주입 시켜준 것
- 생명주기 관리를 컨테이너가 도맡아서 한다.
- 이점
- 역활과 책임의 분리 -> 높은 응집도와 낮은 결합도
- 변경에 유연한 코드 구조를 가져가기 위해서
2. DI
3. Service, Controller, Repository annotation의 차이점
- @Component: Spring에서 관리되는 객체임을 표시하기 위해 사용되는 가장 기본적인 애너테이션
- @Controller: @RequestMapping 애너테이션은 해당 애너테이션애만 사용 가능
- @Repository: Spring에서 지원하지 않은 Exception을 사용할 경우 사용해야한다. 만약 Exception이 발생하면 Unchecked Exception인 DataAccessException이 발생
- @Service: @Component와 큰 차이가 없다.
4. @Controller, @RequestController의 차이
-
@Controller
- 뷰를 반환하기 위해 사용
- Data를 반환하는 경우도 있지만 @ResonseBody를 사용해야먄 Json 형태로 데이터를 반환할 수 있다.
-
@RequestController
- 데이터를 반환하기 위해 사용
- @Controller + @ResonseBody
5. Bean 등록 방법
-
생성자 사용
- Null을 주입하지 않는한 NullPointerException이 발생하지 않는다.
- final 키워드를 통해 객체의 불변을 유지 할 수 있다.
- 순환 참조를 방지할 수 있다.
-
필드 주입
- 가장 단순하지만 추후 변경할 수 있는 방법이 없다.
-
Setter 주입
- 수정이 가능하다
- 가장 큰 단점은 public이 의무화되는 메서드에서 개발자가 임의로 호출할 수 있기 때문에 보안 상의 문제가 발생한다.
- NullPointerException 발생 가능
6. @ControllerAdvice
- 전역에서 발생할 수 있는 예외를 잡아 처리해주는 애너테이션
7. AOP
- 관점 지향 프로그래밍
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하는 것
- 주요 개념
- Aspect: 흩어진 관심사를 모듈화 한것
- Target: advice가 적용되는 대상
- advice: 어떤 일을 해야할 지
- joinPoint: 메서드 실행 시점
- PointCut: JoinPoint의 상세한 스펙 정의
8. Interface, abstract 차이
-
abstract
- 미완성 설계도
- new를 통해 객체 생성 불가
- abstract로 선언한 메소드를 반드시 구현해야한다.
- 사용 여부
- 관련성이 높은 클래스 간에 코드 공유
- 추상 클래스를 상속받을 클래스들이 공통으로 가지는 메소드와 필드가 많을 때
-
interface
- 기본 설계도
- new를 통해 객체 생성 불가
- 추상 클래스보다 추상화 정도가 더 높다
- 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
- 다중 상속이 가능하다.
- abstract는 모든 메소드를 무조건 구현해야하는데 인터페이스는 다중상속하고 있는 인터페이스에 동일한 메서드가 존재하더라도 내부 구현이 안되어있어서 문제될 것이 없다.
- 사용 여부
- 서로 관련성이 없는 클래스들이 인터페이스를 구현할 때
9. Interceptor와 Filter 차이
-
Filter
- 디스패쳐서블릿 이전에 실행
- 자원의 앞단에서 요청 내용을 변경하거나 여러가지 체크 수행
-
Interceptor
- 요청에 대한 작업 전/후로 가로 챈다.
- 필터는 스프링 컨텍스트 외부에 존재하는 반면 인터셉터는 디스패쳐서블릿이 컨트롤러를 호출하기 전, 후로 실행되기 때문에 컨텍스트 내부에서 존재한다.
- 스프링의 모든 빈 객체에 접근 가능