[SEB BE]Section 2. 스프링프레임워크 기본개념정리!!

박두팔이·2023년 2월 2일
0

스프링프레임워크

목록 보기
2/18
post-thumbnail

스프링을 시작하기 앞서 이정도는 알고 넘어가자!

  • Spring Framework이 도입되기 전에는 JSP나 Servlet 기술을 사용한 Model1, Model2 아키텍쳐를 기반으로 한 Java 웹 애플리케이션을 제작하였다.
  • Spring MVC 방식이 도입됨으로써 Java 웹 애플리케이션의 제작 방식이 획기적으로 변하게 되었다.
  • Spring MVC 설정의 복잡함과 어려움을 극복하기 위해 Spring Boot이 탄생하게 되었다.

스프링 프레임워크만의 장점

웹 애플리케이션 개발을 위한 프레임워크에는 Spring뿐 아니라 Django, Express, Flask, Lalavel 등 다양한 프레임워크가 있다.

프레임워크마다 사용하는 언어도 다르고 개발방법도 조금씩 달라진다. 우리는 왜 이 중에 스프링 프레임 워크를 사용하는가?

1. POJO(Plan Old Java Object)기반의 구성
2. IoC/DI(Inversioin of Control) / (Dependency Injection) 지원
3. AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
4. PSA (Portable Service Abstraction,추상화 구조)

객체지향 설계 원칙에 잘 맞는 재사용과 확장이 가능한 애플리케이션 개발스킬서비스의 안정성이 필요한 기업용 엔터프라이즈 시스템을 제대로 구축할 수 있도로 해주는 것이 스프링프레임워크을 우리가 사용해야하는 이유이다.


POJO(Plain Old Java Object)

푸조(POJO)란?

POJO: JAVA로 생성하는 순수한 객체

💡 POJO프로그래밍이란 무엇일까?

순수 자바 객체만을 사용해서 프로그래밍 코드를 작성하는 것

💡 그러나 POJO프로그래밍으로 작성된 코드라고 하기위해서는 두 가지 기본규칙이 있다.

  • Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
  • 특정 환경에 종속적이지 않아야 한다.

    예를들어 아파치 톰캣을 이용하여 웹 애플리케션을 실행하고있었는데 시스템의 요구사항이 변경되어 톰캣대신 제티라는 서블렛컨테이너를 사용하라고 한다면 아마도 개발자는 코드에서 사용하고있는 톰캣API를 모두 걷어내고 zetty로 수정하거나 최악의 경우, 전부 뜯어 고쳐야할지 모른다.
    이것이 POJO프로그래밍이 필요한 이유이다.

💡 POJO프로그래밍이 필요한 이유?

  • 환경이나 기술에 종속적이지 않다.
    • 코드의 재사용이 가능하다. -> 확장가능한 유연한 코드작성!
    • 테스트가 단순해진다.
  • 저수준 레벨의 기술과 환경에 종속적인 코드를 제거했다.
    • 깔끔한 코드가 가능! -> 디버깅이 쉬움
  • 객체지향적인 설계를 제한없이 적용할 수 있다.

POJO의 핵심포인트!

  1. POJO란 순수한 Java 객체를 의미한다.
  2. POJO 프로그래밍이란 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법이다.
  3. POJO 프로그래밍을 효과적으로 적용하기 위해서는 특정 기술에 대한 지식보다는 JDK의 API에 대한 지식과 객체지향적인 사고방식과 설계를 위한 훈련이 우선시 되어야 한다.
  4. ⭐️ Spring Framework은 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA 라는 기술을 제공한다.

POJO와 Spring의 관계

스프링프레임워크를 사용하기 전에는 원하는 특정기술을 직접적으로 사용하는 객체를 만들어 사용했다. 그러나 프로젝트의 규모가 커짐에 따라 기술들이 들어나면서 특정기술과 환경에 종속되는 경우가 자주발생하게 되었다. 이는 작성된 코드의 유지/보수를 어렵게하고 특정 클래스를 상속받게 되어 기능의 확장을 막았다. 이에따라,

좋은 객체지향설계를 할 수 있는 자바언어를 사용하면서도 객체지향설계 본질을 잃어버리는 문제들을 해결하는 방법으로 POJO라는 개념이 등장하게 되었다.


POJO프로그래밍을 위한 스프링이 제공하는 3가지 기술!

1.IoC(Inversion of Control)

IoC / DI?

💡 IoC란?
애플리케이션 흐름의 주도권이 개발자에서 프레임워크(Spring)로 뒤바뀐 것을 바로 IoC(Inversion of Control)라고한다.

일반적인 흐름은 개발자가 작성한 코드가 순차적으로 실행되지만 웹에서 동작하는 애플리케이션의 경우 클라이언트가 외부에서 접속하기 때문에 main()메서드가 종료되면 실행할 수 없기 때문에 종료가되면 안된다.

서블릿 컨테이너에는 서블릿사용에 맞게 작성된 서블릿 클래스만 존재할 뿐 별도의 main()메서드가 존재하지 않는다.

서블릿 컨테이너의 경우, main()메서드가 없더라도 클라이언트의 요청이 들어올 때마다 컨테이너 로직(service() 메서드)이 서블릿을 직접 실행시켜 주기 때문에 main() 메서드가 필요없다.

이러한 경우 서블릿컨테이너가 서블릿을 제어하고 있기 때문에 주도권은 서블릿 컨테이너에게 있다고 봐야하다.

이것을 서블릿과 웹 애플리케이션간에 IoC(제어의 역전)개념이 적용됐다고 표현한다.

Spring에서도 이 IoC의 개념(일반적인 개념)이 적용되어 있는데 이를 DI(Dependency Injection, 의존성주입, IoC개념을 더 구체화 시킨 것) 라고 한다.


💡 DI란?
DI란 의존성 주입을 의미하는데 a라는 클래스에서 b라는 클래스를 사용하고 있다면 이것은 'a가 b를 의존한다' 라고 이야기할 수 있다.

어떤 클래스가 인터페이스같이 일반화된 구성요소에 의존하고 있는것을 '느슨한결합'이라고한다.

우리는 코드를 작성할 때 'new' 키워드를 쓸것인가 말것인가를 고민해야 한다. 자바에서 생성하긴 위해선 new키워드는 필수였다 그러나 스프링에선 new키워드를 사용하지 않고도 인터페이스를 생성하여 의존성주입이 가능하다.

  • DI(Dependency Injection)는 IoC 개념을 조금 구체화 시킨 것으로 객체 간의 관계를 느슨하게 해준다.
  • 클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립하게 된다.
  • 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다.
  • new 키워드를 사용하여 객체를 생성할 때, 클래스 간에 강하게 결합(Tight Coupling)되어 있다고 한다.
  • 어떤 클래스가 인터페이스 같이 일반화 된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling) 되어 있다고 한다.
  • 객체들 간의 느슨한 결합은 요구 사항의 변경에 유연하게 대처할 수 있도록 해준다.
  • 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.
  • Spring에서는 애플리케이션 코드에서 이루어지는 의존성 주입(DI)을 Spring에서 대신 해준다.

AOP(Aspect Oriented Programming)란?

AOP를 한글로 번역하면 '관심지향프로그래밍'으로 해석할 수 있다.

  • AOP(Aspect Oriented Programming)는 관심 지향 프로그래밍이다.
  • AOP에서 의미하는 Aspect는 애플리케이션의 공통 관심사를 의미한다.
  • 애플리케이션의 공통 관심사는 비즈니스 로직을 제외한 애플리케이션 전반에 걸쳐서 사용되는 공통 기능들을 의미한다.
  • 애플리케이션 전반에 걸쳐서 사용되는 공통 기능에는 로깅, 보안, 트랜잭션, 모니터링, 트레이싱 등의 기능이 있다.
  • AOP를 애플리케이션에 적용해서 다음과 같은 이점을 누릴 수 있다.
    • 코드의 간결성 유지
    • 객체 지향 설계 원칙에 맞는 코드 구현
    • 코드의 재사용

AOP에서 'Aspect'는 애플리케이션에 필요한 기능 중에 공통적으로 적용되는 공통 기능에 대한 관심이다.

💡공통 관심 사항 & 핵심 관심 사항
애플리케이션을 개발할 때 공통적으로 사용되는 기능들이 있다. 예를들면 커피를 주문하기 위한 애플리케이션이 있다고할 때 로깅, 보안, 트랜잭션공통관심사항이 된다.

반대로 우리가 흔히 비즈니스 로직이라고 하는 핵심로직에 대한 관심사를 핵심관심사항이라고 한다.

AOP: 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것이다.

AOP가 필요한이유

애플리케이션의 핵심로직에서 공통 기능을 분리하는 이유는 3가지로 정리할 수 있다.

  • 코드의 간결성 유지
  • 객체지향설계원칙에 맞는 코드구현
  • 코드의 재사용

애플리케이션을 제작하면서 항상 기본적으로 가졌으면 하는 사고는 ‘어떻게 하면 이 코드를 깔끔하게 유지할 수 있을까?’, ‘어떻게하면 여기 저기 중복되는 코드들을 재사용할 수 있을까?’라는 것이다.


PSA(Portable Service Abstraction, 일관된 서비스 추상화)

어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는 것을 바로 추상화(Abstraction)라고 한다.

객체지향 프로그래밍 언어인 java에서는 코드로 추상화를 표현하는 대표적인 방법이 바로 추상클래스와 인터페이스다.

서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.

💡 PSA가 필요한 이유?

  • 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위해 PSA(일관된 서비스 추상화) 한다.
  • 이렇게 하면 애플리케이션의 요구사항변경에 유연하게 대처할 수 있다.
  • 스프링에서 PSA가 적용되는 분야는 트랜잭션서비스, 메일, Spring Data서비스 등이 있다.

📖 PSA정리

1. 클래스의 본질적인 특성을 일반화하는 것을 추상화라고 한다.

2. 클라이언트가(데이터를 요청하는 쪽) 추상화 된 상위클래스를 일관되게 바라보며 하위클래스의 기능을 사용하는 것이 PSA의 기본개념이다.

3. 서비스의 기능에 접근하는 방식을 일관되게 유지하면서 기술자체를 유연하게 사용할 수 있도록 하는 것이 PSA이다.

4. 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구사항을 반영하기 위해 PSA가 필요하다.

profile
기억을 위한 기록 :>

0개의 댓글