코드스테이츠 백엔드 34일차 | Spring

hyoreal·2022년 8월 10일
0

CodeStates

목록 보기
25/32

결국 오고야 말았다. 지금은 장마로 인해 여기저기 큰 피해를 입고있는 한여름이지만 나에겐 봄이 와버렸다...🌸
스프링을 담당하신 엔지니어님께서는 봄은 봄인데 아주 추운 봄이라고 하셨다. 한 2월쯤..? 굉장히 걱정이 많고 따라갈 수 있을지 겁이 많이 난다. 그래서 어려운만큼 세세하게 다 작성하려고 한다. 미래의 내가 찾아보기 쉽도록..!!


학습목표!

  • Spring Framework가 무엇인지 이해
  • Spring Framework를 왜 배워야하는지 이해
  • Spring Framework의 아키텍처를 버드 아이 뷰 관점애서 이해
  • Spring Framework 모듈이 무엇이고 Spring Framework에서 지원하는 모듈에는 어떤 것이 있는지 이해
  • Spring Boot이 무엇이고 Spring Boot을 왜 사용해야하는지 이해

실습 환경 구성방법

IntelliJ Community Edition 에서 Spring Boot 샘플 프로젝트 생성하는 가장 쉬운 방법 "Spring Initializr 기능" 이용하기

Spring Initializr

  1. 위 공식 사이트로 이동
  2. 필요한 항목 지정
  3. 모듈선택
  4. 샘플 프로젝트 압축 파일 다운로드
  5. 다운받은 파일 압축 해제
  6. IntelliJ 실행
  7. 압축해제한 템플릿 프로젝트 파일 폴더 열기
  8. Lombok 설정 {File -> Settings -> Build,Execution,Deplyment -> Annotation Processors -> Enable annotation processing 체크 -> apply
  9. java 파일 클릭 후 실행
  • 실행 후 로그출력 좌측 실행 아이콘이 돌고있는것은 애플리케이션 자체가 내장 WAS에서 실행되고있음을 의미

Framework?

Frame : 어떤 대상의 큰 틀이나 외형적인 구조를 의미.
Framework : 기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공.

자바를 배웠던 사람이라면 framework가 낯설지 않을것이다.
Why? 한번 경험해봤기 때문!!
Java를 공부하면서 배웠던 Collections Framework 를 예시로 들어보자.

Collections Framework란 Java에서 자주 사용하는 Map, Set, List 등의 Collection들, 즉 데이터를 저장하기 위해 널리 알려져있는 자료구조를 바탕으로 비슷한 유형의 데이터들을 가공 및 처리하기 쉽도록 표준화된 방법을 제공하는 클래스의 집합

왜 Java의 Collection에만 Fromework라는 말을 붙였을까?

  • Java의 클래스 유형 중, 기본적인 뼈대로만 구성되어 있는 것이 "추상 메서드만 정의되어있는 인터페이스"이기 때문!!
  • Collection이 바로 인터페이스와 인터페이스들을 구현한 구현체들의 집합이다.

Framework는 서로 다른 애플리케이션간의 통신, 데이터를 데이터베이스에 저장 등 다양한 기능들을 라이브러리 형태로 제공해주어 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 대해 집중할 수 있도록 해준다!!

Framework 와 Library의 차이
Library : 애플리케이션 흐름의 주도권이 개발자에게 있다.

  • 개발자가 작성한 코드 내에서 필요한 기능이 있을때 해당 라이브러리를 호출하여 사용하는것이 Library의 특징

Framework : 애플리케이션 흐름의 주도권이 Framework에 있다.(IoC 제어의 역전)

  • Framework 내에서 지원하는 기능들인 메서드를 통해 코드상으로 보이지 않는 일들을 한다.

Spring Framework

Spring Framework는 Java기반의 웹 애플리케이션을 개발하는데에 필요한 Framework이자 Java 기반의 웹 애플리케이션을 개발하는데에 있어 표준이다.

한국에서 대부분의 기업들은 기업용 엔터프라이즈 시스템용 애플리케이션을 개발할 때 개발 생산성을 높이고 유지보수를 용이하게 하는데에 많은 초점을 두는데, Spring Framework는 개발 생산성 향상, 유지보수 용이 뿐만 아닌 그 이상의 것들을 가능하게 해준다.

Spring Framework 공부의 장점

  • 객체지향설계 원칙에 맞는 재사용과 확장이 가능한 애플리케이션 개발 스킬 향상
  • 더 좋은 성능과 서비스의 안전성이 필요한 기업용 엔터프라이즈 시스템을 제대로 구축

JSP (Java Server Page)

사용자에게 보여지는 클라이언트 (html, javascript)와 사용자의 요청을 처리하는 서버(Java)코드가 섞여있는 방식.

단점

  • 코드가 너무 길어 가독성이 떨어짐
  • 유지보수성이 굉장히 낮음 (최악에 가까움)
  • 프론트엔드, 백엔드 개발자간의 협업 효율성 떨어짐

Servlet

Servlet : 클라이언트 웹 요청 처리에 특화된 Java 클래스의 일종.
단, Spring을 사용한 웹 요청 처리에도 내부적으로 Servlet을 사용

  • Servlet을 위한 코드가 클라이언트 측 코드와 분리되어 별도의 Java클래스로 관리

단점

  • 코드가 여전히 길다. 가독성 떨어짐

Spring에서의 서블릿 클래스
Spring MVC방식의 코드에서는 눈에 보이지 않지만 클라이언트 요청에 담긴 데이터를 꺼내오고, 캐릭터셋을 지정해주는 작업들을 알아서 처리해준다.

단점

  • Spring 기반의 애플리케이션 기본 구조를 잡는 설정작업이 여전히 불편

위와 같은 모든 문제들을 개선한 Spring Boot!

Spring Boot

몇몇개의 기능을 더 추가하여도 코드의 길이는 변함없으며 구성이 깔끔해진다.

자바 서블릿

웹 컨테이너(서블릿 컨테이너)

아파치 톰캣

POJO (Plain Old Java Object)

POJO는 Spring에서 사용하는 핵심 개념들에 둘러싸인 모습.
즉, POJO는 Ioc/DI,AOP,PSA를 통해 달성할 수 있다.

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

POJO 프로그래밍 규칙
1. Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 X.
2. 특정 환경에 종속적이지 X.

POJO 프로그래밍 필요 이유

  • 특정 환경이나 기술에 종속적이지 않으며 재사용이 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
  • 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거함으로써 코드가 깔끔해진다.
  • 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
  • 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해진다.
  • 객체지향적인 설계를 제한없이 적용할 수 있다.

Spring은 POJO 프로그래밍을 지향하기위해 IoC/DI, AOP, PSA 세가지 기술을 지원한다.

객체지향 설계 원칙

SOLID 요약

IoC/DI (Inversion of Control)/(Dependency Injection)

IoC : 애플리케이션 흐름의 주도권을 Spring이 갖는다. 애플리케이션 흐름의 주도권이 뒤바뀐 것이 IoC.

일반적인 애플리케이션 제어흐름에는 main() 메서드가 있어야만 Java 애플리케이션이 작동되는데, 개발자는 main()메서드 안에 다른 객체의 메서드를 호출하거나 해서 개발자가 작성한 코드를 순차적으로 실행한다.
즉, 개발자에게 애플리케이션 흐름의 주도권이 있다는 것이다.

Java 웹 애플리케이션이 돌아갈때는 클라이언트가 외부에서 접속하는 서비스이기 때문에 main()메서드가 종료되면 안된다.
그런데 서블릿 컨테이너에는 서블릿 사양에 맞게 작성된 서블릿 클래스만 존재하고 main()은 존재하지 않는다.
대신 main()메서드처럼 애플리케이션이 시작되는 지점을 엔트리 포인트라고 부른다.
서블릿 컨테이너의 경우, 클라이언트의 요청이 들어올때마다 컨테이너 내 컨테이너 로직이(service() 메서드)이 서블릿을 직접 실행시켜주기 때문에 main()메서드는 필요없다.
이 경우 서블릿 컨테이너가 서블릿을 제어하고있기 때문에 애플리케이션의 주도권은 서블릿 컨테이너에 있다.

이것을 서블릿과 웹 애플리케이션 간에 IoC의 개념, 제어의 역전 개념이 적용되어있는것이다.
Spring에 IoC가 적용되는게 바로 DI이다.

DI : 의존성 주입, IoC개념을 구체화 시킨 것.
의존이란 객체간의 의존성을 말하는 것인데, 클래스끼리 사용하고자 하는 클래스의 객체를 생성해서 참조하게되면 의존관계가 성립한다.
생성자를 통해서 어떤 클래스의 객체를 전달받는것을 의존성 주입이라고 한다.

클래스의 생성자로 객체를 전달받는 코드가 있다면 객체를 외부에서 주입받고있다, 의존성 주입이 이뤄지고 있다.

의존성 주입이 필요한 이유?

의존성 주입, DI를 사용할 때 '현재의 클래스 내부에서 외부 클래스의 객체를 생성하기 위한 new키워드를 쓸지말지'의 여부를 결정해야한다.

객체생성시 new키워드를 사용하지만 Reflection기법을 통해 Runtime시에 객체를 동적으로 생성할 수 있는 방법도 있다.

new 키워드로 의존 객체를 생성하게 되면 클래스들간에 강하게 결합(Tight Coupling)되어있다고 한다.
의존성주입의 혜택을 보기 위해서는 강한 결합은 피하는게 좋다.
클래스들간의 관계를 느슨한 관계(Loose Coupling)로 만드는 것이 '인터페이스' 이다.
어떤 클래스가 인터페이스같이 일반화된 구성 요소에 의존하고 있을때 Loose Coupling이라고 한다.

Upcasting : 인터페이스 타입의 변수에 그 인터페이스의 구현 객체를 할당

stub : 메서드가 호출되면 미리 준비된 데이터를 응답, 즉 고정된 데이터. 몇번을 호출하더라도 같은 데이터 리턴.(멱등성)

AOP (Aspect Oriented Programming)

OOP : 객체 지향 프로그래밍
AOP : 관심 지향 프로그래밍
AOP에서의 관심은 애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심 관련.

애플리케이션 개발 전반에 걸쳐 공통적으로 사용되는 기능들을 공통 관심 사항(Cross-cutting concern).

비즈니스 로직, 애플리케이션의 주 목적을 달성하기 위한 핵심 로직에 대한 관심사를 핵심 관심 사항 (Core concern) .

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

트랜잭션(Transaction) : 데이터를 처리하는 하나의 작업단위. 커밋, 롤백 등의 기능이 있다.

AOP 장점

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

PSA(Portable Service Abstraction)

추상화(Abstraction) : 어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는것

Java의 코드로 추상화를 표현할 수 있는 대표적인 방법이 추상클래스와 인터페이스이다.

추상화 하는 이유?
클라이언트가 추상화된 상위 클래스를 일관되게 바라보며 하위클래스의 기능을 사용하는 것이 일관된 서비스 추상화(PSA)의 기본 개념.

코드 레벨에서의 클라이언트 : 어떤 클래스의 기능을 사용하는 측.

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

PSA 필요 이유?
어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함.

PSA는 애플리케이션의 요구사항 변경에 유연하게 대처 가능.

profile
좌충우돌 코린이 성장기

0개의 댓글