반응형

SPRING

1. 스프링이란

 자바의 오픈 소스 애플리케이션 프레임워크중 하나로 스프링의 기본 철학은 특정  기술에 종속 되지 않고 객체를 관리할 수있는 프레임워크를 제공하는것

컨테이너로 자바객체를 관리하면서 의존성 주입과 제어의 역전을 통해 결합도를 낮춤

 

2. DI

2.1 DI란

Dependency Injection 의존성 주입

객체간 의존관계를 미리 설정해두면 스프링 컨테이너가 의존 관계를 자동으로 연결해줌

컴포넌트 스캔을 통해 하기의 어노테이션이 붙어있으면 자동으로 스프링 빈에 등록해줌 

- @Component : 컴포넌트 스캔에서 사용

- @Controlller : 스프링 MVC 컨트롤러에서 사용

- @Service : 스프링 비즈니스 로직에서 사용

- @Repository : 스프링 데이터 접근 계층에서 사용

- @Configuration : 스프링 설정 정보에서 사용

생성자 주입 시 @Autowired를 쓰거나, 롬복의 @RequireArgsConstructor를 사용

 

2.2 DI 하는 방법 및 장단점

DI 방법 장점 단점
필드 주입  코드가 간결  변경 불가
 프레임워크에 의존적
 테스트 코드 작성시 객체수정이 불가
setter 주입  객체 생성 이후에도 객체 변경가능
 선택적으로 생성해야하는 객체나 변경이 발생하는 의존관계에서 사용
 public으로 구현하기 때문에, 관계를 주입 받는 객체의 변형 가능성을 열어둠
생성자 주입  생성자의 호출 시점에 1회 호출 되는 것이 보장
 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해
 

 

3. IoC (Spring 3대요소 중 하나)

Inversion of Control 제어의 역전

제어권이 사용자에게 있지 않고 프레임워크에 있어서 필요에 따라 사용자의 코드를 호출함

스프링에서는 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너에서 대신 관리함

 

4. AOP (Spring 3대요소 중 하나)

4.1 설명

관점 지향 프로그래밍

여러 객체에 공통으로 적용 할 수 있는 기능을 분리하여 개발자는 반복작업을 줄이고 핵심 기능 개발에만 집중할 수 있음

Object Oriented Programming(객체지향 프로그래밍)을 보완 할 수 있는 패러다임

※ 여러 오브젝트에 나타나는 공통 부가기능을 모듈화하여 재사용

 

4.2구현 방법

※어떤 부가기능을 어디에 적용시킬지 파악

Advice 

- Joinpoint에서 실행되어야 하는 프로그램 코드

- 독립된 클래스의 메소드로 작성
- 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- 관심사를 구현한 소스코드

- 종류 5가지

@Before : 메서드가 실행되기전에 사용되는 Advice

@AfterReturning: 메서드가 정상적으로 실행되었을 때 사용되는 Advice

@AfterThrowing : 메서드가 예외를 발생 시켰을 때 사용되는 Advice

@After : 메서드가 정상적으로 실해되거나, 예외를 발생시켰을때 사용되는 Advice

@Around : 비지니스 로직 전후 실행되는 Advice

 

 JoinPoint

- Advice가 적용 될 수 있는 위치, 어플리케이션 실행 흐름에서의 특정 포인트(AOP를 적용할 수 있는 지점)를 의미

- 메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
- Advice를 적용할 수 있는 후보 지점 혹은 호출 이벤트
- Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
- 관심사를 구현한 코드를 끼워 넣을 수 있는 프로그램의 이벤트를 말하며, 예로는 call events, execution events, initialization events 등이 있음

 

PointCut

- joinpoint의 상세한 스펙을 정의한것, 언제 Advice를 실행할지를 정의
- Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의
- 예로 Advice가 실행된 Target의 특정 메소드 등을 지정
- JoinPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
- 관심사가 주프로그램의 어디에 횡단될 것인지를 지정하는 문장이며, 에로는 before call(public void update*(...))등이 있음

 

5. PSA (Spring 3대요소 중 하나)

Portable Service Abstraction. 필요에 따라 바꿔 끼울 수 있는 서비스 추상화

 Service Abstraction으로 제공되는 기술을 다른 기술 스택으로 간편하게 바꿀 수 있는 확장성을 갖고 있는 것

 

6. servlet Filter, Spring Interceptor, AOP의 차이

6.1 호출 순서

 Filter → Interceptor → AOP → Controller → AOP → Interceptor → Filter

 

6.2 Filter

요청과 응답을 거른뒤 정제하는 역할

Dispatcher Servlet 이전에 실행

 지정된 자원의 앞단에서 요청 내용을 변경하거나, 여러가지 체크를 수행

자원 처리가 끝난 후 응답 내용에서도 변경 처리 가능

일반적으로 인코딩 변환, XSS 방어등 요청에 대한 처리로 사용

Init() : 필터인스턴스 초기화

 doFilter() : 전/후 처리

 distroy() : 필터인스턴스 종료

 

6.3 Interceptor

요청에 대한 작업 전/후로 가로챔(Dispatcher Servlet, controller 호출 전/후)

스프링 컨텍스트(context 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리

스프링의 모든 빈 객체에서 접근 가능

 인터셉터 여러개 사용가능(로그인, 권한, 로그 등)

preHandler() : 컨트롤러 메서드 실행전

postHandler() : 컨트롤러 메서드 실행후 view 페이지 렌더링 전

afterCompletion() : view 페이지가 렌더링 된 후

 

6.4 스프링 프레임워크 동작 순서 

 

HTTP 요청 → 핸들러 조회  핸들러 어댑터 조회  핸들러 어댑터 실행  핸들러 실행  ModelAndView 반환 viewResolver 호출  View 반환  뷰 렌더링 HTML 응답

 

※ 스프링 프레임워크 단순 버전

HTTP 요청 → DispatcherServlet에서 매핑할 컨트롤러가 있는지 HandlerMapping에서 조회 → controller 실행 → 요청 처리 후 결과를 출력한 view 이름을 DispatcherSerlvet에 리턴 → 컨트롤러에 보내온 View이름을 ViewResolver에게 전달 → 처리결과를 View에 송신 → Dispatcher서블릿에서 클라이언트에게 최종 결과 출력

 

7. @Bean이 무엇인지, new 연산자를 통해 오브젝트를 생성하는것과 무슨 차이가 있는지

 @Bean

 - 스프링 컨테이너가 관리하는 자바 객체

 - Bean의 등록 방법

   : @Component 에노테이션을 사용하면 컴포넌트 스캔이 자동으로 이루어짐

   : @Configuration에 직접 @Bean 어노테이션 사용

• new 연산자와 @Bean을 주입 받는것의 차이점

 - new 연산자는 실행되는 시점에 인스턴스를 생성

 - @Bean은 @Bean에 등록된 이미 존재하는 인스턴스를 프로그램에 맞도록 주입 시켜줌

 - @Bean 등록 시 싱글톤으로 관리되어 같은 객체 주소를 참조함

※ 클래스간 결합도를 낮추고 응집도를 높임

 

8. 싱글톤

8.1 싱클톤이란

 객체의 인스턴스가 오직 한개만 생성되는 디자인 패턴

메모리낭비 방지, 속도가 빠름, 데이터 공유가 쉬움

 

8.2 싱글톤의 단점

싱글톤인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시키면 다른 클래스간의 결합도가 높아짐

개방 폐쇄 원칙에 위배(확장에는 열려있고 수정에는 닫혀있는 원칙)

 

8.3 스프링에서 싱글톤

스프링 컨테이너는 객체 인스턴스를 싱글톤으로 관리

객체 인스턴스를 공유하기 때문에 객체 상태를 유지하게 설계하면 안됨

 

9. Spring과 Spring Boot의 차이점

  스프링 프레임워크 스프링 부트
Dependency  dependency를 설정해줄 때 설정 파일이 매우 길고, 모든 dependency에 대해 버전 관리도 하나하나 해줘야 함  dependency를 Spring Framework보다 쉽게 설정해 줄 수 있고, 라이브러리간 버전 관리도 자동으로 해줌
AutoConfiguration configuration설정을 할 때 매우 길고, 모든 어노테이션 및 빈 등록 등을 설정해 줘야함 application.properties파일이나 application.yml파일에 설정하면 됨
편리한 배포 war파일을 Web Application Server에 담아 배포 Tomcat 이나 Jetty 같은 내장 WAS를 가지고 있기 때문에 jar 파일로 간편하게 배포

※ 스프링부트의 단점: 대부분 만들어져있고 확장이 가능하기 때문에 소스를 분석하거나 로직을 이해할 때 깊숙히 파고들어야함

 

 

10. Spring data JPA

10.1 영속성 컨텍스트란?
 객체지향 적인 코딩이 가능
 컬럼 추가시 쿼리를 작성할 필요없이 필드만 추가하면 됨
 특징 : 영속성 컨텍스트라는 것이 존재함으로 인해 발생하는 특징들이 생김
 같은 키로 조회하면 항상 동일한 오브젝트가 리턴되는것이 보장됨
 더티체킹, 엔티티의 변경된 부분만 찾아서 업데이트 함
 지연된 쓰기 지연, Create, Update, Delete시 쿼리를 캐시에 저장하고 있다가 한번에 처리함


10.2 N+1 문제가 무엇인가? 어떻게 해결할 수 있는가?

 

10.3 단방향 연관관계, 양방향연관관계를 설정해야 하는 경우는?


10.4 양방향연관관계에서 연관관계의 주인은 어디에 설정해야하나?


10.5 영속성전이(Cascade)에 대하여


10.6 연관관계가 없는 컬럼끼리 조인을 해야 하는 경우가 있음


10.7 연관관계가 복잡한 쿼리는 JPA로 힘든 부분이 있을것 같은데 어떻게 처리 했는지

 

 

 

반응형

+ Recent posts