1. 왜 리액티브 스프링인가?

리액티브(반응형)이 필요한 이유

  • 증가하는 요청, 부하에 대해서 높은 응답성을 유지해야 한다.
  • 메시지 기반 통신을 바탕으로 탄력성복원력을 확보하하여 높은 응답성을 추구한다.

탄력성

  • 자원을 비례적으로 추가하거나 제거하여 시스템의 처리량의 자동으로 증감 하는 것

복원력

  • 시스템의 실패에도 반응성을 유지하는 것
  • 시스템의 기능 요소를 격리해 모든 내부 장애를 격리하고 독립성을 확보함으로써 달성

메시지 기반 통신(Message-driven)

  • 제한된 리소스의 활용도를 높이기 위해서 비동기 논블로킹 모델을 사용해야 한다.
  • 메시지 브로커를 사용하면 대기열을 모니터링하여 시스템의 부하관리 및 탄력성을 제어할 수 있다.

리액티브 선언문(https://www.reactivemanifesto.org/ko/glossary)

카카오톡 오픈그래프 캐시 삭제 방법

블로그 대표 이미지를 변경했음에도 카카오톡에 공유 시 기존 이미지가 계속 나오는 문제가 있었다.

블로그 링크 이미지 변경 전

사이트의 소스코드의 태그를 확인해봐도, 오픈그래프 적용을 확인해볼수 있는 페이스북의 Sharing Debugger 사이트에서도 확인했을 때 문제가 없었으니

카카오에서 이미지 캐시가 문제라고 생각되서 구글링을 해봤고 역시 삭제하는 방법을 찾을 수 있었다.

삭제방법

  1. 카카오 개발자 사이트의 초기화 도구에서 OG(Open Graph) 캐시로 들어간다.

  2. 개발자 계정이 없다면 카카오 계정으로 간단하게 가입하고 있으면 로그인

  3. 삭제하려는 URL을 입력하고 초기화 한다.

og 캐시 초기화

이제 다시 카카오톡에 링크를 공유해보면 바뀐 이미지가 나오는걸 확인할 수 있다.

블로그 링크 이미지 변경 후


참고로 open graph 라는건 html 메타 태그의 종류 중 하나로 사용자가 링크를 sns의 입력창에 입력하면 크롤러가 미리 그 웹사이트를 방문해서 HTML head의 오픈그래프 메타 데이터를 긁어온다.

og:title, og:description, og:image 등 태그의 데이터를 바탕으로 미리보기 이미지와 설명을 만들어서 보여주게 된다.

Angular 개요

회사 프론트엔드가 Angular로 되어있는데 이쪽을 메인잡으로 일하진 않지만 프론트 개발자를 많이 채용해서 완전히 업무를 분리하기 전까지 이쪽도 어느정도 할줄 알아야 할거같아서 Angular에 대해서 공부하면서 간단히 정리해보자

Angular❓

Angular는 Google에서 만든 **SPA(Single Page Application)**방식의 프론트엔드 개발을 위한 자바스크립트 프레임워크 이다.

개발언어로 es6, Dart 등을 지원하기도 하지만 공식적으로 TypeScript를 권장하고 있다.

Angular 1.x 버전을 AngularJS, Angular 2 이상 버전을 Angular 라고 부른다.

AngularJS와 Angular는 하위 호환성이 없는 브레이킹 체인지를 다수 포함하여 큰 차이점이 많은데 몇가지 정리를 하자면

  • Controller$scope 기반에서 컴포넌트 기반 개발(CBD, Component Based Development)로 전환되었다.
  • 이전보다 향상된 모듈 시스템과 DOM 제어 기능을 제공하며 API가 단순화 되었다.
  • 주력 개발언어로 TypeScript를 도입하여 대규모 개발에 적합한 정적타입과 인터페이스, 제네릭 등 타입체크지원 기능을 제공한다.
  • ECMAScript6에서 새롭게 도입된 모듈, 클래스, ECMAScript7의 데코레이터를 지원한다.
  • 간단한 명령어로 개발환경을 지원하여 프로젝트 스케폴딩을 생성, 실행, 빌드할 수 있는 Angular CLI를 제공한다.

Angular 장점👍

  1. 컴포넌트 기반의 기능에 따라 코드분리와 재사용성이 쉬운 장점이 있다.
  2. SPA방식으로 다른 페이지로의 전환 속도가 빠르다.
  3. 프레임워크로서 개발에 필요한 대부분의 기능을 탑재하고 있다.

Angular 단점👎

  1. TypeScript를 주언어로 사용하여 이에 대한 학습이 필요하고 추가로 Angular의 여러 개념들과 기능들을 익혀야 하는만큼 학습량이 높은 편이다.
  2. 웹페이지가 모두 로딩된 이후 전환은 빠른편이지만 초기 로딩 시 느린 편이다.
  3. 검색엔진 최적화가 잘 되지 않아서 구글을 제외한 다른 사이트들에서 제대로 수집되지 않는 경우가 있다고 한다.

알고리즘 - 유클리드 호제법

유클리드 호제법(Euclidean algorithm)은 최대공약수, 최소공배수를 구하는 가장 대중적인 알고리즘으로

호제법이란 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다.

2개의 자연수 a,b에 대해서 a를 b로 나눈 나머지를 r이라고 한다면 (단, a>b)
a와 b의 최대공야수는 b와 r의 최대공약수와 같다.

이 성질에 따라, b를 r로 나눈 나머지 r’를 구하고, 다시 r을 r’로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.

이해하기 쉽게 예를 들어 108과 78의 최대공약수를 구해보면 아래와 같은 연산을 할 수 있다.

108 % 78 = 30 // 큰수를 작은수로 나누고 나머지를 구하기
78 % 30 = 18 // 위에서 나눈수(78)를 가져와 위의 나머지로 다시 나눠서 나머지 구하기
30 % 18 = 12 // 반복
18 % 12 = 6
12 % 6 = 0 // 나머지가 0이 되면 이때 나눈 수가 최대공약수(=6)

그렇다면 최소공배수는 어떻게 구할까?

최소공배수의 규칙에서 두 수 a,b가 있을 때 a * b = 최대공약수 * 최소공배수 라는 공식이 성립한다.

따라서 주어진 두수를 곱하고 최대공약수로 나눠준다면 그 수가 최소공배수가 될 것이다.

108 * 78 / 6 = 1404

이를 간단하게 코드로 구현해보면 다음과 같다.

기술면접 준비(Java)

내용은 기초적인 부분이지만 막상 면접 전에 한번이라도 정리하지 않으면 용어가 바로바로 안나오는 경우도 많기 때문에 간단하게나마 정리해 보았다.

OOP란

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것 입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있으며 대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.

직렬화(serialization)란?

객체 또는 데이터를 스트림을 통해 입출력하려면 바이트(byte)형태로 변환하는 것이 필요한데, 이를 직렬화 라고 합니다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 합니다.

박싱과 언박싱이란?

기본 자료형(Primitive data type)을 Wrapper class로 바꾸어 주는 것을 박싱, **Wrapper class를 기본 자료형(Primitive data type)**으로 바꿔주는 것을 언박싱 이라고 합니다.

Static에 대해서

  • static 키워드를 쓰면 객체를 생성하지 않아도 static 변수나 static 함수를 사용할 수 있습니다.
  • 인스턴스를 생성하면 각 인스턴스는 서로 독립적이기 때문에 서로 다른 값을 유지합니다.
  • 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙입니다.
  • static 이 붙은 메서드 에서는 인스턴스 변수를 사용할 수 없습니다.
  • 메서드 내에서 인스턴스 변수를 쓰지 않는다면 가능하면 static을 붙이는게 호출 시간이 짧아지기 때문에 효율이 높아집니다.
  • 클래스 설계시 static 사용 지침
    • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있으면 static 을 사용합니다.
    • 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드는 static 을 사용하는 것을 고려합니다.

접근 제어자에 대해서

  • public : 어디서든 접근 가능
  • protected : 동일 패키지 혹은 상속받은 외부 패키지 클래스에서 사용
  • (default) : 동일 패키지 내에서만 접근 가능
  • private : 해당 클래스 내에서만 접근 가능

String vs StringBuffer vs StringBuilder

  • String
    • immutable(불변)
    • 객체를 한 번 할당할시 메모리 공간에 변동이 없습니다.
    • 동기화를 신경쓰지 않아도 됩니다.
    • 엄청나게 많은 문자열을 선언 및 연산할 시 성능저하를 고려해야합니다.
  • StringBuffer
    • mutable(가변)
    • 멀티스레드 환경에서도 동기화를 지원(Thread-safe)
  • StringBuilder
    • mutable(가변)
    • 동기화를 지원하지 않습니다.
  • 정리하면 적은 양의 문자열의 선언 후 연산이 필요없다면 String을 사용하고 문자열의 선언이 많이 필요하거나 연산이 필요한데 싱글스레드 환경이라면 StringBuilder를, 멀티스레드 환경이라면 StringBuffer를 사용합니다.

Java8 특징은?

java에 함수형 프로그래밍이 처음으로 도입된 버전으로 새로 도입된 주요 기능으론Lamda 표현식, Stream API, Optional Class 같은 게 있습니다.

  • 람다(Lamda) 표현식

    • 익명함수로 이름과 식별자가 없는 함수를 말합니다. 불필요한 코드를 줄이고 가독성을 향상시키기 위함입니다.
    1
    2
    List<Integer> list = new ArrayList<>();
    list.forEach(num -> System.out.println("number : " + num));
  • StreamAPI

    • 람다식을 적용해서 컬렉션같은 데이터 처리연산을 하기 위한 api로 멀티 스레드를 활용해서 병렬로 연산을 수행할 수 있고, 원본 데이터를 변경하지 않는 특징이 있고 코드가 매우 간단해진다는 것을 알 수 있습니다.
  • Optional Class

    • util 패키지에 속하며 NullPointException을 관리하기 위해 null이 될 수 있는 객체를 감싸고 있는 래퍼 클래스입니다.
    • 명시적으로 해당 변수가 null일 수 있음을 표현하면서 null 체크를 직접하지 않아도 됩니다.
    • 아래는 일반적으로 많이 사용되는 optional 예제코드
    1
    2
    3
    4
    @Repository
    public interface UserRepository extends JpaRepository<UserEntity, Long> {
    Optional<UserEntity> findByName(String Name);
    }
    1
    2
    3
    String name = "jay";
    UserEntity optUserEntity = userRepository.findByName(name)
    .orElseThrow(() -> new EmptyDataException("해당 이름을 가진 유저가 없습니다."));

try-with-resource란?

try-with-resources는 java7 이후 추가되었으며 자동으로 자원을 해제해주는 기능입니다.
try 구문에 AutoCloseable 인터페이스를 구현하는 객체를 리소스로 선언하고 사용이 끝나면 자동으로 close 해주는 기능입니다.

1
2
3
4
5
6
try (Scanner scanner = new Scanner(new File("newFile.txt")))
{
System.out.println(scanner.nextLine());
} catch (FileNotFoundException e) {
e.printStackTrace();
}

오버로딩 오버라이딩 차이점은?

자바에서 다형성을 지원하는 방법으로 오버로딩과 오버라이딩이 있습니다.

(다형성(polymorphism) : 하나의 객체가 여러타입을 가지는 것)

  • 오버로딩(Overloading)은 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 작성하여 다양한 유형의 호출에 응답하도록 하는 것입니다.
    • 프로그램의 가독성 ⬆
  • 오버라이딩(Overriding)은 상위클래스가 가진 메소드를 자식클래스에서 재정의 하여 사용하는 것을 말합니다.
    • 하나의 코드로 여러 객체를 처리할 수 있는 장점이 있어서 사용
명칭 메소드명 매개변수 리턴타입
오버로딩 같음 다름 같아도되고 달라도됨
오버라이딩 같음 같음 같아야함

HashMap, LinkedHashMap, TreeMap 비교

  1. HashMap
    • 내부적으로 Entry의 array로 되어있고 해당 array에 index는 내부 해쉬 함수를 통해 계산합니다.
    • hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능을 가지고 있지만 내부 해시값에 따라서 키순서가 정해져서 특정 순서나 규칙없이 출력됩니다.
  2. LinkedHashMap
    • 내부적으로 LinkedList 형태로 저장되며 입력된 데이터의 순서를 유지할 수 있습니다.
    • HashMap과 기본적으로 기능은 동일하지만 순서를 유지하는 기능이 추가되면서 메모리 사용량이 더 높습니다.
  3. TreeMap
    • Key값에 따라서 자동으로 Sort가 되는 방식이며 동기화(synchronized) 처리가 되어있어 Thread-safe 합니다.
    • HashMap과 다르게 키값으로 null을 허용하지 않고 내부적으로 red black tree 구조로 데이터를 저장합니다.
      • red black tree 는 기존의 이진트리의 각 노드에 색깔을 저장하는 공간을 추가해서 색깔을 기준으로 균형을 맞추는 트리입니다.
    • 키값에 대한 Compartor(콤퍼레이터) 구현으로 정렬 순서를 변경할 수 있습니다.

정리하자면

  • 특별한 사유가 없다면 검색성능이 가장 좋은 HashMap 사용
  • 순서를 보장하고 싶다면 LinkedHashMap 사용
  • 키값을 일정하게 iterate 하고자한다면 TreeMap 사용

interface vs abstract

  • 공통점

    • 선언만 있고 구현 내용이 없습니다.
    • 스스로 객체를 생성할 수 없지만 추상클래스를 extends 받거나, interface를 implements한 자식들만 객체를 생성할 수 있습니다.
  • interface(인터페이스)

    • 다중 상속 가능
    • 추상 메서드, 상수만 선언 가능(java8부터 default메서드 사용 가능)
    • 생성자, 일반 변수를 가질 수 없음
    • 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우
    • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 구현되든지 상관없을 때
    • 다중상속을 허용하고 싶을 때
  • abstract(추상 클래스)

    • 다중 상속 불가
    • 추상 메서드 1개 이상, 일반 변수, 일반 메서드 선언 가능
    • 생성자, 일반 변수 가질 수 있음
    • 관련성이 높은 클래스간에 코드를 공유하고 싶은 경우
    • 상속받은 클래스들이 공통적으로 가지는 메서드와 필드가 많거나, public 이외의 접근제어자 사용이 필요한 경우 사용할 수 있습니다.

자바 메모리 구조

  • 메서드(Method) 영역
    클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보를 저장하며 static 변수, 전역변수 등이 저장된다.
    코드에서 사용되는 클래스들을 로더가 읽고 클래스 별로 분류해서 저장합니다.
  • 스택(Stack) 영역
    메서드가 실행되면 스택 영역에 메소드에 대한 영역이 1개 생기며 여기에 지역변수, 매개변수, 리턴값 등이 저장된다. LIFO(Last In First Out) 방식의 메모리입니다.
  • 힙(Heap) 영역
    new 연산자를 통해 생성된 객체와 배열의 인스턴스를 저장되고, 메모리는 가비지 컬렉터에 의해 관리됩니다.