2주에 걸친 연휴가 끝났다. 한글날과 개천절 3일씩 2주간 놀기만 한 것 같다.
공부하기로 다짐했지만… 마지막 주말이라 생각해버리고
쉰 것 같다. 약간의 반성을하며

다시 일상으로 돌아와보려한다.












오늘은 대망의 Spring Framework를 배우는 단계이다.
스프링을 배우기위해서 Java문법 부터 웹관련 공부까지
거의 2달이라는 시간이 된 것 같다.

오늘부터 본격적으로 스프링 공부를 시작해보자!
우선 스프링을 이해하기전에

Framework와 Library의 차이를 알아보자


Framework vs Library

프레임워크와 라이브러리의 다른점을 알아보자
프레임워크는 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공한다.
라이브러리는 애플리케이션을 개발할 때 필요한 기능을
미리 구현해놓은 집합체라고 생각할 수 있다.
얼핏보면 비슷해보일 수 있다.

예를 들어 자동차라고 생각을하면
자동차 뼈대가 프레임워크
자동차를 만들기위한 부품이 라이브러리라고 생각하면
간단할 것 같다.

실제로 자동차의 뼈대를 바꾸는 건 힘든일이다.
만약 쉐보레의 ‘트레버스’라는 자동차의 뼈대가 나왔는데
그걸 엎고 다른 자동차를 만든다는 것은 새로운 모델을 만드는 것과 같기때문이다.
근데 부품은 쉽게 교체가 가능하면 필요할때 선택적으로 사용할 수 있다.
이말을 애플리케이션에 대한 제어권차이가 있다고 표현할 수 있다.

프레임워크 = 애플케이션 흐름의 주도권이 프레임 워크에 있다.
라이브러리 = 애플리케이션 흐름의 주도권이 개발자에게 있다.


Spring Framwork

웹 어플리케이션을 개발하기 위한 프레임 워크들 중 하나이다.
Django, Express, Flask, Lalavel 등 다양한 프레임워크들이 있고
우리는 그 중 가장 많이 사용하고 있는 스프링 프레임워크에 대해
공부하는 것이다. 우리는 스프링 프레임 워크를 배우므로
객체 지향 설계 원칙에 잘 맞는 재사용과 확장이 가능한 애플리케이션 개발
스킬을 향상시킬 수 있다는 것과 보다 나은 성능과 서비스의 안정성이
필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축할 수 있는 능력을 기를 수 있다.


스프링 프레임워크의 장점

  1. POJO 기반의 구성
  2. DI 지원
  3. AOP 지원
  4. Java 언어를 사용함으로써 얻는 장점

Plain Old Java Object

POJO라고 하며
Java로 생성하는 순수한 객체라는 직역의미를 가진다.
객체 지향적 프로그래밍 관점에서 더 깊은 의미가 있다.

  1. Java나 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야한다.
    -> 즉, Java 언어외에 특정한 기술에 종속되어 있지 않은 순수한 객체를 뜻함

  2. 특정 환경에 종속적이지 않아야한다.
    -> 위의 말과 비슷하다. 우리는 Spring을 학습할때 서블릿 컨테이너로 Tomcat을 사용하는데
    Tomcat이 지원하는 API를 가져다썼을 경우 다른 서블릿 컨테이너로 변경할게 될 경우
    해당 API를 걷어내고 변경된 서블릿 컨테이너의 API로 교체해줘야하는 상황이생긴다.





















POJO는 IoC/DI, AOP, PSA 기술을 지원한다.
자세한 내용은 이후에 학습하고 간단하게만 살펴보자.


IoC

Inversion of Contol의 약자이며, 제어의 역전이라 직역한다.
애플리케이션 흐름의 주도권을 Spring이 가진다라는 의미다.
즉, 애플리케이션 흐름의 주도권이 뒤바뀐 것을 IoC라고 한다.

예를 들어

public class test {
    public static void main(String[] args) {
        System.out.println("babo");
    }
}

우리는 메인 메서드를 통해서 프로그램을 샐행시키고
출력문을 출력해준다. 이런 경우에는 코드흐름이
개발자가 작성한 코드를 순차적으로 실행하게 되는 일반적인 흐름인데,
제어의 역전은 내가 호출하는 것이아니라
프레임 워크가 개발자가 작성한 코드를 대신 호출해주는 개념이다.

즉, 구현 객체는 자신의 로직을 실행하는 역할만 담당하게 된다.
이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아니라
외부에서 관리하는 것이 IoC라고 한다.


DI

Dependency Injection의 약자며, 의존성 주입이라고 직역한다
의존성 주입은 IoC 개념을 조금 구체화 시킨 거라고 생각하면 간단하다.
애플리케이션 실행 시점(런타임)에 외부에서
실제 구현 객체를 생성하고 클라이언트에 전당해서 클라이언트와 서버의 실제
의존관계가 연결 되는 것을 의존성 주입이라고 한다.

의존 관계는 상속과 같은 형태에서 찾아 볼 수 있다.
A라는 인터페이스에 B라는 클래스가 의존해서 사용한다. 라고 할 수 도 있고
하나의 클래스가 다른 클래스의 내용을 참조할 때도 의존 관계라고 한다.

public class MemberserviceImpl implements MemberService{
    //private final MemberRepositroy memberRepositroy = new MemoryMemberRepository();
    private final MemberRepositroy memberRepositroy;
    public MemberserviceImpl(MemberRepositroy memberRepositroy) {
        this.memberRepositroy = memberRepositroy;
    }
}
public class AppConfig {
    //생성자 주입
    public MemberService memberService(){
        return new MemberserviceImpl(memberRepository());
    }
}

위와 같은 예제로 설명하면 의존성 주입을 받은 경우다.
viceImpl이라는 클래스의 생성자로 memberRepository();를 전달하고 있다.
생성자 파라미터로 객체를 전달하는 것을 외부에서 객체를 주입한다고 한다.

이것을 의존성 주입이다.
필드주입, Setter 주입등 있지만
가장 많이사용하는 방법이 생성자 주입이고
클래스의 생성자로 객체를 전달 받는 코드가 있다면

아~ 객체를 외부에서 주입받고 있구나, 즉 의존성 주입되고 있구나라고 생각하면 된다.

강한 결합 : new 키워드를 사용해서 의존 객체를 생성할때, 클래스간에 강한 결합이 되어있다고 한다..
느슨한 결합 : 어떤 클래스가 인터페이스 같이 일반화 된 구성 요소를 의존하고 있을때
클래스 간에 느슨한 결합이 되어있다고 한다.


AOP

Aspect Oriented Programming의 약자이고, 관심 지향 프로그래밍이라고 한다.
크게 두가지로 나뉠 수 있다.

애플리케이션에 필요한 기능 중에서 공통적으로
적용되는 공통기능들을 공통 관심사항(Cross-cutting concern)이라하고
비지니스 로직, 애플리케이션의 주목적을 달성하기 위한 핵심 로직에
대한 관심사를 핵심 관심 사항(Core concern)이라고한다.

예를 들어 모든 메서드의
시간을 측정하는 기능을 추가한다고 가정할때
1000개의 메서드의 시간 기능을 추가하기 위해서
시간 측정로직을 1000개를 넣는건 무리가 있다.

공통 관심사항인 시간 측정의 기능을 AOP 기술을 적용해 해결이 가능하다.

AOP 가 필요한 이유
1). 코드의 간결성 유지
2). 객체 지향 설계 웍칙에 맞는 코드 구현
3). 코드의 재사용


PSA

Portable Service Abstraction의 약자이고, 서비스에 적용하는
일관된 서비스 추상화 기법이라고한다.

서비스의 기능을 접근하는 방식 자체를
일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것이다.
PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한
접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는
기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다.

즉, 요구사항 변경에 유연하게 대처할 수 있다.


하나하나 이해하려고하면
이해가되는데 어떻게 활용을해야하는지?
아직 잘 이해가 안된 것 같은 느낌이 든다.
텍스트만 보았을때는 아~ 그렇구나하는데

코드를 보면 이게 뭐였지…?
라는 개념만 둥둥 떠다니게 된다….

아마 스프링을 배우는 내내 그럴 것 같다는 생각이 들긴하지만
조급하지 않고 천천히 이해해보려고 노력해야겠다.


오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 간장계란밥