본문 바로가기
부트캠프/백

12.6 Framework, SpringFramework, POJO

by 티코딩 2022. 12. 10.

ㅇ Framework란?

Frame은 어떤 대상의 큰 틀이나 외형적인 구조를 의미하는데, 프로그래밍에서도 비슷하다. 애플리케이션을 건물이라 가정하면, Frame은 건물의 구조라고 이해하면된다. 결론적으로 framework는 프로그래밍을 하기 위한 어떤 틀이나 구조를 제공한다.

장점 - 기본구조가 있기때문에 효율적으로 코드 작성가능, 정해진 규약이 있어 효율적으로 관리 가능

단점 - Framework를 공부해야함, 규약이 있어서 자유도가 떨어진다.

 

ㅇ Framework와 라이브러리의 차이

자동차를 예로 들면, Framework는 뼈대, 프레임을 의미하고, 라이브러리는 기능을 제공하는 ‘부품’을 의미한다. 한번 프레임이 만들어지면 프레임워크를 교체하는것은 어렵지만 라이브러리는 언제든지 교체하기 쉽다는것이다. 다시말해, 애플리케이션에 대한 제어권의 차이가 있다고 할 수 있다.

 

ㅇ SpringFramework의 장점

  • POJO(Plan Old Java Object) 기반의 구성
  • DI(Dependency Injection)지원
  • AOP(Aspect Oriented Programming) 지원
  • Java언어를 사용함으로써 얻는 장점

 

ㅇ Spring을 배워야하는이유

Spring 이전에 JSP를 이용해 개발이 이뤄졌었고, 코드가 너무 길고 가독성도 떨어졌었다. 유지보수가 너무 어려웠다. 그리고 Servlet이라는 방식이 있는데, JSP방식 이나 Spring 방식은 내부적으로는 Servlet을 사용한다. 

 

ㅇ POJO(Plain Old Java Object)

Java로 생성하는 순수한 객체라는 뜻으로, POJO로 작성된 코드라고 보려면 자바나 자바의 스펙에 정의된것 이외에 다른 기술이나 규약에 얽매이지 않아야 하고, 특정환경에 종속적이지 않아야 한다는 것이다. POJO프로그래밍이 필요한 이유는 종속적인 코드를 제거해 코드가 깔끔해지고 확장이 유연하다. 그리고 객체지향적인 설계를 제한없이 적용할 수 있다는 것이다. POJO프로그래밍을 위해 Spring에서 세가지 기술을 지원하는데, 기술은 IoC/DI, AOP, PSA다. 항상 내가짠 코드가 객체지향 스러운지 확인해보자.

 

ㅇ IoC/DI

  • IoC(Inversion of Control)

Framework은 애플리케이션의 흐름주도권은 Framework에 있다. 고로 애플리케이션 흐름주도권이 뒤바뀐것이 IoC다. Java 콘솔 애플리케이션의 경우, main()메서드가 있어야 하다. Java 웹 애플리케이션에서는 외부에서 접속해서 사용하기 때문에 main() 메서드가 존재하지 않는다. 대신 서블릿 컨테이너에서는 컨테이너 로직이 서블릿을 직접 실행시켜 준다. 이렇게 서블릿과 웹 애플리케이션간에 제어의 역전(IoC)의 개념이 적용되어있다는 것이다!

Spring 에서는 IoC의 개념이 DI로 적용되어있다.

  • DI(Dependency Injection)

의존성 주입은 IoC개념을 구체화 시킨것이라고 할 수 있다. 객체지향 프로그래밍에서 의존성 주입이란 객체 간의 의존성을 의미한다. 클래스 A,B를 만들고 A클래스에서 B클래스의 기능을 사용할때 A클래스는 B클래스에 의존한다고 한다. 그리고 생성자를 통해 어떤 클래스의 객체를 전달받는것을 의존성 주입이라고 한다. 생성자의 파라미터로 객체를 전달하는 것을 외부에서 객체를 주입한다라고 표현하는것이다.  DI는 다시말해 - 클래스의 생성자로 객체를 전달 받는 코드가 있다면, ‘아 객체를 외부에서 주입 받고 있구나. 의존성 주입이 이루에 지고 있구나’ 왜 의존성 주입이 필요할까? 그전에 먼저, 객체를 생성하기 위한 new키워드를 쓸지 말지 여부를 결정해야한다. Java 에서 new 키워드를 사용해서 객체를 생성하는데 Reflection기법을 사용해 Runtime시에 객체를 동적으로 생성할 수 있는 방법이 있다. 그래서 new 키워들르 통해 객체 생성하면 객체지향 설계의 관점에서 중요한 문제가 발생할 수 있는데, new 키워드를 사용해 의존객체를 생성하면 클래스들 간 강하게 결합 되어있다라고 함. 의존성 주입을 하더라도 의존성 주입의 혜택을 보기위해선 강한결합보단 느슨한 결합이 좋다. 느슨한 의존성주입의 대표적인 방법은 인터페이스를 이용하는것이다. 어떤 클래스가 인터페이스에 의존하고 있을 때, 느슨한 결합이 되어있다고 한다.

 

ㅇ AOP(Aspect Oriented Programming)

관심 지향 프로그래밍. 프로그래밍에서 관심이란? 애플리케이션에서 공통적으로 적용되는 공통기능에 대한 관심과 관련있다.

  공통기능들에 관한 관심사는 공통 관심 사항, 주목적을 달성하기 위한 핵심 로직에 대한 관심사를 핵심 관심 사항이라고 합니다.

  즉 AOP라는건 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랙잭션같은 공통 기능 로직들을 분리하는 것이라고 생각하면 된다. 

  AOP가 필요한 이유는 핵심 로직에 공통적인 기능의 코드들이 보이면 코드자체가 복잡해짐. 유지보수가 어려워짐. 고로 중복된 코드를 공통화해서 재사용가능하게 만들어야 함. Spring에서는 이미 AOP를 통해 공통화해뒀다.

 

ㅇ PSA(Portable Service Abstraction)

추상화란 어떤 클래스의 본질적인 특성만 추출해, 일반화 하는것이다. Java에서 추상화를 표현하는것은 추상클래스와 인터페이스다. 왜 추상화를 사용할까? 하위 클래스별 같은 기능을 사용하되 다른 데이터를 집어넣기 쉽기 때문이다. 클라이언트가 추상화된 상위클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 PSA, 일관된 서비스 추상화의 기본개념이다. 다시말해, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는것을 PSA라고 한다. 또, PSA를 통해 애플리케이션의 요구사항 변경에 유연하게 대처할 수 있다. 

 

ㅇ 아키텍쳐

어떤 건물이나 구조물에대한 컨셉을 잡는것으로 시작하고 너무 복잡하면 안된다.

  • 시스템 아키텍처

HW,SW를 모두 포함하는 전체적인 시스템의 구성을 표현한것. 웹 애플리케이션 아키텍처 는 클라이언트의 요청을 처리하는 서버 애플리케이션을 의미함. 

  • 모듈

지원되는 여러가지 기능들을 목적에 맞게 그룹화 묶어 놓은것. Java 패키지 단위로 묶여, 패키지안엔 관련기능을 위한 클래스들이 모여있음. 일반적으로 모듈은 라이브러리형태로 제공됨.

 

중요한점 요약

POJO와 3가지 특징

ㅇ POJO

Plain Old Java Object로, Java로 생성하는 순수한 객체라는 뜻.

다른기술,규약 없이 자바의 스펙 내에서 정의된 것, 종속적인 코드를 제거해 코드가 깔끔하고 확장이 유연해진다. POJO프로그래밍을 위해 Spring이 제공하는 세가지 기술은 IoC/DI, AOP, PSA.

 

ㅇIoC/DI

main메서드 없이 서블릿 컨테이너에서는 컨테이너 로직이 직접 서블릿을 실행시켜줌. 서블릿과 웹 애플리케이션간 제어의 역전이 일어남. 이것이 바로 IoC(Inversion of Control)

IoC 개념을 구체화 시켜, 클래스의 생성자로 객체를 전달받는 코드를 의존성 주입이 이루어지고 있다 볼 수있고, new키워드를 사용해 강한 결합보단 Reflection기법을 사용한 느슨한 결합이 더 좋다. 이것이 DI(Dependency Injection)

 

ㅇ AOP

Aspect Oriented Programming 관심 지향 프로그래밍. 여기서 관심이란 공통기능에대한 관심.

애플리케이션의 핵심 업무 로직에서 공통 기능 로직들을 분리하는 것.

 

ㅇ PSA

Portable Service Abstraction.

클라이언트가 추상화된 상위클래스를 일관됙 바라보며 하위 클래스의 기능을 사용하는 것. 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하며 기술자체를 유연하게 사용할 수 있도록 하는 것.

'부트캠프 > ' 카테고리의 다른 글

Section3-1  (0) 2023.01.29
Reactive Programming  (0) 2023.01.28
11.29 네트워크,HTTP  (0) 2022.11.29
11.24 시간복잡도, Greedy, 구현  (0) 2022.11.25
11.22 자료구조-Tree, 그래프, BinarySearchTree(BST), BFS/DFS  (0) 2022.11.25