SpringFramework/Spring

Spring Boot

lovineff 2020. 6. 9. 10:08

ㄴ스프링 부트

독립적 어플리케이션을 빠르고 쉽게 만들수 있다.

빠르고 폭넓은 사용성을 제공

가장 많이 사용하는 기본 설정을 제공하고, 설정을 쉽고 빠르게 할 수 있다.

코드 제너레이션, XML 설정을 사용하지 않음

자바8 이상부터 사용 가능함.

서블릿 버전은 3.1 이상부터만

 

 

스프링 프레임워크 주요 3대 기술

IoC(Inversion of Control, 제어의 역전, 의존적 주입)

객체의 생성부터 생명주기 관리까지 모든 객체에 대한 제어권이 바뀐것을 의미

자바 객체를 생성하고 서로간의 의존관계를 연결시키는 제어권은 어플리케이션이 있으나,

Servlet, EJB등을 사용하는 경우 제어권이 컨테이너로 넘어간다.

- DL(Dependency Lookup)
EJB, Spring

- DI(Dependency Injection)
Spring

 

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)

로직을 관점 기준별로 나누어 모률화하여, 재사용이 가능하도록함.

프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위함

스프링 빈에만 AOP 적용 가능

스프링 IoC와 연동하여, 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성, 객체들 간 관계 복잡도 증가...)에 대한 해결책을 지원하는 것이 목적

어노테이션 Aspect 사용

Spring AOP 가 사용하는 패턴

Lazy Loading(필요한 시점에 실제 사용할 오브젝트를 초기화하고 리소스를 준비)

- 인터페이스를 사용하고 실행시킬 클래스에 대한 객체가 들어갈 자리에 대리자 객체를 대신 투입하여, 흐름 제어만하며 결과값을 조작하거나 변경시키지 않는다.

- 인터페이스를 사용 실제 서비스와 같은 이름의 메서드를 구현

 ㄴ 실제 서비스에 대한 참조 변수를 갖는다

 ㄴ 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.

 ㄴ 실제 서비스의 메서드 호출 전후에도 별도의 로직을 수행할 수 있다.

 ㄴ 원래 하려던 기능을 수행하며, 그 외의 부가작업(로깅, 인증, 네트워크 통신 등)을 수행하기에 좋다.

가상 프록시 패턴

보호 프록시 패턴

프록시 패턴 예제

- https://limkydev.tistory.com/79

- https://jdm.kr/blog/235

 


PSA(Portable Service Aspect)

@Transactional, @GetMapping, @PostMapping, @Cacheable... 등 기본 제공하고 있으나, 새로 만들어서 사용 가능하다.

어노테이션을 만들어서 사용이 가능하다.

기술이 바뀌어도, 코드는 변경은 거의 없다.

 

 

용어 설명

컨테이너

- 작성된 코드의 처리과정을 위임받은 독립적인 존재

- 인스턴스의 생명주기를 관리

- 생성된 인스턴스들에게 추가적인 기능을 제공하게 한다.

 

Servlet 컨테이너

- Servlet 인스턴스에 대한 생명주기 관리(Servlet 생성, 초기화, 서비스 실행, 소멸에 관한 모든 권한을 가지고 있음)

 

Spring 컨테이너

- 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트 관리

 

빈팩토리 BeanFactory

- DI의 기본사항을 제공하는 컨테이너

- 팩토리 디자인을 구현한 것.

- 빈을 생성하고 분배

- 빈 팩토리가 빈의 정의는 즉시 로딩하나, 빈이 필요하기 전까지는 인스턴스화를 하지 않는다(lazy loading, 게으른 호출)

- BeanFactory 클래스로 빈을 직접 호출 가능

- getBean() 함수가 호출될때 팩토리는 의존성 주입을 이용해 빈을 인스턴스화

- 어플리케이션 컨텍스트 ApplicationContext

 ㄴ 빈팩토리와 유사한 기능을 제공하나, 더 많은 기능을 제공

 ㄴ 국제화가 지원되는 텍스트 메시지 관리

 ㄴ 정적 자원을 로드할 수 있는 방법 제공

 ㄴ 리스터로 등록된 빈에 이벤트 발생을 알려줌

 

자바빈

- 데이터 표현을 목적으로 하는 자바 클래스(컴포넌트와 비슷한 의미로 사용)

- 속성필드, get, set 메소드, 기본 생성자 포함

- java.io.Serializable 인터페이스는 생략 가능하나, 빈즈 규약에 명시된 내용으로 자바 빈즈에 저장된 프로퍼티를 포함한 채로 파일 시스템에 저장되거나

- 네트워크로 전송될 수 있도록 객체 직렬화를 제공해야 하므로 implements 한다.

 

스프링빈

- 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트

 

POJO(Plain Old Java Object)

- Getter, Setter 메소드로 이루어진 Value Object성의 Bean

- 상속, 인터페이스 구현을 강제하지 않으며, 에노테이션을 강제하지 않는다.

- 특정한 라이브러리나 컨테이너의 기술에 종속되지 않고, 일반적인 형태로 코드를 작성할 수 있다.

- 이는 생산성 향상과, 테스트 작업이 유연해지게 한다.

- 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

 

ORM(Object-Relational Mapping)

- 객체와 DB의 테이블 매핑

- 메서드로 데이터 조작 가능

- 생산성이 매우 높아지나, 쿼리가 복잡해지면 ORM 표현에 한계가 있고, 성능이 raw 쿼리에 비해 느림.

- 대표적으로 Hibernate가 있다.

- 장점

 ㄴ 생산성 증가

 ㄴ 메서드 호출만으로 쿼리가 수행되므로, 생산성이 매우 높아진다. 

 ㄴ 테이블 칼럼이 변경된 경우 JPA 는 알아서 작업을 해주기 때문에 유지보수가 좋다.

 ㄴ 특정 벤더에 종속적이지 않음

 ㄴ 추상화된 데이터 접근 계층을 제공하므로, 특정 벤더에 종속적이지 않다.

 ㄴ 설정 파일에서 DB만 변경하면 된다.

- 단점

 ㄴ 성능

    - SQL 직접 작성하는것보다 성능이 떨어질수 있다.

 ㄴ 세밀함

    - 복잡한 쿼리 작성이 어렵다. > 쿼리를 통해 호출할 수 있도록 지원하고 있다.

  ㄴ 러닝커브

    - 배울 내용이 많다.

- 스프링 데이터 JPA

 ㄴ Repository 빈 자동 생성

 ㄴ 쿼리 메소드 자동 구현

 ㄴ @EnableJpaRepositories(스프링 부트가 자동으로 설정)

 


OOP(Object-Oriented Programming, 객체 지향 프로그래밍)

강한 응집력과 약한 결합력을 지향

 

응집력(cohesion)

프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도.

프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집력이 높다고 표현한다.

 

결합력(coupling)

프로그램 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도.

결합력이 낮다는 것은 한 요소가 다른 요소들과 관계를 크게 맺고 있지 않은 상태를 의미한다.

 

캡슐화(Encapsulation)

객체의 데이터를 외부에서 직접 접근하지 못하게 하고, 함수를 통해서만 조작이 가능하도록 하는 것

 

추상화(Abstraction)

객체들이 가진 공통의 특성을 파악하고 불필요한 특성을 제거하는 과정

속성 위주가 아닌 동작 위주로 정의하는 작업

'SpringFramework > Spring' 카테고리의 다른 글

Swagger2 설정 및 사용  (0) 2020.11.13
class 파일내 DataSource 설정  (0) 2020.11.11
REST API  (0) 2020.06.10
Spring Security 세션정보 조회  (0) 2020.06.09
Spring Security 설정  (0) 2020.06.09