코드스테이츠 백엔드 부트캠프 34, 35일차 - [Spring Core] Spring Framework 기본

wish17·2023년 2월 1일
0
post-thumbnail

Daily Coding 14번

수를 요소로 갖는 배열을 입력받아 각 요소들이 그 이전의 요소들의 합보다 큰지 boolean 타입으로 리턴하라.

  • 모든 요소에서 이전 요소의 합보다 커야지 true 한번이라도 합보다 작은 요소가 있으면 false 출력
package CodeStatesAlgorithms;

public class SuperIncreasing {
    public boolean superIncreasing(int[] arr) {
        int sum =arr[0];
        for(int i=1; i<arr.length; i++){
            if(arr[i]<=sum) return false;
            sum += arr[i];
        }
        return true;
    }
}

//입력
superIncreasing.superIncreasing(new int[] {1, 2, 4, 8, 15})

//출력
false

Daily Coding - 15번

/, % 연산자 사용하지 않고 num1을 num2로 나눈 나머지 구하기

public class Division {
    public Integer modulo(int num1, int num2) { // 연산자 /, %를 사용하지 않고 num1을 num2로 나눈 나머지 구하기
        if(num2 == 0) return null;
        int result = num1;

        while(result>=num2){
            result -= num2;
        }

        return result;
    }
}

Section2 - [Spring Core] Spring Framework 기본

Framework란?

소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것

(프로그래밍을 하기 위한 틀이나 구조를 제공하는 것)
ex. 인터페이스(Interface), 추상클래스, Collections Framework

Framework 사용시 생기는 장단점

장점

  • 효율적으로 코드 작성 가능
    • 밑바닥부터 할 필요 x 핵심 로직을 개발하는 것에 집중 가능
  • 정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있다.
    • Framework의 규약에 맞게 코드를 작성하기 때문에 유지보수 편리함.

단점

  • 내가 사용하고자 하는 Framework에 대한 학습이 필요
    • Framework에서 정하는 규약들을 학습해야 함
  • 자유롭고 유연한 개발이 어렵다.
    • 정해져 있는 Framework에 규약을 벗어나기가 어렵다.

Framework와 Library의 차이

Library

애플리케이션을 개발하는 데 사용되는 일련의 데이터 및 프로그래밍 코드
(애플리케이션을 개발할 때 필요한 기능을 미리 구현해놓은 집합체)

  • 한번 정해진 Framework를 교체하는일은 어렵지만, Library는 쉽게 교체가 가능하며 필요한 Library들을 선택적으로 사용할 수 있다.
    => 애플리케이션에 대한 제어권의 차이가 있다.

    • Library = 애플리케이션 흐름의 주도권이 개발자에게 있다.
    • Framework = 애플리케이션 흐름의 주도권이 Framework에 있다.
      • => IoC(Inversion Of Control, 제어의 역전)

미리 작성해둔 것을 사용하는 점에서 Framework와 Library가 비슷한 것이 아닌가 하는 의문이 생길 수 있지만 Framework(틀)에 사용자가 코드를 작성하는 것(미리 짜둔 틀에 맞춰 살을 붙여 완성 시키는 것)과 코드를 작성하기 위해 Library(미리 만들어 둔 도구)를 사용하는 것은 다른 것 이다.

Spring Framework란?

웹 애플리케이션을 개발하기 위한 여러 Framework들 중에 하나

Spring Framework 장점

  1. POJO(Plan Old Java Object)기반의 구성
  2. DI(Dependency Injection) 지원
  3. AOP(Aspect Oriented Programming, 관점지향 프로그래밍) 지원
  4. Java 언어를 사용함으로써 얻는 장점

1,2,3번 장점의 경우 링크 참조(아래서 추가 설명)

4번 장점 추가 설명

  • 런타임 오류를 사전에 방지
    • 정적 타입 언어로서 변수의 타입, 메서드의 입력과 출력이 어떤 타입을 가져야 하는지를 강제해 유지보수 과정에서 실수를 방지할 수 있다.

Spring Framework을 학습함으로써 얻을 수 있는 2가지

  • 객체 지향 설계 원칙에 잘 맞는 스킬을 향상시킬 수 있다.

    • 재사용과 확장이 가능한 애플리케이션 개발 스킬 향상 가능
  • 보다 나은 성능과 서비스의 안전성이 필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축하기 위한 능력을 기를 수 있다.


Spring Framework의 특징

Spring 삼각형

POJO라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미

POJO(Plain Old Java Object)

Java로 생성하는 순수한 객체를 의미
[ JO(Java Object) = 객체지향이라는 의미 ]

POJO 프로그래밍 = 순수 Java 객체가 다른 기술이나 환경에 종속되지 않도록 하기 위한 프로그래밍 기법

POJO 프로그래밍으로 작성한 코드의 조건

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

    • 특정 기술을 상속 해서 코드를 작성하게 되면 나중에 애플리케이션의 요구사항이 변경되서 다른 기술로 변경하려할 때 특정 기술을 명시적으로 사용했던 부분을 전부 다 일일이 제거하거나 수정해야 한다.
    • 상위 클래스를 상속받아서 하위 클래스를 확장하는 객체지향 설계 기법을 적용하기 어려워질 수 있다. (자바는 다중 상속 안되기 때문)
  • 특정 환경에 종속적이지 않아야 한다.

    • ex) 서블릿 컨테이너(Servlet Container) 종류를 갑자기 바꿔야 하는 상황이 생기면 애플리케이션 전부를 뜯어 고쳐야할 수 있다.

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

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

POJO와 Spring Framework의 관계

  • Spring은 POJO 프로그래밍을 지향하는 Framework다.
  • IoC/DI, AOP, PSA는 다른 환경이나 기술에 종속적이지 않도록 하기 위한 기술이다.

IoC(Inversion of Control)

애플리케이션 흐름의 주도권이 뒤바뀐 것

  • 애플리케이션 흐름의 주도권이 사용자에게 있지 않고, Framework이나 서블릿 컨테이너 등 외부에 있는 것

DI(Dependency Injection)

의존성 주입
(IoC 개념을 조금 구체화 시킨 것)

  • 객체 간의 관계를 느슨하게 해준다.
  • 클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립한다.

  • 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어 지고 있는 것이다.

public static void main(String[] args) {
    MenuService AAA = new MenuService();
    MenuControl menuControl = new MenuControl(AAA);
}
// MenuControl class가 MenuService class에 의존하도록 함.   

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

  • 위와 같이 new 키워드를 사용하여 객체를 생성할 때, 클래스 간에 강하게 결합(Tight Coupling)되어 있다고 한다.

  • 어떤 클래스가 인터페이스 같이 일반화 된 구성 요소에 의존하고 있을 때, 클래스들 간에 느슨하게 결합(Loose Coupling)되어 있다고 한다.
    여기까지 java만으로도 가능

  • 객체들 간의 느슨한 결합은 요구 사항의 변경에 유연하게 대처할 수 있도록 해준다.

애플리케이션 코드 내부에서 직접적으로 new 키워드를 사용할 경우 객체지향 설계의 관점에서 문제가 발생할 수 있기 때문에 new 키워드 사용하지 않으며 의존성 주입을 하도록 지양해야 한다.
(cf. spring 기능 중 하나인 Config 클래스를 이용해 위 조건을 만족하며 DI 가능.)

의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.

  • Spring에서는 애플리케이션 코드에서 이루어지는 의존성 주입(DI)을 Spring에서 대신 해준다.

Q: 학습자료 내용 중 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다.가 이해가 되지 않습니다. 강한 결합 상태로도 의존성 주입이 가능하지 않나요?
(ex. new 두번 써서 클래스에 클래스 넣기)

new를 사용하는 등 방법으로 강한 결합 상태로도 의존성 주입이 가능하지만 애플리케이션 코드 내부에서 직접적으로 new 키워드를 사용할 경우 객체지향 설계의 관점에서 문제가 발생할 수 있기 때문에 new 키워드를 사용하지 않으며 느슨한 결합 상태로 의존성 주입을 하도록 지향해야 한다. 라고 이해 했는데 잘못된 이해일까요?

A: 이해한게 맞다. 그런데 아래 내용을 추가해주면 더 좋은 정리가 될 것 같다.

  • 느슨한 결합의 핵심 = 외부에서 주입되는 객체가 뭐가 되든지 모르고 동작하는데 문제가 없어야 한다.

AOP(Aspect Oriented Programming)

[ 관심 지향 프로그래밍 ]
애플리케이션의 핵심 업무 로직과 공통 기능 로직들을 분리하는 기능

  • 핵심 관심 사항(Core concern)
    • 애플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심사
  • 공통 관심 사항(Cross-cutting concern) = 부가적인 관심 사항
    • 애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들
    • 로깅이나 보안, 트랜잭션 같은 것

애플리케이션의 핵심 로직에서 공통 기능을 분리하는 이유

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

PSA(Portable Service Abstraction)

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

PSA(일관된 서비스 추상화)가 필요한 이유

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

Spring Framework 모듈 구성

아키텍처

건축 분야에서 유래된 용어로써 요구 사항을 만족하는 건축물을 짓는데 있어 청사진 같은 역할

  • 컨셉 잡기 정도
  • 너무 복잡하면 안됨 (최대한 심플함을 유지)

시스템 아키텍처

하드웨어와 소프트웨어를 모두 포함하는 어떤 시스템의 전체적인 구성을 큰그림으로 표현한 것

계층형 아키텍처(N-티어)

  • API 계층(API Layer)

    • 클라이언트의 요청을 받아들이는 계층
  • 서비스 계층(Service Layer)

    • API 계층에서 전달 받은 요청을 업무 도메인의 요구 사항에 맞게 비즈니스적으로 처리하는 계층
  • 데이터 액세스 계층(Data Access Layer)

    • 비즈니스 계층에서 처리된 데이터를 데이터베이스 등의 데이터 저장소에 저장하기 위한 계층

Spring Framework 모듈 구성

Spring Framework에서는 약 20여개의 모듈을 통해 다양한 기능들을 제공한다.


Spring Boot

Spring 설정의 복잡함이라는 문제점을 해결하기 위해 생겨난 Spring Project 중 하나

Spring Boot을 사용 하는 이유

  • XML 기반의 복잡한 설계 방식을 지양한다.

  • starter 모듈 구성 기능을 통해 의존 라이브러리를 자동으로 구성해준다.

  • 애플리케이션 설정의 자동 구성

  • 프로덕션급 애플리케이션의 빌드를 손쉽게 할 수 있다.

  • 내장된 WAS를 사용가능하기 때문에 배포가 용이하다.

Spring Boot의 핵심 컨셉

  • Spring 구성은 Spring에게 맡겨버리고 비즈니스 로직에만 집중할 수 있다.

0개의 댓글