Today I learned (Spring Boot, JS 기본)


Spring 이전

  • EJB라는 기술이 사용됨.
  • EJB의 엔티티빈이란 기술은 현제 Hibernate -> JPA로 옮겨옴.
  • EJB의 서버 기능은 Spring Boot의 기능으로 옮겨옴.

JPA

  • 표준 인터페이스 구현으로 Hibernate나 다른 구현체들이 모두 따르기에 다양한 기술들을 접목시킬 수 있음.

역사

  • 2003 : 스프링 프레임워크 1.0 - XML
  • 2006 : 스프링 프레임워크 2.0 - XML 편의 기능 제공
  • 2014 : 스프링 부트 1.0 출시

스프링 내부

  • Spring Session : 세션 기능
  • Spring Security : 보안 기능
  • Rest Docs : API 문서 제작
  • Batch : 배치 기술
  • Cloud : 클라우드 기술 특화

스프링 부트

  • 스프링 설정 간략화 버전
  • 단독 실행 가능한 애플리케이션 생성
  • Tomcat 내장
  • 빌드 구성을 위한 starter 제공
  • 라이브러리 자동 구성

왜 사용하는 가

  • Java, Kotlin이란 객체 지향 언어를 완벽히 지원
  • 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

좋은 객체 지향 특징

  • 객체 지향은 여러 개의 독립된 객체들의 모임으로 프로그래밍을 하는 것을 의미
  • 객체는 메시지를 주고 받아 데이터를 처리 할 수 있어야 한다.

다형성

  • 자동차가 변경되어도, 운전자는 차량을 운전할 수 있어야 하듯이, 클라이언트는 내부 구조를 몰라도 애플리케이션을 사용 가능해야한다. 유연 변경 용이
  • 역할과 구현으로 구분하여 프로그램을 작성하여야 한다.
  • 인터페이스 = 역할
  • 인터페이스 구현한 클래스, 객체 = 구현

스프링과 객체 지향

  • 다형성의 중요성
  • 제어의 역전, 의존관계 주입은 다형성 활용의 연장선이다.

SOLID

  • SRP: Single Responsibility Principle
    • 한 클래스는 하나의 책임을 가진다
    • 기준은 변경이다. 변경이 있을 때 파급력이 적으면 단일 책임을 가지고 있는 것
  • OCP: Open/Closed Principle
    • 확장에는 열려야하나, 변경에는 닫혀야 한다.
    • 다형성을 활용, 인터페이스를 구현해 새로운 클래스를 만들어 확장에 용이
    • 하지만 인터페이스 자체의 변경은 최대한 자제
  • LSP: Liskov Substitution Principle
    • 객체는 역할을 지키면서 하위타입의 인스턴스로 바꿀 수 있어야 한다.
    • 자동차 인터페이스의 엑셀은 앞으로 가야한다. 뒤로 가게 하면 LSP를 위반한다.
  • ISP: Interface Segregation Principle
    • 자동차 인터페이스 -> 정비 인터페이스, 운전 인터페이스 분리
    • 인터페이스의 역할을 명확히 하여 분리하라
  • Dependency Inversion Principle
    • 추상화에 의존, 인터페이스에 의존하라
    • 역할에 의존하게 되어야지, 구현체에 의존하여선 안된다.
    • 의존 = 코드에 대한 이해

기본적으로는 코드를 구현체에서 변경하게 되는 데 OCP와 DIP를 위반한다.

React Spread 연산자, Rest 매개변수

let arr1 = [1, 2, 3];
let arr2 = [4, ...arr1, 2, 3]; // Spread 연산자가 모든 프로퍼티를 흩뿌려놓는다.

Rest 매개변수

// 인수들이 전부 rest란 변수에 저장됨.
function funcA(...rest) {
  console.log(rest);
}

// 첫 인수, 두번째 인수를 제외한 변수들이 모두 rest란 변수에 저장됨.
function funcA(a, b, ...rest) {
  console.log(rest);
}

원시타입 vs 객체 타입

코드에서 원시타입 let p1 = 1;란 코드가 있다면 메모리 공간에 1이란 값을 저장한다. 저장 시, let p2 = p1;이면 p1과 p2는 모두 1이란 메모리 공간을 가르키게 된다. 메모리 데이터를 한 번 저장하면 불변으로 저장된다.

객체 타입은 메모리 공간 A에 참조값(주소)를 저장, 메모리 공간 B에 실제 값을 저장한다. 만약 가르키는 참조 변수가 데이터를 수정하게 되면, 객체타입에 저장된 데이터 또한 변경된다. 가변값이라고 부른다.

얕은 복사

let o1 = { name: 'Kevin' };
let o2 = o1;

데이터 주소만 복사

깊은 복사

let o1 = { name: 'Kevin' };
let o2 = { ...o1 };

데이터 프로퍼티 하나하나 따로 복사

객체간 비교 연산

  • ===는 객체의 참조값

  • ==는 객체의 값 비교

  • ===는 얕은 비교

  • JSON.stringify(o1) === JSON.stringify(o2);는 문자 불변값을 통한 깊은 비교

객체 순회

  1. for (let item of arr)
  2. let keys = Object.keys(obj1); for (let key of keys){}
  3. let values = Object.values(obj1); for (let value of values){}
  4. for (let key in ojb1){}